├── .gitignore ├── LICENSE ├── README.md ├── counter.c ├── counter_bpfeb.go ├── counter_bpfel.go ├── go.mod ├── go.sum ├── include ├── Makefile ├── bpf │ ├── bpf_endian.h │ ├── bpf_helper_defs.h │ └── bpf_helpers.h └── linux │ ├── bpf.h │ ├── bpf_common.h │ ├── if_packet.h │ └── types.h └── main.go /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, Cloudflare. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 10 | 11 | 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. 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | How to ship BPF with your Go project 2 | === 3 | 4 | The information in this repository is out of date. Please check out the [cilium/ebpf examples](https://github.com/cilium/ebpf/tree/master/examples) instead. 5 | -------------------------------------------------------------------------------- /counter.c: -------------------------------------------------------------------------------- 1 | // +build ignore 2 | 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | struct 9 | { 10 | __uint(type, BPF_MAP_TYPE_ARRAY); 11 | __type(key, __u32); 12 | __type(value, __u64); 13 | __uint(max_entries, 1); 14 | } packets SEC(".maps"); 15 | 16 | SEC("socket") 17 | int count_packets(struct __sk_buff *skb) 18 | { 19 | if (skb->pkt_type != PACKET_OUTGOING) 20 | return 0; 21 | 22 | __u32 index = 0; 23 | __u64 *value = bpf_map_lookup_elem(&packets, &index); 24 | if (value) 25 | __sync_fetch_and_add(value, 1); 26 | 27 | return 0; 28 | } 29 | 30 | char _license[] SEC("license") = "BSD"; 31 | -------------------------------------------------------------------------------- /counter_bpfeb.go: -------------------------------------------------------------------------------- 1 | // Code generated by bpf2go; DO NOT EDIT. 2 | // +build armbe arm64be mips mips64 mips64p32 ppc64 s390 s390x sparc sparc64 3 | 4 | package main 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "io" 10 | 11 | "github.com/cilium/ebpf" 12 | ) 13 | 14 | type counterSpecs struct { 15 | ProgramCountPackets *ebpf.ProgramSpec `ebpf:"count_packets"` 16 | MapPackets *ebpf.MapSpec `ebpf:"packets"` 17 | } 18 | 19 | func newCounterSpecs() (*counterSpecs, error) { 20 | reader := bytes.NewReader(_CounterBytes) 21 | spec, err := ebpf.LoadCollectionSpecFromReader(reader) 22 | if err != nil { 23 | return nil, fmt.Errorf("can't load counter: %w", err) 24 | } 25 | 26 | specs := new(counterSpecs) 27 | if err := spec.Assign(specs); err != nil { 28 | return nil, fmt.Errorf("can't assign counter: %w", err) 29 | } 30 | 31 | return specs, nil 32 | } 33 | 34 | func (s *counterSpecs) CollectionSpec() *ebpf.CollectionSpec { 35 | return &ebpf.CollectionSpec{ 36 | Programs: map[string]*ebpf.ProgramSpec{ 37 | "count_packets": s.ProgramCountPackets, 38 | }, 39 | Maps: map[string]*ebpf.MapSpec{ 40 | "packets": s.MapPackets, 41 | }, 42 | } 43 | } 44 | 45 | func (s *counterSpecs) Load(opts *ebpf.CollectionOptions) (*counterObjects, error) { 46 | var objs counterObjects 47 | if err := s.CollectionSpec().LoadAndAssign(&objs, opts); err != nil { 48 | return nil, err 49 | } 50 | return &objs, nil 51 | } 52 | 53 | func (s *counterSpecs) Copy() *counterSpecs { 54 | return &counterSpecs{ 55 | ProgramCountPackets: s.ProgramCountPackets.Copy(), 56 | MapPackets: s.MapPackets.Copy(), 57 | } 58 | } 59 | 60 | type counterObjects struct { 61 | ProgramCountPackets *ebpf.Program `ebpf:"count_packets"` 62 | MapPackets *ebpf.Map `ebpf:"packets"` 63 | } 64 | 65 | func (o *counterObjects) Close() error { 66 | for _, closer := range []io.Closer{ 67 | o.ProgramCountPackets, 68 | o.MapPackets, 69 | } { 70 | if err := closer.Close(); err != nil { 71 | return err 72 | } 73 | } 74 | return nil 75 | } 76 | 77 | // Do not access this directly. 78 | var _CounterBytes = []byte("\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xf7\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x78\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x40\x00\x16\x00\x01\x61\x11\x00\x04\x00\x00\x00\x00\x55\x10\x00\x0a\x00\x00\x00\x04\xb7\x10\x00\x00\x00\x00\x00\x00\x63\xa1\xff\xfc\x00\x00\x00\x00\xbf\x2a\x00\x00\x00\x00\x00\x00\x07\x20\x00\x00\xff\xff\xff\xfc\x18\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x02\x00\x00\x00\x00\xb7\x10\x00\x00\x00\x00\x00\x01\xdb\x01\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x49\x54\x00\x00\x2e\x2f\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x2e\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x63\x68\x61\x72\x00\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\x00\x70\x61\x63\x6b\x65\x74\x73\x00\x74\x79\x70\x65\x00\x69\x6e\x74\x00\x6b\x65\x79\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x33\x32\x00\x76\x61\x6c\x75\x65\x00\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x36\x34\x00\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x00\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x73\x6b\x62\x00\x6c\x65\x6e\x00\x70\x6b\x74\x5f\x74\x79\x70\x65\x00\x6d\x61\x72\x6b\x00\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\x00\x70\x72\x6f\x74\x6f\x63\x6f\x6c\x00\x76\x6c\x61\x6e\x5f\x70\x72\x65\x73\x65\x6e\x74\x00\x76\x6c\x61\x6e\x5f\x74\x63\x69\x00\x76\x6c\x61\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x70\x72\x69\x6f\x72\x69\x74\x79\x00\x69\x6e\x67\x72\x65\x73\x73\x5f\x69\x66\x69\x6e\x64\x65\x78\x00\x69\x66\x69\x6e\x64\x65\x78\x00\x74\x63\x5f\x69\x6e\x64\x65\x78\x00\x63\x62\x00\x68\x61\x73\x68\x00\x74\x63\x5f\x63\x6c\x61\x73\x73\x69\x64\x00\x64\x61\x74\x61\x00\x64\x61\x74\x61\x5f\x65\x6e\x64\x00\x6e\x61\x70\x69\x5f\x69\x64\x00\x66\x61\x6d\x69\x6c\x79\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x34\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x34\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x36\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x36\x00\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x00\x6c\x6f\x63\x61\x6c\x5f\x70\x6f\x72\x74\x00\x64\x61\x74\x61\x5f\x6d\x65\x74\x61\x00\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x6e\x68\x6f\x66\x66\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\x00\x5f\x5f\x75\x31\x36\x00\x74\x68\x6f\x66\x66\x00\x61\x64\x64\x72\x5f\x70\x72\x6f\x74\x6f\x00\x69\x73\x5f\x66\x72\x61\x67\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x63\x68\x61\x72\x00\x5f\x5f\x75\x38\x00\x69\x73\x5f\x66\x69\x72\x73\x74\x5f\x66\x72\x61\x67\x00\x69\x73\x5f\x65\x6e\x63\x61\x70\x00\x69\x70\x5f\x70\x72\x6f\x74\x6f\x00\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x5f\x5f\x62\x65\x31\x36\x00\x73\x70\x6f\x72\x74\x00\x64\x70\x6f\x72\x74\x00\x69\x70\x76\x34\x5f\x73\x72\x63\x00\x5f\x5f\x62\x65\x33\x32\x00\x69\x70\x76\x34\x5f\x64\x73\x74\x00\x69\x70\x76\x36\x5f\x73\x72\x63\x00\x69\x70\x76\x36\x5f\x64\x73\x74\x00\x66\x6c\x61\x67\x73\x00\x66\x6c\x6f\x77\x5f\x6c\x61\x62\x65\x6c\x00\x62\x70\x66\x5f\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x74\x73\x74\x61\x6d\x70\x00\x77\x69\x72\x65\x5f\x6c\x65\x6e\x00\x67\x73\x6f\x5f\x73\x65\x67\x73\x00\x73\x6b\x00\x62\x6f\x75\x6e\x64\x5f\x64\x65\x76\x5f\x69\x66\x00\x73\x72\x63\x5f\x69\x70\x34\x00\x73\x72\x63\x5f\x69\x70\x36\x00\x73\x72\x63\x5f\x70\x6f\x72\x74\x00\x64\x73\x74\x5f\x70\x6f\x72\x74\x00\x64\x73\x74\x5f\x69\x70\x34\x00\x64\x73\x74\x5f\x69\x70\x36\x00\x73\x74\x61\x74\x65\x00\x62\x70\x66\x5f\x73\x6f\x63\x6b\x00\x5f\x5f\x73\x6b\x5f\x62\x75\x66\x66\x00\x69\x6e\x64\x65\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x01\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x30\x9f\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x60\x00\x02\x7a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x60\x00\x01\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x01\x25\x0e\x13\x05\x03\x0e\x10\x17\x1b\x0e\x11\x01\x12\x06\x00\x00\x02\x34\x00\x03\x0e\x49\x13\x3f\x19\x3a\x0b\x3b\x0b\x02\x18\x00\x00\x03\x01\x01\x49\x13\x00\x00\x04\x21\x00\x49\x13\x37\x0b\x00\x00\x05\x24\x00\x03\x0e\x3e\x0b\x0b\x0b\x00\x00\x06\x24\x00\x03\x0e\x0b\x0b\x3e\x0b\x00\x00\x07\x13\x01\x0b\x0b\x3a\x0b\x3b\x0b\x00\x00\x08\x0d\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x0b\x38\x0b\x00\x00\x09\x0f\x00\x49\x13\x00\x00\x0a\x16\x00\x49\x13\x03\x0e\x3a\x0b\x3b\x0b\x00\x00\x0b\x34\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x0b\x00\x00\x0c\x15\x01\x49\x13\x27\x19\x00\x00\x0d\x05\x00\x49\x13\x00\x00\x0e\x0f\x00\x00\x00\x0f\x26\x00\x00\x00\x10\x2e\x01\x11\x01\x12\x06\x40\x18\x97\x42\x19\x03\x0e\x3a\x0b\x3b\x0b\x27\x19\x49\x13\x3f\x19\x00\x00\x11\x05\x00\x02\x17\x03\x0e\x3a\x0b\x3b\x0b\x49\x13\x00\x00\x12\x34\x00\x02\x17\x03\x0e\x3a\x0b\x3b\x0b\x49\x13\x00\x00\x13\x13\x01\x03\x0e\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x14\x0d\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x05\x38\x0b\x00\x00\x15\x0d\x00\x49\x13\x3a\x0b\x3b\x05\x88\x01\x0f\x38\x0b\x00\x00\x16\x17\x01\x0b\x0b\x3a\x0b\x3b\x05\x88\x01\x0f\x00\x00\x17\x0d\x00\x49\x13\x3a\x0b\x3b\x05\x38\x0b\x00\x00\x18\x17\x01\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x19\x13\x01\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x00\x00\x00\x05\x3f\x00\x04\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x02\x00\x00\x00\x00\x00\x00\x00\x3f\x01\x1e\x09\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x4b\x04\x00\x00\x00\x52\x04\x00\x05\x00\x00\x00\x00\x06\x01\x06\x00\x00\x00\x00\x08\x07\x02\x00\x00\x00\x00\x00\x00\x00\x6e\x01\x0e\x09\x03\x00\x00\x00\x00\x00\x00\x00\x00\x07\x20\x01\x08\x08\x00\x00\x00\x00\x00\x00\x00\xa3\x01\x0a\x00\x08\x00\x00\x00\x00\x00\x00\x00\xbb\x01\x0b\x08\x08\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x0c\x10\x08\x00\x00\x00\x00\x00\x00\x00\xe9\x01\x0d\x18\x00\x09\x00\x00\x00\xa8\x03\x00\x00\x00\xb4\x04\x00\x00\x00\x52\x02\x00\x05\x00\x00\x00\x00\x05\x04\x09\x00\x00\x00\xc0\x0a\x00\x00\x00\xcb\x00\x00\x00\x00\x02\x0c\x05\x00\x00\x00\x00\x07\x04\x09\x00\x00\x00\xd7\x0a\x00\x00\x00\xe2\x00\x00\x00\x00\x02\x0d\x05\x00\x00\x00\x00\x07\x08\x09\x00\x00\x00\xee\x03\x00\x00\x00\xb4\x04\x00\x00\x00\x52\x01\x00\x0b\x00\x00\x00\x00\x00\x00\x01\x05\x03\x2a\x09\x00\x00\x01\x0a\x0c\x00\x00\x01\x1a\x0d\x00\x00\x01\x1a\x0d\x00\x00\x01\x1b\x00\x0e\x09\x00\x00\x01\x20\x0f\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x5a\x00\x00\x00\x00\x01\x11\x00\x00\x00\xb4\x11\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x00\x00\x01\x68\x12\x00\x00\x00\x23\x00\x00\x00\x00\x01\x16\x00\x00\x00\xc0\x12\x00\x00\x00\x5b\x00\x00\x00\x00\x01\x17\x00\x00\x00\xd2\x00\x09\x00\x00\x01\x6d\x13\x00\x00\x00\x00\xb0\x04\x0b\x9c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\x9d\x00\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\x9e\x04\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\x9f\x08\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa0\x0c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa1\x10\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa2\x14\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa3\x18\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa4\x1c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa5\x20\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa6\x24\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa7\x28\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xa8\x2c\x14\x00\x00\x00\x00\x00\x00\x03\x2c\x04\x0b\xa9\x30\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xaa\x44\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xab\x48\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xac\x4c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xad\x50\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xae\x54\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xb1\x58\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xb2\x5c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xb3\x60\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0b\xb4\x64\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0b\xb5\x74\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xb6\x84\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xb7\x88\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xba\x8c\x15\x00\x00\x02\xd2\x04\x0b\xbb\x08\x90\x16\x08\x04\x0b\xbb\x08\x14\x00\x00\x00\x00\x00\x00\x03\x44\x04\x0b\xbb\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\xd7\x04\x0b\xbc\x98\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xbd\xa0\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xbe\xa4\x15\x00\x00\x03\x17\x04\x0b\xbf\x08\xa8\x16\x08\x04\x0b\xbf\x08\x14\x00\x00\x00\x00\x00\x00\x04\x8a\x04\x0b\xbf\x00\x00\x00\x03\x00\x00\x00\xc0\x04\x00\x00\x00\x52\x05\x00\x03\x00\x00\x00\xc0\x04\x00\x00\x00\x52\x04\x00\x09\x00\x00\x03\x49\x13\x00\x00\x00\x00\x38\x04\x0d\xe0\x14\x00\x00\x00\x00\x00\x00\x04\x50\x04\x0d\xe1\x00\x14\x00\x00\x00\x00\x00\x00\x04\x50\x04\x0d\xe2\x02\x14\x00\x00\x00\x00\x00\x00\x04\x50\x04\x0d\xe3\x04\x14\x00\x00\x00\x00\x00\x00\x04\x62\x04\x0d\xe4\x06\x14\x00\x00\x00\x00\x00\x00\x04\x62\x04\x0d\xe5\x07\x14\x00\x00\x00\x00\x00\x00\x04\x62\x04\x0d\xe6\x08\x14\x00\x00\x00\x00\x00\x00\x04\x62\x04\x0d\xe7\x09\x14\x00\x00\x00\x00\x00\x00\x04\x74\x04\x0d\xe8\x0a\x14\x00\x00\x00\x00\x00\x00\x04\x74\x04\x0d\xe9\x0c\x14\x00\x00\x00\x00\x00\x00\x04\x74\x04\x0d\xea\x0e\x17\x00\x00\x03\xdd\x04\x0d\xeb\x10\x18\x20\x04\x0d\xeb\x17\x00\x00\x03\xeb\x04\x0d\xec\x00\x19\x04\x04\x0d\xec\x14\x00\x00\x00\x00\x00\x00\x04\x7f\x04\x0d\xed\x00\x14\x00\x00\x00\x00\x00\x00\x04\x7f\x04\x0d\xee\x02\x00\x17\x00\x00\x04\x14\x04\x0d\xf0\x00\x19\x20\x04\x0d\xf0\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0d\xf1\x00\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0d\xf2\x10\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0d\xf5\x30\x14\x00\x00\x00\x00\x00\x00\x04\x7f\x04\x0d\xf6\x34\x00\x0a\x00\x00\x04\x5b\x00\x00\x00\x00\x02\x0b\x05\x00\x00\x00\x00\x07\x02\x0a\x00\x00\x04\x6d\x00\x00\x00\x00\x02\x0a\x05\x00\x00\x00\x00\x08\x01\x0a\x00\x00\x04\x50\x00\x00\x00\x00\x02\x11\x0a\x00\x00\x04\x50\x00\x00\x00\x00\x02\x13\x09\x00\x00\x04\x8f\x13\x00\x00\x00\x00\x4c\x04\x0b\xf4\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xf5\x00\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xf6\x04\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xf7\x08\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xf8\x0c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xf9\x10\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xfa\x14\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xfc\x18\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0b\xfd\x1c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xfe\x2c\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0b\xff\x30\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0c\x00\x34\x14\x00\x00\x00\x00\x00\x00\x03\x38\x04\x0c\x01\x38\x14\x00\x00\x00\x00\x00\x00\x00\xc0\x04\x0c\x02\x48\x00\x00\xeb\x9f\x01\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x03\xa8\x00\x00\x03\xa8\x00\x00\x02\x85\x00\x00\x00\x00\x04\x00\x00\x04\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x40\x00\x00\x00\x0a\x00\x00\x00\x09\x00\x00\x00\x80\x00\x00\x00\x10\x00\x00\x00\x0c\x00\x00\x00\xc0\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x20\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x20\x01\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x20\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x34\x08\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x20\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x47\x08\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x4d\x01\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x40\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x64\x0e\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x6c\x04\x00\x00\x1f\x00\x00\x00\xb0\x00\x00\x00\x76\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x07\x00\x00\x00\x20\x00\x00\x00\x83\x00\x00\x00\x07\x00\x00\x00\x40\x00\x00\x00\x88\x00\x00\x00\x07\x00\x00\x00\x60\x00\x00\x00\x96\x00\x00\x00\x07\x00\x00\x00\x80\x00\x00\x00\x9f\x00\x00\x00\x07\x00\x00\x00\xa0\x00\x00\x00\xac\x00\x00\x00\x07\x00\x00\x00\xc0\x00\x00\x00\xb5\x00\x00\x00\x07\x00\x00\x00\xe0\x00\x00\x00\xc0\x00\x00\x00\x07\x00\x00\x01\x00\x00\x00\x00\xc9\x00\x00\x00\x07\x00\x00\x01\x20\x00\x00\x00\xd9\x00\x00\x00\x07\x00\x00\x01\x40\x00\x00\x00\xe1\x00\x00\x00\x07\x00\x00\x01\x60\x00\x00\x00\xea\x00\x00\x00\x11\x00\x00\x01\x80\x00\x00\x00\xed\x00\x00\x00\x07\x00\x00\x02\x20\x00\x00\x00\xf2\x00\x00\x00\x07\x00\x00\x02\x40\x00\x00\x00\xfd\x00\x00\x00\x07\x00\x00\x02\x60\x00\x00\x01\x02\x00\x00\x00\x07\x00\x00\x02\x80\x00\x00\x01\x0b\x00\x00\x00\x07\x00\x00\x02\xa0\x00\x00\x01\x13\x00\x00\x00\x07\x00\x00\x02\xc0\x00\x00\x01\x1a\x00\x00\x00\x07\x00\x00\x02\xe0\x00\x00\x01\x25\x00\x00\x00\x07\x00\x00\x03\x00\x00\x00\x01\x2f\x00\x00\x00\x12\x00\x00\x03\x20\x00\x00\x01\x3a\x00\x00\x00\x12\x00\x00\x03\xa0\x00\x00\x01\x44\x00\x00\x00\x07\x00\x00\x04\x20\x00\x00\x01\x50\x00\x00\x00\x07\x00\x00\x04\x40\x00\x00\x01\x5b\x00\x00\x00\x07\x00\x00\x04\x60\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x04\x80\x00\x00\x01\x65\x00\x00\x00\x0a\x00\x00\x04\xc0\x00\x00\x01\x6c\x00\x00\x00\x07\x00\x00\x05\x00\x00\x00\x01\x75\x00\x00\x00\x07\x00\x00\x05\x20\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x05\x40\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\x00\x01\x00\x00\x00\x08\x00\x00\x01\x7e\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x05\x00\x00\x01\x00\x00\x00\x08\x00\x00\x01\x88\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x0d\x00\x00\x01\x00\x00\x00\x03\x00\x00\x01\x8b\x00\x00\x00\x0f\x00\x00\x01\x8f\x0c\x00\x00\x01\x00\x00\x00\x17\x00\x00\x02\x52\x01\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x08\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x02\x57\x0e\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x01\x00\x00\x02\x60\x0f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x02\x66\x0f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x02\x6e\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x7c\x07\x00\x00\x00\x00\x00\x00\x00\x00\x74\x79\x70\x65\x00\x6b\x65\x79\x00\x76\x61\x6c\x75\x65\x00\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x00\x69\x6e\x74\x00\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\x00\x5f\x5f\x75\x33\x32\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x36\x34\x00\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x70\x61\x63\x6b\x65\x74\x73\x00\x5f\x5f\x73\x6b\x5f\x62\x75\x66\x66\x00\x6c\x65\x6e\x00\x70\x6b\x74\x5f\x74\x79\x70\x65\x00\x6d\x61\x72\x6b\x00\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\x00\x70\x72\x6f\x74\x6f\x63\x6f\x6c\x00\x76\x6c\x61\x6e\x5f\x70\x72\x65\x73\x65\x6e\x74\x00\x76\x6c\x61\x6e\x5f\x74\x63\x69\x00\x76\x6c\x61\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x70\x72\x69\x6f\x72\x69\x74\x79\x00\x69\x6e\x67\x72\x65\x73\x73\x5f\x69\x66\x69\x6e\x64\x65\x78\x00\x69\x66\x69\x6e\x64\x65\x78\x00\x74\x63\x5f\x69\x6e\x64\x65\x78\x00\x63\x62\x00\x68\x61\x73\x68\x00\x74\x63\x5f\x63\x6c\x61\x73\x73\x69\x64\x00\x64\x61\x74\x61\x00\x64\x61\x74\x61\x5f\x65\x6e\x64\x00\x6e\x61\x70\x69\x5f\x69\x64\x00\x66\x61\x6d\x69\x6c\x79\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x34\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x34\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x36\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x36\x00\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x00\x6c\x6f\x63\x61\x6c\x5f\x70\x6f\x72\x74\x00\x64\x61\x74\x61\x5f\x6d\x65\x74\x61\x00\x74\x73\x74\x61\x6d\x70\x00\x77\x69\x72\x65\x5f\x6c\x65\x6e\x00\x67\x73\x6f\x5f\x73\x65\x67\x73\x00\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x73\x6b\x00\x73\x6b\x62\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x73\x6f\x63\x6b\x65\x74\x00\x2e\x2f\x2e\x2f\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x09\x69\x66\x20\x28\x73\x6b\x62\x2d\x3e\x70\x6b\x74\x5f\x74\x79\x70\x65\x20\x21\x3d\x20\x50\x41\x43\x4b\x45\x54\x5f\x4f\x55\x54\x47\x4f\x49\x4e\x47\x29\x00\x09\x5f\x5f\x75\x33\x32\x20\x69\x6e\x64\x65\x78\x20\x3d\x20\x30\x3b\x00\x09\x5f\x5f\x75\x36\x34\x20\x2a\x76\x61\x6c\x75\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x61\x63\x6b\x65\x74\x73\x2c\x20\x26\x69\x6e\x64\x65\x78\x29\x3b\x00\x09\x69\x66\x20\x28\x76\x61\x6c\x75\x65\x29\x00\x09\x09\x5f\x5f\x73\x79\x6e\x63\x5f\x66\x65\x74\x63\x68\x5f\x61\x6e\x64\x5f\x61\x64\x64\x28\x76\x61\x6c\x75\x65\x2c\x20\x31\x29\x3b\x00\x7d\x00\x63\x68\x61\x72\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x2e\x6d\x61\x70\x73\x00\x6c\x69\x63\x65\x6e\x73\x65\x00\x62\x70\x66\x5f\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x62\x70\x66\x5f\x73\x6f\x63\x6b\x00\xeb\x9f\x01\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x8c\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x01\x9d\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x10\x00\x00\x01\x9d\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x01\xa4\x00\x00\x01\xb2\x00\x00\x4c\x0b\x00\x00\x00\x08\x00\x00\x01\xa4\x00\x00\x01\xb2\x00\x00\x4c\x06\x00\x00\x00\x18\x00\x00\x01\xa4\x00\x00\x01\xd9\x00\x00\x58\x08\x00\x00\x00\x28\x00\x00\x01\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x01\xa4\x00\x00\x01\xeb\x00\x00\x5c\x11\x00\x00\x00\x48\x00\x00\x01\xa4\x00\x00\x02\x22\x00\x00\x60\x06\x00\x00\x00\x58\x00\x00\x01\xa4\x00\x00\x02\x2e\x00\x00\x64\x03\x00\x00\x00\x60\x00\x00\x01\xa4\x00\x00\x02\x50\x00\x00\x70\x01\x00\x00\x00\x00\x00\x00\x00\x0c\xff\xff\xff\xff\x04\x00\x08\x00\x08\x7c\x0b\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\xae\x00\x04\x00\x00\x00\x6a\x08\x01\x01\xfb\x0e\x0d\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\x01\x2e\x00\x2e\x2f\x69\x6e\x63\x6c\x75\x64\x65\x2f\x6c\x69\x6e\x75\x78\x00\x2e\x2f\x69\x6e\x63\x6c\x75\x64\x65\x2f\x62\x70\x66\x00\x00\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x01\x00\x00\x74\x79\x70\x65\x73\x2e\x68\x00\x02\x00\x00\x62\x70\x66\x5f\x68\x65\x6c\x70\x65\x72\x5f\x64\x65\x66\x73\x2e\x68\x00\x03\x00\x00\x62\x70\x66\x2e\x68\x00\x02\x00\x00\x00\x00\x09\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x11\x01\x05\x0b\x0a\x13\x05\x06\x06\x20\x03\x6d\x20\x05\x08\x06\x03\x16\x20\x06\x03\x6a\x20\x05\x11\x06\x03\x17\x2e\x05\x06\x3d\x06\x03\x68\x20\x05\x03\x06\x03\x19\x20\x05\x01\x23\x02\x02\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x04\x00\xff\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x7a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x02\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x11\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x2d\x12\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x33\x11\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x5e\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x59\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x03\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x5b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x57\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x05\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x5c\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x06\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x07\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x08\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x5e\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x0b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x0e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x11\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x0d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x0c\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xdc\x00\x00\x00\x10\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x0f\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x12\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x22\x00\x00\x00\x57\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x30\x00\x00\x00\x13\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x3b\x00\x00\x00\x58\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x3f\x00\x00\x00\x14\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x4a\x00\x00\x00\x58\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x4e\x00\x00\x00\x55\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x59\x00\x00\x00\x58\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x5d\x00\x00\x00\x0e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x6e\x00\x00\x00\x54\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x77\x00\x00\x00\x15\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x84\x00\x00\x00\x16\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x91\x00\x00\x00\x17\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x9e\x00\x00\x00\x18\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xab\x00\x00\x00\x19\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xb8\x00\x00\x00\x1a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xc5\x00\x00\x00\x1b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xd2\x00\x00\x00\x1c\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xdf\x00\x00\x00\x1d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xec\x00\x00\x00\x1e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\xf9\x00\x00\x00\x1f\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x20\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x13\x00\x00\x00\x21\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x22\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x2d\x00\x00\x00\x23\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x3a\x00\x00\x00\x24\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x47\x00\x00\x00\x25\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x54\x00\x00\x00\x26\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x61\x00\x00\x00\x27\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x6e\x00\x00\x00\x28\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x7b\x00\x00\x00\x29\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x88\x00\x00\x00\x2a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\x95\x00\x00\x00\x2b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xa2\x00\x00\x00\x2c\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xaf\x00\x00\x00\x2d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xbc\x00\x00\x00\x2e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xd9\x00\x00\x00\x2f\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xe7\x00\x00\x00\x47\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x02\xf4\x00\x00\x00\x48\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x49\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x1e\x00\x00\x00\x4a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x4a\x00\x00\x00\x46\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x53\x00\x00\x00\x30\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x60\x00\x00\x00\x33\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x6d\x00\x00\x00\x34\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x7a\x00\x00\x00\x35\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x87\x00\x00\x00\x38\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x94\x00\x00\x00\x39\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xa1\x00\x00\x00\x3a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xae\x00\x00\x00\x3b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xbb\x00\x00\x00\x3d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xc8\x00\x00\x00\x3e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xf1\x00\x00\x00\x3f\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\xfe\x00\x00\x00\x41\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x1a\x00\x00\x00\x42\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x27\x00\x00\x00\x43\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x36\x00\x00\x00\x44\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x43\x00\x00\x00\x45\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x55\x00\x00\x00\x32\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x5c\x00\x00\x00\x31\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x67\x00\x00\x00\x37\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x6e\x00\x00\x00\x36\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x79\x00\x00\x00\x3c\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x84\x00\x00\x00\x40\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x90\x00\x00\x00\x53\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\x99\x00\x00\x00\x4b\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xa6\x00\x00\x00\x27\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xb3\x00\x00\x00\x09\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xc0\x00\x00\x00\x19\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xcd\x00\x00\x00\x17\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xda\x00\x00\x00\x1d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xe7\x00\x00\x00\x4c\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x04\xf4\x00\x00\x00\x4d\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x4e\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x05\x0e\x00\x00\x00\x4f\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x05\x1b\x00\x00\x00\x50\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x05\x28\x00\x00\x00\x51\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x05\x35\x00\x00\x00\x52\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x03\x88\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xa0\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x5a\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x57\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x57\x00\x00\x00\x01\x5d\x5e\x5c\x00\x2e\x64\x65\x62\x75\x67\x5f\x61\x62\x62\x72\x65\x76\x00\x2e\x74\x65\x78\x74\x00\x2e\x72\x65\x6c\x2e\x42\x54\x46\x2e\x65\x78\x74\x00\x2e\x72\x65\x6c\x73\x6f\x63\x6b\x65\x74\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x2e\x6d\x61\x70\x73\x00\x2e\x64\x65\x62\x75\x67\x5f\x73\x74\x72\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x69\x6e\x66\x6f\x00\x2e\x6c\x6c\x76\x6d\x5f\x61\x64\x64\x72\x73\x69\x67\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x6c\x69\x6e\x65\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x66\x72\x61\x6d\x65\x00\x2e\x64\x65\x62\x75\x67\x5f\x6c\x6f\x63\x00\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x2e\x73\x74\x72\x74\x61\x62\x00\x2e\x73\x79\x6d\x74\x61\x62\x00\x2e\x72\x65\x6c\x2e\x42\x54\x46\x00\x4c\x42\x42\x30\x5f\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\xab\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x88\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x3b\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x02\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x94\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xc1\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x3f\x00\x00\x00\x00\x00\x00\x01\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x74\x00\x00\x00\x00\x00\x00\x05\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x98\x00\x00\x00\x00\x00\x00\x06\x30\x00\x00\x00\x15\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\xbd\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\xb7\x00\x00\x00\x00\x00\x00\x06\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\xc8\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x15\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\xe8\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x15\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x87\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\xc0\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x78\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x15\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x77\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\xe8\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x98\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x5c\x6f\xff\x4c\x03\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\xa8\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\xa0\x00\x00\x00\x00\x00\x00\x08\xe8\x00\x00\x00\x01\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x18") 79 | -------------------------------------------------------------------------------- /counter_bpfel.go: -------------------------------------------------------------------------------- 1 | // Code generated by bpf2go; DO NOT EDIT. 2 | // +build 386 amd64 amd64p32 arm arm64 mipsle mips64le mips64p32le ppc64le 3 | 4 | package main 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "io" 10 | 11 | "github.com/cilium/ebpf" 12 | ) 13 | 14 | type counterSpecs struct { 15 | ProgramCountPackets *ebpf.ProgramSpec `ebpf:"count_packets"` 16 | MapPackets *ebpf.MapSpec `ebpf:"packets"` 17 | } 18 | 19 | func newCounterSpecs() (*counterSpecs, error) { 20 | reader := bytes.NewReader(_CounterBytes) 21 | spec, err := ebpf.LoadCollectionSpecFromReader(reader) 22 | if err != nil { 23 | return nil, fmt.Errorf("can't load counter: %w", err) 24 | } 25 | 26 | specs := new(counterSpecs) 27 | if err := spec.Assign(specs); err != nil { 28 | return nil, fmt.Errorf("can't assign counter: %w", err) 29 | } 30 | 31 | return specs, nil 32 | } 33 | 34 | func (s *counterSpecs) CollectionSpec() *ebpf.CollectionSpec { 35 | return &ebpf.CollectionSpec{ 36 | Programs: map[string]*ebpf.ProgramSpec{ 37 | "count_packets": s.ProgramCountPackets, 38 | }, 39 | Maps: map[string]*ebpf.MapSpec{ 40 | "packets": s.MapPackets, 41 | }, 42 | } 43 | } 44 | 45 | func (s *counterSpecs) Load(opts *ebpf.CollectionOptions) (*counterObjects, error) { 46 | var objs counterObjects 47 | if err := s.CollectionSpec().LoadAndAssign(&objs, opts); err != nil { 48 | return nil, err 49 | } 50 | return &objs, nil 51 | } 52 | 53 | func (s *counterSpecs) Copy() *counterSpecs { 54 | return &counterSpecs{ 55 | ProgramCountPackets: s.ProgramCountPackets.Copy(), 56 | MapPackets: s.MapPackets.Copy(), 57 | } 58 | } 59 | 60 | type counterObjects struct { 61 | ProgramCountPackets *ebpf.Program `ebpf:"count_packets"` 62 | MapPackets *ebpf.Map `ebpf:"packets"` 63 | } 64 | 65 | func (o *counterObjects) Close() error { 66 | for _, closer := range []io.Closer{ 67 | o.ProgramCountPackets, 68 | o.MapPackets, 69 | } { 70 | if err := closer.Close(); err != nil { 71 | return err 72 | } 73 | } 74 | return nil 75 | } 76 | 77 | // Do not access this directly. 78 | var _CounterBytes = []byte("\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xf7\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x40\x00\x16\x00\x01\x00\x61\x11\x04\x00\x00\x00\x00\x00\x55\x01\x0a\x00\x04\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x63\x1a\xfc\xff\x00\x00\x00\x00\xbf\xa2\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\xfc\xff\xff\xff\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x01\x00\x00\x00\x15\x00\x02\x00\x00\x00\x00\x00\xb7\x01\x00\x00\x01\x00\x00\x00\xdb\x10\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x49\x54\x00\x00\x2e\x2f\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x2e\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x63\x68\x61\x72\x00\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\x00\x70\x61\x63\x6b\x65\x74\x73\x00\x74\x79\x70\x65\x00\x69\x6e\x74\x00\x6b\x65\x79\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x33\x32\x00\x76\x61\x6c\x75\x65\x00\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x36\x34\x00\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x00\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x73\x6b\x62\x00\x6c\x65\x6e\x00\x70\x6b\x74\x5f\x74\x79\x70\x65\x00\x6d\x61\x72\x6b\x00\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\x00\x70\x72\x6f\x74\x6f\x63\x6f\x6c\x00\x76\x6c\x61\x6e\x5f\x70\x72\x65\x73\x65\x6e\x74\x00\x76\x6c\x61\x6e\x5f\x74\x63\x69\x00\x76\x6c\x61\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x70\x72\x69\x6f\x72\x69\x74\x79\x00\x69\x6e\x67\x72\x65\x73\x73\x5f\x69\x66\x69\x6e\x64\x65\x78\x00\x69\x66\x69\x6e\x64\x65\x78\x00\x74\x63\x5f\x69\x6e\x64\x65\x78\x00\x63\x62\x00\x68\x61\x73\x68\x00\x74\x63\x5f\x63\x6c\x61\x73\x73\x69\x64\x00\x64\x61\x74\x61\x00\x64\x61\x74\x61\x5f\x65\x6e\x64\x00\x6e\x61\x70\x69\x5f\x69\x64\x00\x66\x61\x6d\x69\x6c\x79\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x34\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x34\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x36\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x36\x00\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x00\x6c\x6f\x63\x61\x6c\x5f\x70\x6f\x72\x74\x00\x64\x61\x74\x61\x5f\x6d\x65\x74\x61\x00\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x6e\x68\x6f\x66\x66\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\x00\x5f\x5f\x75\x31\x36\x00\x74\x68\x6f\x66\x66\x00\x61\x64\x64\x72\x5f\x70\x72\x6f\x74\x6f\x00\x69\x73\x5f\x66\x72\x61\x67\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x63\x68\x61\x72\x00\x5f\x5f\x75\x38\x00\x69\x73\x5f\x66\x69\x72\x73\x74\x5f\x66\x72\x61\x67\x00\x69\x73\x5f\x65\x6e\x63\x61\x70\x00\x69\x70\x5f\x70\x72\x6f\x74\x6f\x00\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x5f\x5f\x62\x65\x31\x36\x00\x73\x70\x6f\x72\x74\x00\x64\x70\x6f\x72\x74\x00\x69\x70\x76\x34\x5f\x73\x72\x63\x00\x5f\x5f\x62\x65\x33\x32\x00\x69\x70\x76\x34\x5f\x64\x73\x74\x00\x69\x70\x76\x36\x5f\x73\x72\x63\x00\x69\x70\x76\x36\x5f\x64\x73\x74\x00\x66\x6c\x61\x67\x73\x00\x66\x6c\x6f\x77\x5f\x6c\x61\x62\x65\x6c\x00\x62\x70\x66\x5f\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x74\x73\x74\x61\x6d\x70\x00\x77\x69\x72\x65\x5f\x6c\x65\x6e\x00\x67\x73\x6f\x5f\x73\x65\x67\x73\x00\x73\x6b\x00\x62\x6f\x75\x6e\x64\x5f\x64\x65\x76\x5f\x69\x66\x00\x73\x72\x63\x5f\x69\x70\x34\x00\x73\x72\x63\x5f\x69\x70\x36\x00\x73\x72\x63\x5f\x70\x6f\x72\x74\x00\x64\x73\x74\x5f\x70\x6f\x72\x74\x00\x64\x73\x74\x5f\x69\x70\x34\x00\x64\x73\x74\x5f\x69\x70\x36\x00\x73\x74\x61\x74\x65\x00\x62\x70\x66\x5f\x73\x6f\x63\x6b\x00\x5f\x5f\x73\x6b\x5f\x62\x75\x66\x66\x00\x69\x6e\x64\x65\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x02\x00\x30\x9f\x20\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x02\x00\x7a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x01\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x01\x25\x0e\x13\x05\x03\x0e\x10\x17\x1b\x0e\x11\x01\x12\x06\x00\x00\x02\x34\x00\x03\x0e\x49\x13\x3f\x19\x3a\x0b\x3b\x0b\x02\x18\x00\x00\x03\x01\x01\x49\x13\x00\x00\x04\x21\x00\x49\x13\x37\x0b\x00\x00\x05\x24\x00\x03\x0e\x3e\x0b\x0b\x0b\x00\x00\x06\x24\x00\x03\x0e\x0b\x0b\x3e\x0b\x00\x00\x07\x13\x01\x0b\x0b\x3a\x0b\x3b\x0b\x00\x00\x08\x0d\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x0b\x38\x0b\x00\x00\x09\x0f\x00\x49\x13\x00\x00\x0a\x16\x00\x49\x13\x03\x0e\x3a\x0b\x3b\x0b\x00\x00\x0b\x34\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x0b\x00\x00\x0c\x15\x01\x49\x13\x27\x19\x00\x00\x0d\x05\x00\x49\x13\x00\x00\x0e\x0f\x00\x00\x00\x0f\x26\x00\x00\x00\x10\x2e\x01\x11\x01\x12\x06\x40\x18\x97\x42\x19\x03\x0e\x3a\x0b\x3b\x0b\x27\x19\x49\x13\x3f\x19\x00\x00\x11\x05\x00\x02\x17\x03\x0e\x3a\x0b\x3b\x0b\x49\x13\x00\x00\x12\x34\x00\x02\x17\x03\x0e\x3a\x0b\x3b\x0b\x49\x13\x00\x00\x13\x13\x01\x03\x0e\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x14\x0d\x00\x03\x0e\x49\x13\x3a\x0b\x3b\x05\x38\x0b\x00\x00\x15\x0d\x00\x49\x13\x3a\x0b\x3b\x05\x88\x01\x0f\x38\x0b\x00\x00\x16\x17\x01\x0b\x0b\x3a\x0b\x3b\x05\x88\x01\x0f\x00\x00\x17\x0d\x00\x49\x13\x3a\x0b\x3b\x05\x38\x0b\x00\x00\x18\x17\x01\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x19\x13\x01\x0b\x0b\x3a\x0b\x3b\x05\x00\x00\x00\x3f\x05\x00\x00\x04\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x02\x00\x00\x00\x00\x3f\x00\x00\x00\x01\x1e\x09\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x4b\x00\x00\x00\x04\x52\x00\x00\x00\x04\x00\x05\x00\x00\x00\x00\x06\x01\x06\x00\x00\x00\x00\x08\x07\x02\x00\x00\x00\x00\x6e\x00\x00\x00\x01\x0e\x09\x03\x00\x00\x00\x00\x00\x00\x00\x00\x07\x20\x01\x08\x08\x00\x00\x00\x00\xa3\x00\x00\x00\x01\x0a\x00\x08\x00\x00\x00\x00\xbb\x00\x00\x00\x01\x0b\x08\x08\x00\x00\x00\x00\xd2\x00\x00\x00\x01\x0c\x10\x08\x00\x00\x00\x00\xe9\x00\x00\x00\x01\x0d\x18\x00\x09\xa8\x00\x00\x00\x03\xb4\x00\x00\x00\x04\x52\x00\x00\x00\x02\x00\x05\x00\x00\x00\x00\x05\x04\x09\xc0\x00\x00\x00\x0a\xcb\x00\x00\x00\x00\x00\x00\x00\x02\x0c\x05\x00\x00\x00\x00\x07\x04\x09\xd7\x00\x00\x00\x0a\xe2\x00\x00\x00\x00\x00\x00\x00\x02\x0d\x05\x00\x00\x00\x00\x07\x08\x09\xee\x00\x00\x00\x03\xb4\x00\x00\x00\x04\x52\x00\x00\x00\x01\x00\x0b\x00\x00\x00\x00\x05\x01\x00\x00\x03\x2a\x09\x0a\x01\x00\x00\x0c\x1a\x01\x00\x00\x0d\x1a\x01\x00\x00\x0d\x1b\x01\x00\x00\x00\x0e\x09\x20\x01\x00\x00\x0f\x10\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x01\x5a\x00\x00\x00\x00\x01\x11\xb4\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x68\x01\x00\x00\x12\x23\x00\x00\x00\x00\x00\x00\x00\x01\x16\xc0\x00\x00\x00\x12\x5b\x00\x00\x00\x00\x00\x00\x00\x01\x17\xd2\x00\x00\x00\x00\x09\x6d\x01\x00\x00\x13\x00\x00\x00\x00\xb0\x04\x9c\x0b\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\x9d\x0b\x00\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\x9e\x0b\x04\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\x9f\x0b\x08\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa0\x0b\x0c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa1\x0b\x10\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa2\x0b\x14\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa3\x0b\x18\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa4\x0b\x1c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa5\x0b\x20\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa6\x0b\x24\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa7\x0b\x28\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xa8\x0b\x2c\x14\x00\x00\x00\x00\x2c\x03\x00\x00\x04\xa9\x0b\x30\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xaa\x0b\x44\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xab\x0b\x48\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xac\x0b\x4c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xad\x0b\x50\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xae\x0b\x54\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xb1\x0b\x58\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xb2\x0b\x5c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xb3\x0b\x60\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\xb4\x0b\x64\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\xb5\x0b\x74\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xb6\x0b\x84\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xb7\x0b\x88\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xba\x0b\x8c\x15\xd2\x02\x00\x00\x04\xbb\x0b\x08\x90\x16\x08\x04\xbb\x0b\x08\x14\x00\x00\x00\x00\x44\x03\x00\x00\x04\xbb\x0b\x00\x00\x14\x00\x00\x00\x00\xd7\x00\x00\x00\x04\xbc\x0b\x98\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xbd\x0b\xa0\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xbe\x0b\xa4\x15\x17\x03\x00\x00\x04\xbf\x0b\x08\xa8\x16\x08\x04\xbf\x0b\x08\x14\x00\x00\x00\x00\x8a\x04\x00\x00\x04\xbf\x0b\x00\x00\x00\x03\xc0\x00\x00\x00\x04\x52\x00\x00\x00\x05\x00\x03\xc0\x00\x00\x00\x04\x52\x00\x00\x00\x04\x00\x09\x49\x03\x00\x00\x13\x00\x00\x00\x00\x38\x04\xe0\x0d\x14\x00\x00\x00\x00\x50\x04\x00\x00\x04\xe1\x0d\x00\x14\x00\x00\x00\x00\x50\x04\x00\x00\x04\xe2\x0d\x02\x14\x00\x00\x00\x00\x50\x04\x00\x00\x04\xe3\x0d\x04\x14\x00\x00\x00\x00\x62\x04\x00\x00\x04\xe4\x0d\x06\x14\x00\x00\x00\x00\x62\x04\x00\x00\x04\xe5\x0d\x07\x14\x00\x00\x00\x00\x62\x04\x00\x00\x04\xe6\x0d\x08\x14\x00\x00\x00\x00\x62\x04\x00\x00\x04\xe7\x0d\x09\x14\x00\x00\x00\x00\x74\x04\x00\x00\x04\xe8\x0d\x0a\x14\x00\x00\x00\x00\x74\x04\x00\x00\x04\xe9\x0d\x0c\x14\x00\x00\x00\x00\x74\x04\x00\x00\x04\xea\x0d\x0e\x17\xdd\x03\x00\x00\x04\xeb\x0d\x10\x18\x20\x04\xeb\x0d\x17\xeb\x03\x00\x00\x04\xec\x0d\x00\x19\x04\x04\xec\x0d\x14\x00\x00\x00\x00\x7f\x04\x00\x00\x04\xed\x0d\x00\x14\x00\x00\x00\x00\x7f\x04\x00\x00\x04\xee\x0d\x02\x00\x17\x14\x04\x00\x00\x04\xf0\x0d\x00\x19\x20\x04\xf0\x0d\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\xf1\x0d\x00\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\xf2\x0d\x10\x00\x00\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf5\x0d\x30\x14\x00\x00\x00\x00\x7f\x04\x00\x00\x04\xf6\x0d\x34\x00\x0a\x5b\x04\x00\x00\x00\x00\x00\x00\x02\x0b\x05\x00\x00\x00\x00\x07\x02\x0a\x6d\x04\x00\x00\x00\x00\x00\x00\x02\x0a\x05\x00\x00\x00\x00\x08\x01\x0a\x50\x04\x00\x00\x00\x00\x00\x00\x02\x11\x0a\x50\x04\x00\x00\x00\x00\x00\x00\x02\x13\x09\x8f\x04\x00\x00\x13\x00\x00\x00\x00\x4c\x04\xf4\x0b\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf5\x0b\x00\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf6\x0b\x04\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf7\x0b\x08\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf8\x0b\x0c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xf9\x0b\x10\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xfa\x0b\x14\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xfc\x0b\x18\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\xfd\x0b\x1c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xfe\x0b\x2c\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\xff\x0b\x30\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\x00\x0c\x34\x14\x00\x00\x00\x00\x38\x03\x00\x00\x04\x01\x0c\x38\x14\x00\x00\x00\x00\xc0\x00\x00\x00\x04\x02\x0c\x48\x00\x00\x9f\xeb\x01\x00\x18\x00\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\xa8\x03\x00\x00\x85\x02\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04\x20\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x40\x00\x00\x00\x0a\x00\x00\x00\x09\x00\x00\x00\x80\x00\x00\x00\x10\x00\x00\x00\x0c\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x20\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x07\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x08\x08\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0a\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x08\x0b\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x10\x00\x00\x00\x6c\x00\x00\x00\x1f\x00\x00\x04\xb0\x00\x00\x00\x76\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x00\x00\x07\x00\x00\x00\x20\x00\x00\x00\x83\x00\x00\x00\x07\x00\x00\x00\x40\x00\x00\x00\x88\x00\x00\x00\x07\x00\x00\x00\x60\x00\x00\x00\x96\x00\x00\x00\x07\x00\x00\x00\x80\x00\x00\x00\x9f\x00\x00\x00\x07\x00\x00\x00\xa0\x00\x00\x00\xac\x00\x00\x00\x07\x00\x00\x00\xc0\x00\x00\x00\xb5\x00\x00\x00\x07\x00\x00\x00\xe0\x00\x00\x00\xc0\x00\x00\x00\x07\x00\x00\x00\x00\x01\x00\x00\xc9\x00\x00\x00\x07\x00\x00\x00\x20\x01\x00\x00\xd9\x00\x00\x00\x07\x00\x00\x00\x40\x01\x00\x00\xe1\x00\x00\x00\x07\x00\x00\x00\x60\x01\x00\x00\xea\x00\x00\x00\x11\x00\x00\x00\x80\x01\x00\x00\xed\x00\x00\x00\x07\x00\x00\x00\x20\x02\x00\x00\xf2\x00\x00\x00\x07\x00\x00\x00\x40\x02\x00\x00\xfd\x00\x00\x00\x07\x00\x00\x00\x60\x02\x00\x00\x02\x01\x00\x00\x07\x00\x00\x00\x80\x02\x00\x00\x0b\x01\x00\x00\x07\x00\x00\x00\xa0\x02\x00\x00\x13\x01\x00\x00\x07\x00\x00\x00\xc0\x02\x00\x00\x1a\x01\x00\x00\x07\x00\x00\x00\xe0\x02\x00\x00\x25\x01\x00\x00\x07\x00\x00\x00\x00\x03\x00\x00\x2f\x01\x00\x00\x12\x00\x00\x00\x20\x03\x00\x00\x3a\x01\x00\x00\x12\x00\x00\x00\xa0\x03\x00\x00\x44\x01\x00\x00\x07\x00\x00\x00\x20\x04\x00\x00\x50\x01\x00\x00\x07\x00\x00\x00\x40\x04\x00\x00\x5b\x01\x00\x00\x07\x00\x00\x00\x60\x04\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x80\x04\x00\x00\x65\x01\x00\x00\x0a\x00\x00\x00\xc0\x04\x00\x00\x6c\x01\x00\x00\x07\x00\x00\x00\x00\x05\x00\x00\x75\x01\x00\x00\x07\x00\x00\x00\x20\x05\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x40\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x05\x08\x00\x00\x00\x7e\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x1e\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x05\x08\x00\x00\x00\x88\x01\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x1f\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x03\x00\x00\x00\x8b\x01\x00\x00\x0f\x00\x00\x00\x8f\x01\x00\x00\x01\x00\x00\x0c\x17\x00\x00\x00\x52\x02\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x08\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x19\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x57\x02\x00\x00\x00\x00\x00\x0e\x1a\x00\x00\x00\x01\x00\x00\x00\x60\x02\x00\x00\x01\x00\x00\x0f\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x66\x02\x00\x00\x01\x00\x00\x0f\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x6e\x02\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x7c\x02\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x74\x79\x70\x65\x00\x6b\x65\x79\x00\x76\x61\x6c\x75\x65\x00\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\x00\x69\x6e\x74\x00\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\x00\x5f\x5f\x75\x33\x32\x00\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x5f\x5f\x75\x36\x34\x00\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x00\x70\x61\x63\x6b\x65\x74\x73\x00\x5f\x5f\x73\x6b\x5f\x62\x75\x66\x66\x00\x6c\x65\x6e\x00\x70\x6b\x74\x5f\x74\x79\x70\x65\x00\x6d\x61\x72\x6b\x00\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\x00\x70\x72\x6f\x74\x6f\x63\x6f\x6c\x00\x76\x6c\x61\x6e\x5f\x70\x72\x65\x73\x65\x6e\x74\x00\x76\x6c\x61\x6e\x5f\x74\x63\x69\x00\x76\x6c\x61\x6e\x5f\x70\x72\x6f\x74\x6f\x00\x70\x72\x69\x6f\x72\x69\x74\x79\x00\x69\x6e\x67\x72\x65\x73\x73\x5f\x69\x66\x69\x6e\x64\x65\x78\x00\x69\x66\x69\x6e\x64\x65\x78\x00\x74\x63\x5f\x69\x6e\x64\x65\x78\x00\x63\x62\x00\x68\x61\x73\x68\x00\x74\x63\x5f\x63\x6c\x61\x73\x73\x69\x64\x00\x64\x61\x74\x61\x00\x64\x61\x74\x61\x5f\x65\x6e\x64\x00\x6e\x61\x70\x69\x5f\x69\x64\x00\x66\x61\x6d\x69\x6c\x79\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x34\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x34\x00\x72\x65\x6d\x6f\x74\x65\x5f\x69\x70\x36\x00\x6c\x6f\x63\x61\x6c\x5f\x69\x70\x36\x00\x72\x65\x6d\x6f\x74\x65\x5f\x70\x6f\x72\x74\x00\x6c\x6f\x63\x61\x6c\x5f\x70\x6f\x72\x74\x00\x64\x61\x74\x61\x5f\x6d\x65\x74\x61\x00\x74\x73\x74\x61\x6d\x70\x00\x77\x69\x72\x65\x5f\x6c\x65\x6e\x00\x67\x73\x6f\x5f\x73\x65\x67\x73\x00\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x73\x6b\x00\x73\x6b\x62\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x73\x6f\x63\x6b\x65\x74\x00\x2e\x2f\x2e\x2f\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x09\x69\x66\x20\x28\x73\x6b\x62\x2d\x3e\x70\x6b\x74\x5f\x74\x79\x70\x65\x20\x21\x3d\x20\x50\x41\x43\x4b\x45\x54\x5f\x4f\x55\x54\x47\x4f\x49\x4e\x47\x29\x00\x09\x5f\x5f\x75\x33\x32\x20\x69\x6e\x64\x65\x78\x20\x3d\x20\x30\x3b\x00\x09\x5f\x5f\x75\x36\x34\x20\x2a\x76\x61\x6c\x75\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x61\x63\x6b\x65\x74\x73\x2c\x20\x26\x69\x6e\x64\x65\x78\x29\x3b\x00\x09\x69\x66\x20\x28\x76\x61\x6c\x75\x65\x29\x00\x09\x09\x5f\x5f\x73\x79\x6e\x63\x5f\x66\x65\x74\x63\x68\x5f\x61\x6e\x64\x5f\x61\x64\x64\x28\x76\x61\x6c\x75\x65\x2c\x20\x31\x29\x3b\x00\x7d\x00\x63\x68\x61\x72\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x2e\x6d\x61\x70\x73\x00\x6c\x69\x63\x65\x6e\x73\x65\x00\x62\x70\x66\x5f\x66\x6c\x6f\x77\x5f\x6b\x65\x79\x73\x00\x62\x70\x66\x5f\x73\x6f\x63\x6b\x00\x9f\xeb\x01\x00\x20\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x8c\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x9d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x10\x00\x00\x00\x9d\x01\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x00\x00\xb2\x01\x00\x00\x0b\x4c\x00\x00\x08\x00\x00\x00\xa4\x01\x00\x00\xb2\x01\x00\x00\x06\x4c\x00\x00\x18\x00\x00\x00\xa4\x01\x00\x00\xd9\x01\x00\x00\x08\x58\x00\x00\x28\x00\x00\x00\xa4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\xa4\x01\x00\x00\xeb\x01\x00\x00\x11\x5c\x00\x00\x48\x00\x00\x00\xa4\x01\x00\x00\x22\x02\x00\x00\x06\x60\x00\x00\x58\x00\x00\x00\xa4\x01\x00\x00\x2e\x02\x00\x00\x03\x64\x00\x00\x60\x00\x00\x00\xa4\x01\x00\x00\x50\x02\x00\x00\x01\x70\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\xff\xff\xff\xff\x04\x00\x08\x00\x08\x7c\x0b\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\x04\x00\x6a\x00\x00\x00\x08\x01\x01\xfb\x0e\x0d\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\x01\x2e\x00\x2e\x2f\x69\x6e\x63\x6c\x75\x64\x65\x2f\x6c\x69\x6e\x75\x78\x00\x2e\x2f\x69\x6e\x63\x6c\x75\x64\x65\x2f\x62\x70\x66\x00\x00\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x01\x00\x00\x74\x79\x70\x65\x73\x2e\x68\x00\x02\x00\x00\x62\x70\x66\x5f\x68\x65\x6c\x70\x65\x72\x5f\x64\x65\x66\x73\x2e\x68\x00\x03\x00\x00\x62\x70\x66\x2e\x68\x00\x02\x00\x00\x00\x00\x09\x02\x00\x00\x00\x00\x00\x00\x00\x00\x03\x11\x01\x05\x0b\x0a\x13\x05\x06\x06\x20\x03\x6d\x20\x05\x08\x06\x03\x16\x20\x06\x03\x6a\x20\x05\x11\x06\x03\x17\x2e\x05\x06\x3d\x06\x03\x68\x20\x05\x03\x06\x03\x19\x20\x05\x01\x23\x02\x02\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x04\x00\xf1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x25\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x2a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x43\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x52\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x67\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x72\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x88\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x93\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x9d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xa7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xad\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xbc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xc2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xc8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xd3\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xe9\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xee\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x05\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x16\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x1d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x23\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x29\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x32\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x39\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x4b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x54\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x65\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x73\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x7a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x83\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x9c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xa4\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xac\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xb5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xbe\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xc6\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xce\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xd4\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xdd\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x03\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x11\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x12\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x11\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x5e\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x59\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x02\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x03\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x5b\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x04\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x57\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x05\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x5c\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x06\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x07\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x08\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x5e\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x09\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0e\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x11\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0d\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x10\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0f\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x12\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x57\x00\x00\x00\x30\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x13\x00\x00\x00\x3b\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x58\x00\x00\x00\x3f\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x14\x00\x00\x00\x4a\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x58\x00\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x55\x00\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x58\x00\x00\x00\x5d\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0e\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x54\x00\x00\x00\x77\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x15\x00\x00\x00\x84\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x16\x00\x00\x00\x91\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x17\x00\x00\x00\x9e\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x19\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1a\x00\x00\x00\xc5\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1b\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1c\x00\x00\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1d\x00\x00\x00\xec\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1e\x00\x00\x00\xf9\x01\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1f\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x20\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x21\x00\x00\x00\x20\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x22\x00\x00\x00\x2d\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x23\x00\x00\x00\x3a\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x24\x00\x00\x00\x47\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x25\x00\x00\x00\x54\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x26\x00\x00\x00\x61\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x27\x00\x00\x00\x6e\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x28\x00\x00\x00\x7b\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x29\x00\x00\x00\x88\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2a\x00\x00\x00\x95\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2b\x00\x00\x00\xa2\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2c\x00\x00\x00\xaf\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2d\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2e\x00\x00\x00\xd9\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x2f\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x47\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x48\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x49\x00\x00\x00\x1e\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4a\x00\x00\x00\x4a\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x46\x00\x00\x00\x53\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x30\x00\x00\x00\x60\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x33\x00\x00\x00\x6d\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x34\x00\x00\x00\x7a\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x35\x00\x00\x00\x87\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x38\x00\x00\x00\x94\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x39\x00\x00\x00\xa1\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3a\x00\x00\x00\xae\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3b\x00\x00\x00\xbb\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3d\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3e\x00\x00\x00\xf1\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3f\x00\x00\x00\xfe\x03\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x41\x00\x00\x00\x1a\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x42\x00\x00\x00\x27\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x43\x00\x00\x00\x36\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x44\x00\x00\x00\x43\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x45\x00\x00\x00\x55\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x32\x00\x00\x00\x5c\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x31\x00\x00\x00\x67\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x37\x00\x00\x00\x6e\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x36\x00\x00\x00\x79\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x3c\x00\x00\x00\x84\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x40\x00\x00\x00\x90\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x53\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4b\x00\x00\x00\xa6\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x27\x00\x00\x00\xb3\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x09\x00\x00\x00\xc0\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x19\x00\x00\x00\xcd\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x17\x00\x00\x00\xda\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x1d\x00\x00\x00\xe7\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4c\x00\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4d\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4e\x00\x00\x00\x0e\x05\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4f\x00\x00\x00\x1b\x05\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x50\x00\x00\x00\x28\x05\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x51\x00\x00\x00\x35\x05\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x52\x00\x00\x00\x88\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x5a\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x57\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x57\x00\x00\x00\x5d\x5e\x5c\x00\x2e\x64\x65\x62\x75\x67\x5f\x61\x62\x62\x72\x65\x76\x00\x2e\x74\x65\x78\x74\x00\x2e\x72\x65\x6c\x2e\x42\x54\x46\x2e\x65\x78\x74\x00\x2e\x72\x65\x6c\x73\x6f\x63\x6b\x65\x74\x00\x63\x6f\x75\x6e\x74\x5f\x70\x61\x63\x6b\x65\x74\x73\x00\x2e\x6d\x61\x70\x73\x00\x2e\x64\x65\x62\x75\x67\x5f\x73\x74\x72\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x69\x6e\x66\x6f\x00\x2e\x6c\x6c\x76\x6d\x5f\x61\x64\x64\x72\x73\x69\x67\x00\x5f\x6c\x69\x63\x65\x6e\x73\x65\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x6c\x69\x6e\x65\x00\x2e\x72\x65\x6c\x2e\x64\x65\x62\x75\x67\x5f\x66\x72\x61\x6d\x65\x00\x2e\x64\x65\x62\x75\x67\x5f\x6c\x6f\x63\x00\x63\x6f\x75\x6e\x74\x65\x72\x2e\x63\x00\x2e\x73\x74\x72\x74\x61\x62\x00\x2e\x73\x79\x6d\x74\x61\x62\x00\x2e\x72\x65\x6c\x2e\x42\x54\x46\x00\x4c\x42\x42\x30\x5f\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x22\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x1b\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x03\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x00\x00\x01\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\xed\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x04\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x05\x00\x00\x00\x00\x00\x00\x43\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x1b\x00\x00\x00\x00\x00\x00\x30\x06\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x0a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x0a\x00\x00\x00\x00\x00\x00\x45\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x21\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x0c\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x10\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x21\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x0e\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x11\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x22\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x10\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x11\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x22\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x12\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x03\x4c\xff\x6f\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x22\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x12\x00\x00\x00\x00\x00\x00\xe8\x08\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x5c\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00") 79 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/lmb/ship-bpf-with-go 2 | 3 | go 1.15 4 | 5 | require ( 6 | github.com/cilium/ebpf v0.0.0-20201005075717-edc4db4deb5b 7 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 8 | ) 9 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/cilium/ebpf v0.0.0-20201005075717-edc4db4deb5b h1:8gHt/Rv262jGvuAlkW2buuyo9HjdwQFmeGQySL9Oocs= 2 | github.com/cilium/ebpf v0.0.0-20201005075717-edc4db4deb5b/go.mod h1:44MooKJJW1eGX0M0Ne/tB1uxHmzizXDaLREv3WIHrJ0= 3 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= 4 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 5 | -------------------------------------------------------------------------------- /include/Makefile: -------------------------------------------------------------------------------- 1 | LINUX_INC ?= /usr/include 2 | LIBBPF_INC ?= /usr/local/include 3 | 4 | .PHONY: update 5 | update: 6 | rsync --existing --exclude "types.h" -av "$(LINUX_INC)/linux/" "$(CURDIR)/linux" 7 | rsync --existing -av "$(LIBBPF_INC)/bpf/" "$(CURDIR)/bpf" 8 | -------------------------------------------------------------------------------- /include/bpf/bpf_endian.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 2 | #ifndef __BPF_ENDIAN__ 3 | #define __BPF_ENDIAN__ 4 | 5 | /* 6 | * Isolate byte #n and put it into byte #m, for __u##b type. 7 | * E.g., moving byte #6 (nnnnnnnn) into byte #1 (mmmmmmmm) for __u64: 8 | * 1) xxxxxxxx nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 9 | * 2) nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 00000000 10 | * 3) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 11 | * 4) 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 00000000 12 | */ 13 | #define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8)) 14 | 15 | #define ___bpf_swab16(x) ((__u16)( \ 16 | ___bpf_mvb(x, 16, 0, 1) | \ 17 | ___bpf_mvb(x, 16, 1, 0))) 18 | 19 | #define ___bpf_swab32(x) ((__u32)( \ 20 | ___bpf_mvb(x, 32, 0, 3) | \ 21 | ___bpf_mvb(x, 32, 1, 2) | \ 22 | ___bpf_mvb(x, 32, 2, 1) | \ 23 | ___bpf_mvb(x, 32, 3, 0))) 24 | 25 | #define ___bpf_swab64(x) ((__u64)( \ 26 | ___bpf_mvb(x, 64, 0, 7) | \ 27 | ___bpf_mvb(x, 64, 1, 6) | \ 28 | ___bpf_mvb(x, 64, 2, 5) | \ 29 | ___bpf_mvb(x, 64, 3, 4) | \ 30 | ___bpf_mvb(x, 64, 4, 3) | \ 31 | ___bpf_mvb(x, 64, 5, 2) | \ 32 | ___bpf_mvb(x, 64, 6, 1) | \ 33 | ___bpf_mvb(x, 64, 7, 0))) 34 | 35 | /* LLVM's BPF target selects the endianness of the CPU 36 | * it compiles on, or the user specifies (bpfel/bpfeb), 37 | * respectively. The used __BYTE_ORDER__ is defined by 38 | * the compiler, we cannot rely on __BYTE_ORDER from 39 | * libc headers, since it doesn't reflect the actual 40 | * requested byte order. 41 | * 42 | * Note, LLVM's BPF target has different __builtin_bswapX() 43 | * semantics. It does map to BPF_ALU | BPF_END | BPF_TO_BE 44 | * in bpfel and bpfeb case, which means below, that we map 45 | * to cpu_to_be16(). We could use it unconditionally in BPF 46 | * case, but better not rely on it, so that this header here 47 | * can be used from application and BPF program side, which 48 | * use different targets. 49 | */ 50 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 51 | # define __bpf_ntohs(x) __builtin_bswap16(x) 52 | # define __bpf_htons(x) __builtin_bswap16(x) 53 | # define __bpf_constant_ntohs(x) ___bpf_swab16(x) 54 | # define __bpf_constant_htons(x) ___bpf_swab16(x) 55 | # define __bpf_ntohl(x) __builtin_bswap32(x) 56 | # define __bpf_htonl(x) __builtin_bswap32(x) 57 | # define __bpf_constant_ntohl(x) ___bpf_swab32(x) 58 | # define __bpf_constant_htonl(x) ___bpf_swab32(x) 59 | # define __bpf_be64_to_cpu(x) __builtin_bswap64(x) 60 | # define __bpf_cpu_to_be64(x) __builtin_bswap64(x) 61 | # define __bpf_constant_be64_to_cpu(x) ___bpf_swab64(x) 62 | # define __bpf_constant_cpu_to_be64(x) ___bpf_swab64(x) 63 | #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 64 | # define __bpf_ntohs(x) (x) 65 | # define __bpf_htons(x) (x) 66 | # define __bpf_constant_ntohs(x) (x) 67 | # define __bpf_constant_htons(x) (x) 68 | # define __bpf_ntohl(x) (x) 69 | # define __bpf_htonl(x) (x) 70 | # define __bpf_constant_ntohl(x) (x) 71 | # define __bpf_constant_htonl(x) (x) 72 | # define __bpf_be64_to_cpu(x) (x) 73 | # define __bpf_cpu_to_be64(x) (x) 74 | # define __bpf_constant_be64_to_cpu(x) (x) 75 | # define __bpf_constant_cpu_to_be64(x) (x) 76 | #else 77 | # error "Fix your compiler's __BYTE_ORDER__?!" 78 | #endif 79 | 80 | #define bpf_htons(x) \ 81 | (__builtin_constant_p(x) ? \ 82 | __bpf_constant_htons(x) : __bpf_htons(x)) 83 | #define bpf_ntohs(x) \ 84 | (__builtin_constant_p(x) ? \ 85 | __bpf_constant_ntohs(x) : __bpf_ntohs(x)) 86 | #define bpf_htonl(x) \ 87 | (__builtin_constant_p(x) ? \ 88 | __bpf_constant_htonl(x) : __bpf_htonl(x)) 89 | #define bpf_ntohl(x) \ 90 | (__builtin_constant_p(x) ? \ 91 | __bpf_constant_ntohl(x) : __bpf_ntohl(x)) 92 | #define bpf_cpu_to_be64(x) \ 93 | (__builtin_constant_p(x) ? \ 94 | __bpf_constant_cpu_to_be64(x) : __bpf_cpu_to_be64(x)) 95 | #define bpf_be64_to_cpu(x) \ 96 | (__builtin_constant_p(x) ? \ 97 | __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) 98 | 99 | #endif /* __BPF_ENDIAN__ */ 100 | -------------------------------------------------------------------------------- /include/bpf/bpf_helpers.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 2 | #ifndef __BPF_HELPERS__ 3 | #define __BPF_HELPERS__ 4 | 5 | /* 6 | * Note that bpf programs need to include either 7 | * vmlinux.h (auto-generated from BTF) or linux/types.h 8 | * in advance since bpf_helper_defs.h uses such types 9 | * as __u64. 10 | */ 11 | #include "bpf_helper_defs.h" 12 | 13 | #define __uint(name, val) int (*name)[val] 14 | #define __type(name, val) typeof(val) *name 15 | #define __array(name, val) typeof(val) *name[] 16 | 17 | /* Helper macro to print out debug messages */ 18 | #define bpf_printk(fmt, ...) \ 19 | ({ \ 20 | char ____fmt[] = fmt; \ 21 | bpf_trace_printk(____fmt, sizeof(____fmt), \ 22 | ##__VA_ARGS__); \ 23 | }) 24 | 25 | /* 26 | * Helper macro to place programs, maps, license in 27 | * different sections in elf_bpf file. Section names 28 | * are interpreted by elf_bpf loader 29 | */ 30 | #define SEC(NAME) __attribute__((section(NAME), used)) 31 | 32 | #ifndef __always_inline 33 | #define __always_inline __attribute__((always_inline)) 34 | #endif 35 | #ifndef __weak 36 | #define __weak __attribute__((weak)) 37 | #endif 38 | 39 | /* 40 | * Helper macro to manipulate data structures 41 | */ 42 | #ifndef offsetof 43 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) 44 | #endif 45 | #ifndef container_of 46 | #define container_of(ptr, type, member) \ 47 | ({ \ 48 | void *__mptr = (void *)(ptr); \ 49 | ((type *)(__mptr - offsetof(type, member))); \ 50 | }) 51 | #endif 52 | 53 | /* 54 | * Helper structure used by eBPF C program 55 | * to describe BPF map attributes to libbpf loader 56 | */ 57 | struct bpf_map_def { 58 | unsigned int type; 59 | unsigned int key_size; 60 | unsigned int value_size; 61 | unsigned int max_entries; 62 | unsigned int map_flags; 63 | }; 64 | 65 | enum libbpf_pin_type { 66 | LIBBPF_PIN_NONE, 67 | /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ 68 | LIBBPF_PIN_BY_NAME, 69 | }; 70 | 71 | enum libbpf_tristate { 72 | TRI_NO = 0, 73 | TRI_YES = 1, 74 | TRI_MODULE = 2, 75 | }; 76 | 77 | #define __kconfig __attribute__((section(".kconfig"))) 78 | #define __ksym __attribute__((section(".ksyms"))) 79 | 80 | #endif 81 | -------------------------------------------------------------------------------- /include/linux/bpf_common.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 | #ifndef __LINUX_BPF_COMMON_H__ 3 | #define __LINUX_BPF_COMMON_H__ 4 | 5 | /* Instruction classes */ 6 | #define BPF_CLASS(code) ((code) & 0x07) 7 | #define BPF_LD 0x00 8 | #define BPF_LDX 0x01 9 | #define BPF_ST 0x02 10 | #define BPF_STX 0x03 11 | #define BPF_ALU 0x04 12 | #define BPF_JMP 0x05 13 | #define BPF_RET 0x06 14 | #define BPF_MISC 0x07 15 | 16 | /* ld/ldx fields */ 17 | #define BPF_SIZE(code) ((code) & 0x18) 18 | #define BPF_W 0x00 /* 32-bit */ 19 | #define BPF_H 0x08 /* 16-bit */ 20 | #define BPF_B 0x10 /* 8-bit */ 21 | /* eBPF BPF_DW 0x18 64-bit */ 22 | #define BPF_MODE(code) ((code) & 0xe0) 23 | #define BPF_IMM 0x00 24 | #define BPF_ABS 0x20 25 | #define BPF_IND 0x40 26 | #define BPF_MEM 0x60 27 | #define BPF_LEN 0x80 28 | #define BPF_MSH 0xa0 29 | 30 | /* alu/jmp fields */ 31 | #define BPF_OP(code) ((code) & 0xf0) 32 | #define BPF_ADD 0x00 33 | #define BPF_SUB 0x10 34 | #define BPF_MUL 0x20 35 | #define BPF_DIV 0x30 36 | #define BPF_OR 0x40 37 | #define BPF_AND 0x50 38 | #define BPF_LSH 0x60 39 | #define BPF_RSH 0x70 40 | #define BPF_NEG 0x80 41 | #define BPF_MOD 0x90 42 | #define BPF_XOR 0xa0 43 | 44 | #define BPF_JA 0x00 45 | #define BPF_JEQ 0x10 46 | #define BPF_JGT 0x20 47 | #define BPF_JGE 0x30 48 | #define BPF_JSET 0x40 49 | #define BPF_SRC(code) ((code) & 0x08) 50 | #define BPF_K 0x00 51 | #define BPF_X 0x08 52 | 53 | #ifndef BPF_MAXINSNS 54 | #define BPF_MAXINSNS 4096 55 | #endif 56 | 57 | #endif /* __LINUX_BPF_COMMON_H__ */ 58 | -------------------------------------------------------------------------------- /include/linux/if_packet.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 | #ifndef __LINUX_IF_PACKET_H 3 | #define __LINUX_IF_PACKET_H 4 | 5 | #include 6 | 7 | struct sockaddr_pkt { 8 | unsigned short spkt_family; 9 | unsigned char spkt_device[14]; 10 | __be16 spkt_protocol; 11 | }; 12 | 13 | struct sockaddr_ll { 14 | unsigned short sll_family; 15 | __be16 sll_protocol; 16 | int sll_ifindex; 17 | unsigned short sll_hatype; 18 | unsigned char sll_pkttype; 19 | unsigned char sll_halen; 20 | unsigned char sll_addr[8]; 21 | }; 22 | 23 | /* Packet types */ 24 | 25 | #define PACKET_HOST 0 /* To us */ 26 | #define PACKET_BROADCAST 1 /* To all */ 27 | #define PACKET_MULTICAST 2 /* To group */ 28 | #define PACKET_OTHERHOST 3 /* To someone else */ 29 | #define PACKET_OUTGOING 4 /* Outgoing of any type */ 30 | #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */ 31 | #define PACKET_USER 6 /* To user space */ 32 | #define PACKET_KERNEL 7 /* To kernel space */ 33 | /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ 34 | #define PACKET_FASTROUTE 6 /* Fastrouted frame */ 35 | 36 | /* Packet socket options */ 37 | 38 | #define PACKET_ADD_MEMBERSHIP 1 39 | #define PACKET_DROP_MEMBERSHIP 2 40 | #define PACKET_RECV_OUTPUT 3 41 | /* Value 4 is still used by obsolete turbo-packet. */ 42 | #define PACKET_RX_RING 5 43 | #define PACKET_STATISTICS 6 44 | #define PACKET_COPY_THRESH 7 45 | #define PACKET_AUXDATA 8 46 | #define PACKET_ORIGDEV 9 47 | #define PACKET_VERSION 10 48 | #define PACKET_HDRLEN 11 49 | #define PACKET_RESERVE 12 50 | #define PACKET_TX_RING 13 51 | #define PACKET_LOSS 14 52 | #define PACKET_VNET_HDR 15 53 | #define PACKET_TX_TIMESTAMP 16 54 | #define PACKET_TIMESTAMP 17 55 | #define PACKET_FANOUT 18 56 | #define PACKET_TX_HAS_OFF 19 57 | #define PACKET_QDISC_BYPASS 20 58 | #define PACKET_ROLLOVER_STATS 21 59 | #define PACKET_FANOUT_DATA 22 60 | #define PACKET_IGNORE_OUTGOING 23 61 | 62 | #define PACKET_FANOUT_HASH 0 63 | #define PACKET_FANOUT_LB 1 64 | #define PACKET_FANOUT_CPU 2 65 | #define PACKET_FANOUT_ROLLOVER 3 66 | #define PACKET_FANOUT_RND 4 67 | #define PACKET_FANOUT_QM 5 68 | #define PACKET_FANOUT_CBPF 6 69 | #define PACKET_FANOUT_EBPF 7 70 | #define PACKET_FANOUT_FLAG_ROLLOVER 0x1000 71 | #define PACKET_FANOUT_FLAG_UNIQUEID 0x2000 72 | #define PACKET_FANOUT_FLAG_DEFRAG 0x8000 73 | 74 | struct tpacket_stats { 75 | unsigned int tp_packets; 76 | unsigned int tp_drops; 77 | }; 78 | 79 | struct tpacket_stats_v3 { 80 | unsigned int tp_packets; 81 | unsigned int tp_drops; 82 | unsigned int tp_freeze_q_cnt; 83 | }; 84 | 85 | struct tpacket_rollover_stats { 86 | __aligned_u64 tp_all; 87 | __aligned_u64 tp_huge; 88 | __aligned_u64 tp_failed; 89 | }; 90 | 91 | union tpacket_stats_u { 92 | struct tpacket_stats stats1; 93 | struct tpacket_stats_v3 stats3; 94 | }; 95 | 96 | struct tpacket_auxdata { 97 | __u32 tp_status; 98 | __u32 tp_len; 99 | __u32 tp_snaplen; 100 | __u16 tp_mac; 101 | __u16 tp_net; 102 | __u16 tp_vlan_tci; 103 | __u16 tp_vlan_tpid; 104 | }; 105 | 106 | /* Rx ring - header status */ 107 | #define TP_STATUS_KERNEL 0 108 | #define TP_STATUS_USER (1 << 0) 109 | #define TP_STATUS_COPY (1 << 1) 110 | #define TP_STATUS_LOSING (1 << 2) 111 | #define TP_STATUS_CSUMNOTREADY (1 << 3) 112 | #define TP_STATUS_VLAN_VALID (1 << 4) /* auxdata has valid tp_vlan_tci */ 113 | #define TP_STATUS_BLK_TMO (1 << 5) 114 | #define TP_STATUS_VLAN_TPID_VALID (1 << 6) /* auxdata has valid tp_vlan_tpid */ 115 | #define TP_STATUS_CSUM_VALID (1 << 7) 116 | 117 | /* Tx ring - header status */ 118 | #define TP_STATUS_AVAILABLE 0 119 | #define TP_STATUS_SEND_REQUEST (1 << 0) 120 | #define TP_STATUS_SENDING (1 << 1) 121 | #define TP_STATUS_WRONG_FORMAT (1 << 2) 122 | 123 | /* Rx and Tx ring - header status */ 124 | #define TP_STATUS_TS_SOFTWARE (1 << 29) 125 | #define TP_STATUS_TS_SYS_HARDWARE (1 << 30) /* deprecated, never set */ 126 | #define TP_STATUS_TS_RAW_HARDWARE (1U << 31) 127 | 128 | /* Rx ring - feature request bits */ 129 | #define TP_FT_REQ_FILL_RXHASH 0x1 130 | 131 | struct tpacket_hdr { 132 | unsigned long tp_status; 133 | unsigned int tp_len; 134 | unsigned int tp_snaplen; 135 | unsigned short tp_mac; 136 | unsigned short tp_net; 137 | unsigned int tp_sec; 138 | unsigned int tp_usec; 139 | }; 140 | 141 | #define TPACKET_ALIGNMENT 16 142 | #define TPACKET_ALIGN(x) (((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1)) 143 | #define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll)) 144 | 145 | struct tpacket2_hdr { 146 | __u32 tp_status; 147 | __u32 tp_len; 148 | __u32 tp_snaplen; 149 | __u16 tp_mac; 150 | __u16 tp_net; 151 | __u32 tp_sec; 152 | __u32 tp_nsec; 153 | __u16 tp_vlan_tci; 154 | __u16 tp_vlan_tpid; 155 | __u8 tp_padding[4]; 156 | }; 157 | 158 | struct tpacket_hdr_variant1 { 159 | __u32 tp_rxhash; 160 | __u32 tp_vlan_tci; 161 | __u16 tp_vlan_tpid; 162 | __u16 tp_padding; 163 | }; 164 | 165 | struct tpacket3_hdr { 166 | __u32 tp_next_offset; 167 | __u32 tp_sec; 168 | __u32 tp_nsec; 169 | __u32 tp_snaplen; 170 | __u32 tp_len; 171 | __u32 tp_status; 172 | __u16 tp_mac; 173 | __u16 tp_net; 174 | /* pkt_hdr variants */ 175 | union { 176 | struct tpacket_hdr_variant1 hv1; 177 | }; 178 | __u8 tp_padding[8]; 179 | }; 180 | 181 | struct tpacket_bd_ts { 182 | unsigned int ts_sec; 183 | union { 184 | unsigned int ts_usec; 185 | unsigned int ts_nsec; 186 | }; 187 | }; 188 | 189 | struct tpacket_hdr_v1 { 190 | __u32 block_status; 191 | __u32 num_pkts; 192 | __u32 offset_to_first_pkt; 193 | 194 | /* Number of valid bytes (including padding) 195 | * blk_len <= tp_block_size 196 | */ 197 | __u32 blk_len; 198 | 199 | /* 200 | * Quite a few uses of sequence number: 201 | * 1. Make sure cache flush etc worked. 202 | * Well, one can argue - why not use the increasing ts below? 203 | * But look at 2. below first. 204 | * 2. When you pass around blocks to other user space decoders, 205 | * you can see which blk[s] is[are] outstanding etc. 206 | * 3. Validate kernel code. 207 | */ 208 | __aligned_u64 seq_num; 209 | 210 | /* 211 | * ts_last_pkt: 212 | * 213 | * Case 1. Block has 'N'(N >=1) packets and TMO'd(timed out) 214 | * ts_last_pkt == 'time-stamp of last packet' and NOT the 215 | * time when the timer fired and the block was closed. 216 | * By providing the ts of the last packet we can absolutely 217 | * guarantee that time-stamp wise, the first packet in the 218 | * next block will never precede the last packet of the 219 | * previous block. 220 | * Case 2. Block has zero packets and TMO'd 221 | * ts_last_pkt = time when the timer fired and the block 222 | * was closed. 223 | * Case 3. Block has 'N' packets and NO TMO. 224 | * ts_last_pkt = time-stamp of the last pkt in the block. 225 | * 226 | * ts_first_pkt: 227 | * Is always the time-stamp when the block was opened. 228 | * Case a) ZERO packets 229 | * No packets to deal with but atleast you know the 230 | * time-interval of this block. 231 | * Case b) Non-zero packets 232 | * Use the ts of the first packet in the block. 233 | * 234 | */ 235 | struct tpacket_bd_ts ts_first_pkt, ts_last_pkt; 236 | }; 237 | 238 | union tpacket_bd_header_u { 239 | struct tpacket_hdr_v1 bh1; 240 | }; 241 | 242 | struct tpacket_block_desc { 243 | __u32 version; 244 | __u32 offset_to_priv; 245 | union tpacket_bd_header_u hdr; 246 | }; 247 | 248 | #define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) 249 | #define TPACKET3_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll)) 250 | 251 | enum tpacket_versions { 252 | TPACKET_V1, 253 | TPACKET_V2, 254 | TPACKET_V3 255 | }; 256 | 257 | /* 258 | Frame structure: 259 | 260 | - Start. Frame must be aligned to TPACKET_ALIGNMENT=16 261 | - struct tpacket_hdr 262 | - pad to TPACKET_ALIGNMENT=16 263 | - struct sockaddr_ll 264 | - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16 265 | - Start+tp_mac: [ Optional MAC header ] 266 | - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16. 267 | - Pad to align to TPACKET_ALIGNMENT=16 268 | */ 269 | 270 | struct tpacket_req { 271 | unsigned int tp_block_size; /* Minimal size of contiguous block */ 272 | unsigned int tp_block_nr; /* Number of blocks */ 273 | unsigned int tp_frame_size; /* Size of frame */ 274 | unsigned int tp_frame_nr; /* Total number of frames */ 275 | }; 276 | 277 | struct tpacket_req3 { 278 | unsigned int tp_block_size; /* Minimal size of contiguous block */ 279 | unsigned int tp_block_nr; /* Number of blocks */ 280 | unsigned int tp_frame_size; /* Size of frame */ 281 | unsigned int tp_frame_nr; /* Total number of frames */ 282 | unsigned int tp_retire_blk_tov; /* timeout in msecs */ 283 | unsigned int tp_sizeof_priv; /* offset to private data area */ 284 | unsigned int tp_feature_req_word; 285 | }; 286 | 287 | union tpacket_req_u { 288 | struct tpacket_req req; 289 | struct tpacket_req3 req3; 290 | }; 291 | 292 | struct packet_mreq { 293 | int mr_ifindex; 294 | unsigned short mr_type; 295 | unsigned short mr_alen; 296 | unsigned char mr_address[8]; 297 | }; 298 | 299 | #define PACKET_MR_MULTICAST 0 300 | #define PACKET_MR_PROMISC 1 301 | #define PACKET_MR_ALLMULTI 2 302 | #define PACKET_MR_UNICAST 3 303 | 304 | #endif 305 | -------------------------------------------------------------------------------- /include/linux/types.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: BSD-3-Clause */ 2 | #pragma once 3 | 4 | typedef char __s8; 5 | typedef short __s16; 6 | typedef int __s32; 7 | typedef long long __s64; 8 | _Static_assert(sizeof(__s32) == 4, "__s32 must be 4 bytes"); 9 | _Static_assert(sizeof(__s64) == 8, "__s64 must be 8 bytes"); 10 | 11 | typedef unsigned char __u8; 12 | typedef unsigned short __u16; 13 | typedef unsigned int __u32; 14 | typedef unsigned long long __u64; 15 | _Static_assert(sizeof(__u32) == 4, "__u32 must be 4 bytes"); 16 | _Static_assert(sizeof(__u64) == 8, "__u64 must be 8 bytes"); 17 | 18 | typedef __u16 __be16; 19 | typedef __u16 __le16; 20 | typedef __u16 __be32; 21 | typedef __u32 __le32; 22 | typedef __u64 __be64; 23 | typedef __u64 __le64; 24 | 25 | typedef __u32 __wsum; 26 | 27 | typedef __u64 __attribute__((aligned(8))) __aligned_u64; 28 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "syscall" 6 | "time" 7 | 8 | "golang.org/x/sys/unix" 9 | ) 10 | 11 | //go:generate go run github.com/cilium/ebpf/cmd/bpf2go counter counter.c -- -I./include -nostdinc -O3 12 | 13 | func main() { 14 | const SO_ATTACH_BPF = 50 15 | const loopback = 1 16 | 17 | err := unix.Setrlimit(unix.RLIMIT_MEMLOCK, &unix.Rlimit{ 18 | Cur: unix.RLIM_INFINITY, 19 | Max: unix.RLIM_INFINITY, 20 | }) 21 | if err != nil { 22 | fmt.Println("WARNING: Failed to adjust rlimit") 23 | } 24 | 25 | specs, err := newCounterSpecs() 26 | if err != nil { 27 | panic(err) 28 | } 29 | 30 | objs, err := specs.Load(nil) 31 | if err != nil { 32 | panic(err) 33 | } 34 | defer objs.Close() 35 | 36 | sock, err := openRawSock(loopback) 37 | if err != nil { 38 | panic(err) 39 | } 40 | defer syscall.Close(sock) 41 | 42 | if err := syscall.SetsockoptInt(sock, syscall.SOL_SOCKET, SO_ATTACH_BPF, objs.ProgramCountPackets.FD()); err != nil { 43 | panic(err) 44 | } 45 | 46 | for range time.Tick(time.Second) { 47 | var count uint64 48 | if err := objs.MapPackets.Lookup(uint32(0), &count); err != nil { 49 | panic(err) 50 | } 51 | 52 | fmt.Println("Saw", count, "packets") 53 | } 54 | } 55 | 56 | func openRawSock(index int) (int, error) { 57 | const ETH_P_ALL uint16 = 0x300 58 | sock, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, int(ETH_P_ALL)) 59 | if err != nil { 60 | return 0, err 61 | } 62 | sll := syscall.SockaddrLinklayer{} 63 | sll.Protocol = ETH_P_ALL 64 | sll.Ifindex = index 65 | if err := syscall.Bind(sock, &sll); err != nil { 66 | return 0, err 67 | } 68 | return sock, nil 69 | } 70 | --------------------------------------------------------------------------------