diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/go.mod b/go.mod index cead9e8e..d552df4d 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/adrianmo/go-nmea v1.9.0 github.com/antchfx/jsonquery v1.3.5 - github.com/bettercap/gatt v0.0.0-20240808115956-ec4935e8c4a0 github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3 @@ -38,4 +37,5 @@ require ( go.einride.tech/can v0.12.0 golang.org/x/net v0.28.0 golang.org/x/tools v0.24.0 // indirect + tinygo.org/x/bluetooth v0.10.0 ) diff --git a/go.sum b/go.sum index d3608d7b..ab0f3206 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/adrianmo/go-nmea v1.9.0 h1:kCuerWLDIppltHNZ2HGdCGkqbmupYJYfE6indcGkcp8= @@ -8,24 +9,23 @@ github.com/antchfx/jsonquery v1.3.5 h1:243OSaQh02EfmASa3w3weKC9UaiD8RRzJhgfvq3q4 github.com/antchfx/jsonquery v1.3.5/go.mod h1:qH23yX2Jsj1/k378Yu/EOgPCNgJ35P9tiGOeQdt/GWc= github.com/antchfx/xpath v1.3.1 h1:PNbFuUqHwWl0xRjvUPjJ95Agbmdj2uzzIwmQKgu4oCk= github.com/antchfx/xpath v1.3.1/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= -github.com/bettercap/gatt v0.0.0-20240808115956-ec4935e8c4a0 h1:HiFUGV/7eGWG/YJAf9HcKOUmxIj+7LVzC8zD57VX1qo= -github.com/bettercap/gatt v0.0.0-20240808115956-ec4935e8c4a0/go.mod h1:oafnPgaBI4gqJiYkueCyR4dqygiWGXTGOE0gmmAVeeQ= github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb h1:JWAAJk4ny+bT3VrtcX+e7mcmWtWUeUM0xVcocSAUuWc= github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb/go.mod h1:g6WiaSRgMTiChuk7jYyFSEtpgaw1F0wAsBfspG3bu0M= github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf h1:pwGPRc5PIp4KCF9QbKn0iLVMhfigUMw4IzGZEZ81m1I= github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf/go.mod h1:03rWiUf60r1miMVzMEtgtkq7RdZniecZFw3/Zgvyxcs= github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3 h1:pC4ZAk7UtDIbrRKzMMiIL1TVkiKlgtgcJodqKB53Rl4= github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3/go.mod h1:kqVwnx6DKuOHMZcBnzsgp2Lq2JZHDtFtm92b5hxdRaM= +github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 h1:1NyRx2f4W4WBRyg0Kys0ZbaNmDDzZ2R/C7DTi+bbsJ0= github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= @@ -36,13 +36,22 @@ github.com/evilsocket/islazy v1.11.0/go.mod h1:muYH4x5MB5YRdkxnrOtrXLIBX6LySj1uF github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/florianl/go-nfqueue/v2 v2.0.0 h1:NTCxS9b0GSbHkWv1a7oOvZn679fsyDkaSkRvOYpQ9Oo= github.com/florianl/go-nfqueue/v2 v2.0.0/go.mod h1:M2tBLIj62QpwqjwV0qfcjqGOqP3qiTuXr2uSRBXH9Qk= +github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= +github.com/glerchundi/subcommands v0.0.0-20181212083838-923a6ccb11f8/go.mod h1:r0g3O7Y5lrWXgDfcFBRgnAKzjmPgTzwoMC2ieB345FY= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/gobwas/glob v0.0.0-20181002190808-e7a84e9525fe h1:8P+/htb3mwwpeGdJg69yBF/RofK7c6Fjz5Ypa/bTqbY= github.com/gobwas/glob v0.0.0-20181002190808-e7a84e9525fe/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -54,10 +63,12 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/gousb v1.1.3 h1:xt6M5TDsGSZ+rlomz5Si5Hmd/Fvbmo2YCJHN+yGaK4o= github.com/google/gousb v1.1.3/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hajimehoshi/go-jisx0208 v1.0.0/go.mod h1:yYxEStHL7lt9uL+AbdWgW9gBumwieDoZCiB1f/0X0as= github.com/hashicorp/mdns v1.0.5 h1:1M5hW1cunYeoXOqHwEb/GBDDHAFo0Yqb/uz/beC6LbE= github.com/hashicorp/mdns v1.0.5/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/inconshreveable/go-vhost v1.0.0 h1:IK4VZTlXL4l9vz2IZoiSFbYaaqUW7dXJAiPriUN5Ur8= @@ -66,21 +77,17 @@ github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtL github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/jpillora/go-tld v1.2.1 h1:kDKOkmXLlskqjcvNs7w5XHLep7c8WM7Xd4HQjxllVMk= github.com/jpillora/go-tld v1.2.1/go.mod h1:plzIl7xr5UWKGy7R+giuv+L/nOjrPjsoWxy/ST9OBUk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo= github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/malfunkt/iprange v0.9.0 h1:VCs0PKLUPotNVQTpVNszsut4lP7OCGNBwX+lOYBrnVQ= github.com/malfunkt/iprange v0.9.0/go.mod h1:TRGqO/f95gh3LOndUGTL46+W0GXA91WTqyZ0Quwvt4U= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mdlayher/dhcp6 v0.0.0-20190311162359-2a67805d7d0b h1:r12blE3QRYlW1WBiBEe007O6NrTb/P54OjR5d4WLEGk= github.com/mdlayher/dhcp6 v0.0.0-20190311162359-2a67805d7d0b/go.mod h1:p4K2+UAoap8Jzsadsxc0KG0OZjmmCthTPUyZqAVkjBY= @@ -88,15 +95,13 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/ github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab h1:n8cgpHzJ5+EDyDri2s/GC7a9+qK3/YEGnBsd0uS/8PY= -github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab/go.mod h1:y1pL58r5z2VvAjeG1VLGc8zOQgSOzbKN7kMHPvFXJ+8= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/peterbourgon/ff/v3 v3.1.2/go.mod h1:XNJLY8EIl6MjMVjBS4F0+G0LYoAqs0DTa4rmHHukKDE= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -105,17 +110,31 @@ github.com/robertkrimen/otto v0.2.1/go.mod h1:UPwtJ1Xu7JrLcZjNWN8orJaM5n5YEtqL// github.com/robertkrimen/otto v0.4.0 h1:/c0GRrK1XDPcgIasAsnlpBT5DelIeB9U/Z/JCQsgr7E= github.com/robertkrimen/otto v0.4.0/go.mod h1:uW9yN1CYflmUQYvAMS0m+ZiNo3dMzRUDQJX0jWbzgxw= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= +github.com/sago35/go-bdf v0.0.0-20200313142241-6c17821c91c4/go.mod h1:rOebXGuMLsXhZAC6mF/TjxONsm45498ZyzVhel++6KM= +github.com/saltosystems/winrt-go v0.0.0-20240509164145-4f7860a3bd2b h1:du3zG5fd8snsFN6RBoLA7fpaYV9ZQIsyH9snlk2Zvik= +github.com/saltosystems/winrt-go v0.0.0-20240509164145-4f7860a3bd2b/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA= github.com/shurcooL/go v0.0.0-20190704215121-7189cc372560/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/soypat/cyw43439 v0.0.0-20240609122733-da9153086796 h1:1/r2URInjjFtWqT61gU7YGVCq3BRyXt/C7z4oLRF9Lo= +github.com/soypat/cyw43439 v0.0.0-20240609122733-da9153086796/go.mod h1:1Otjk6PRhfzfcVHeWMEeku/VntFqWghUwuSQyivb2vE= +github.com/soypat/natiu-mqtt v0.5.1/go.mod h1:xEta+cwop9izVCW7xOx2W+ct9PRMqr0gNVkvBPnQTc4= +github.com/soypat/saleae v0.0.0-20230402180913-3584b7515dae/go.mod h1:9SV+w6E9YK/BePxdxYGXthkrRztHJCQlojWOjAxW3M4= +github.com/soypat/seqs v0.0.0-20240527012110-1201bab640ef h1:phH95I9wANjTYw6bSYLZDQfNvao+HqYDom8owbNa0P4= +github.com/soypat/seqs v0.0.0-20240527012110-1201bab640ef/go.mod h1:oCVCNGCHMKoBj97Zp9znLbQ1nHxpkmOY9X+UAGzOxc8= github.com/stratoberry/go-gpsd v1.3.0 h1:JxJOEC4SgD0QY65AE7B1CtJtweP73nqJghZeLNU9J+c= github.com/stratoberry/go-gpsd v1.3.0/go.mod h1:nVf/vTgfYxOMxiQdy9BtJjojbFRtG8H3wNula++VgkU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -123,10 +142,17 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tdakkota/win32metadata v0.1.0/go.mod h1:77e6YvX0LIVW+O81fhWLnXAxxcyu/wdZdG7iwed7Fyk= github.com/thoj/go-ircevent v0.0.0-20210723090443-73e444401d64 h1:l/T7dYuJEQZOwVOpjIXr1180aM9PZL/d1MnMVIxefX4= github.com/thoj/go-ircevent v0.0.0-20210723090443-73e444401d64/go.mod h1:Q1NAJOuRdQCqN/VIWdnaaEhV8LpeO2rtlBP7/iDJNII= +github.com/tinygo-org/cbgo v0.0.4 h1:3D76CRYbH03Rudi8sEgs/YO0x3JIMdyq8jlQtk/44fU= +github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk= +github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899 h1:/DyaXDEWMqoVUVEJVJIlNk1bXTbFs8s3Q4GdPInSKTQ= +github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8= +github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.einride.tech/can v0.12.0 h1:6MW9TKycSovWqJxcYHpZEiuFCGuAfpqApCzTS15KrPk= go.einride.tech/can v0.12.0/go.mod h1:5n3+AonCfUso6PfjD9l2d0W2LxTFjjHOnHAm+UMS9Ws= @@ -136,17 +162,23 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 h1:/yRP+0AN7mf5DkD3BAI6TOFnd51gEoDEb8o35jIFtgw= +golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= @@ -160,10 +192,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= @@ -183,17 +217,19 @@ golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -201,6 +237,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -216,6 +253,7 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= @@ -228,6 +266,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -238,6 +277,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -253,14 +293,27 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/readline.v1 v1.0.0-20160726135117-62c6fe619375/go.mod h1:lNEQeAhU009zbRxng+XOj5ITVgY24WcbNnQopyfKoYQ= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +tinygo.org/x/bluetooth v0.10.0 h1:42n8qj2tuF5AfdbAUR2Nv45EhtVmbDFH6UoWnt6lzZQ= +tinygo.org/x/bluetooth v0.10.0/go.mod h1:t/Vm2a/rslsBoqFQKCBsWQw/cmRicQq+8Tl3tj5RCRI= +tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= +tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= +tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= +tinygo.org/x/drivers v0.19.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI= +tinygo.org/x/drivers v0.25.0/go.mod h1:v+mXaA4cgpz/YZJ3ZPm/86bYQJAXTaYtMkHlVwbodbw= +tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6/go.mod h1:X7utcg3yfFUFuKLOMTZD56eztXMjpkcf8OHldfTBsjw= +tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM= +tinygo.org/x/tinyfont v0.3.0/go.mod h1:+TV5q0KpwSGRWnN+ITijsIhrWYJkoUCp9MYELjKpAXk= +tinygo.org/x/tinyfont v0.4.0/go.mod h1:7nVj3j3geqBoPDzpFukAhF1C8AP9YocMsZy0HSAcGCA= +tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20= +tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4= +tinygo.org/x/tinyterm v0.3.0/go.mod h1:F1pQjxEwNZQIc5czeJSBtk57ucEvbR4u7vHaLhWhHtg= diff --git a/modules/ble/ble_enum.go b/modules/ble/ble_enum.go new file mode 100644 index 00000000..0bedc148 --- /dev/null +++ b/modules/ble/ble_enum.go @@ -0,0 +1,167 @@ +package ble + +import ( + "fmt" + "strconv" + "strings" + "time" + + "github.com/bettercap/bettercap/v2/network" + "github.com/evilsocket/islazy/tui" + "tinygo.org/x/bluetooth" +) + +func parseRawData(raw []byte) string { + s := "" + for _, b := range raw { + if strconv.IsPrint(rune(b)) { + s += tui.Yellow(string(b)) + } else { + s += tui.Dim(fmt.Sprintf("%02x", b)) + } + } + return s +} + +func (mod *BLERecon) startEnumeration(address string) error { + knownDev, found := mod.Session.BLE.Get(address) + if !found || knownDev == nil { + return fmt.Errorf("device with address %s not found", address) + } else if err := mod.adapter.StopScan(); err != nil { + mod.Warning("error stopping previous scan: %v", err) + } + + mod.current.ResetWrite() + + defer func() { + // make sure to restart scan when we're done + mod.Info("restoring ble scan") + if err := mod.adapter.Scan(mod.onDevice); err != nil { + mod.Error("error restoring ble scan: %v", err) + } + mod.Info("ble scan restored") + }() + + mod.Info("connecting to %s ...", address) + + addr := bluetooth.Address{} + addr.Set(address) + tm := bluetooth.NewDuration(time.Second * time.Duration(mod.connTimeout)) + + device, err := mod.adapter.Connect(addr, bluetooth.ConnectionParams{ConnectionTimeout: tm}) + if err != nil { + mod.Error("error connecting to %s: %v", address, err) + return err + } + + mod.Session.Events.Add("ble.device.connected", knownDev) + + mod.Info("connected to %s", address) + + srvcs, err := device.DiscoverServices(nil) + if err != nil { + return fmt.Errorf("could not discover services for %s: %v", address, err) + } + + columns := []string{"Service > Characteristics", "Properties", "Data"} + rows := make([][]string, 0) + + knownDev.ResetServices() + + for _, svc := range srvcs { + service := network.NewBLEService(strings.ToLower(svc.UUID().String())) + + mod.Session.Events.Add("ble.device.service.discovered", svc) + + name := "" + if service.Name == "" { + name = svc.UUID().String() + } else { + name = fmt.Sprintf("%s (%s)", tui.Green(service.Name), tui.Dim(svc.UUID().String())) + } + + row := []string{ + name, + "", + "", + } + + rows = append(rows, row) + + chars, err := svc.DiscoverCharacteristics(nil) + if err != nil { + mod.Error("error while enumerating chars for service %s: %s", svc.UUID(), err) + } else { + for _, ch := range chars { + char := network.NewBLECharacteristic(strings.ToLower(ch.UUID().String())) + if mtu, err := ch.GetMTU(); err != nil { + mod.Warning("can't read %v mtu: %v", ch.UUID(), err) + } else { + char.MTU = mtu + } + + if props, err := ch.Properties(); err != nil { + + } else { + + } + + mod.Session.Events.Add("ble.device.characteristic.discovered", ch) + + name := char.Name + if name == "" { + name = " " + ch.UUID().String() + } else { + name = fmt.Sprintf(" %s (%s)", tui.Green(name), tui.Dim(ch.UUID().String())) + } + + data := "" + multi := ([]string)(nil) + raw := make([]byte, 255) + if n, err := ch.Read(raw); err == nil { + raw = raw[0:n] + char.Properties = []string{"READ"} + data = parseRawData(raw) + } + + if multi == nil { + char.Data = data + rows = append(rows, []string{ + name, + strings.Join(char.Properties, ", "), + data, + }) + } else { + char.Data = multi + for i, m := range multi { + if i == 0 { + rows = append(rows, []string{ + name, + strings.Join(char.Properties, ", "), + m, + }) + } else { + rows = append(rows, []string{"", "", "", m}) + } + } + } + + service.Characteristics = append(service.Characteristics, char) + } + // blank row after every service, bleah style + rows = append(rows, []string{"", "", ""}) + } + + knownDev.AddService(service) + } + + tui.Table(mod.Session.Events.Stdout, columns, rows) + + if err := device.Disconnect(); err != nil { + mod.Warning("error disconnecting from %s: %v", address, err) + } else { + mod.Info("disconnected from %s", address) + } + + return nil +} diff --git a/modules/ble/ble_options_darwin.go b/modules/ble/ble_options_darwin.go deleted file mode 100644 index 80eb64ef..00000000 --- a/modules/ble/ble_options_darwin.go +++ /dev/null @@ -1,19 +0,0 @@ -package ble - -import ( - "github.com/bettercap/gatt" -) - -func getClientOptions(deviceID int) []gatt.Option { - return []gatt.Option{ - gatt.MacDeviceRole(gatt.CentralManager), - } -} - -/* - -var defaultBLEServerOptions = []gatt.Option{ - gatt.MacDeviceRole(gatt.PeripheralManager), -} - -*/ diff --git a/modules/ble/ble_options_linux.go b/modules/ble/ble_options_linux.go deleted file mode 100644 index 2bc1519b..00000000 --- a/modules/ble/ble_options_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package ble - -import ( - "github.com/bettercap/gatt" - // "github.com/bettercap/gatt/linux/cmd" -) - -func getClientOptions(deviceID int) []gatt.Option { - return []gatt.Option{ - gatt.LnxMaxConnections(255), - gatt.LnxDeviceID(deviceID, true), - } -} - -/* - -var defaultBLEServerOptions = []gatt.Option{ - gatt.LnxMaxConnections(255), - gatt.LnxDeviceID(-1, true), - gatt.LnxSetAdvertisingParameters(&cmd.LESetAdvertisingParameters{ - AdvertisingIntervalMin: 0x00f4, - AdvertisingIntervalMax: 0x00f4, - AdvertisingChannelMap: 0x7, - }), -} - -*/ diff --git a/modules/ble/ble_recon.go b/modules/ble/ble_recon.go index f8422136..e6cd9fcd 100644 --- a/modules/ble/ble_recon.go +++ b/modules/ble/ble_recon.go @@ -1,31 +1,54 @@ -//go:build !windows && !freebsd && !openbsd && !netbsd -// +build !windows,!freebsd,!openbsd,!netbsd - package ble import ( - "encoding/hex" + "errors" "fmt" - golog "log" + "strings" + "sync" "time" "github.com/bettercap/bettercap/v2/modules/utils" "github.com/bettercap/bettercap/v2/network" "github.com/bettercap/bettercap/v2/session" - - "github.com/bettercap/gatt" - - "github.com/evilsocket/islazy/str" + "tinygo.org/x/bluetooth" ) +type CurrentDevice struct { + sync.RWMutex + + device string + connected bool + writeData []byte + writeTarget string +} + +func (dev *CurrentDevice) IsEnumerating() bool { + dev.RLock() + defer dev.RUnlock() + return dev.device != "" +} + +func (dev *CurrentDevice) Reset() { + dev.Lock() + defer dev.Unlock() + dev.device = "" + dev.connected = false + dev.writeData = nil + dev.writeTarget = "" +} + +func (dev *CurrentDevice) ResetWrite() { + dev.Lock() + defer dev.Unlock() + dev.writeData = nil + dev.writeTarget = "" +} + type BLERecon struct { session.SessionModule - deviceId int - gattDevice gatt.Device - currDevice *network.BLEDevice - writeUUID *gatt.UUID - writeData []byte - connected bool + current *CurrentDevice + // deviceId int + adapter *bluetooth.Adapter connTimeout int devTTL int quit chan bool @@ -36,14 +59,12 @@ type BLERecon struct { func NewBLERecon(s *session.Session) *BLERecon { mod := &BLERecon{ SessionModule: session.NewSessionModule("ble.recon", s), - deviceId: -1, - gattDevice: nil, - quit: make(chan bool), - done: make(chan bool), - connTimeout: 5, - devTTL: 30, - currDevice: nil, - connected: false, + // deviceId: -1, + quit: make(chan bool), + done: make(chan bool), + connTimeout: 5, + devTTL: 30, + current: &CurrentDevice{}, } mod.InitState("scanning") @@ -80,43 +101,41 @@ func NewBLERecon(s *session.Session) *BLERecon { enum := session.NewModuleHandler("ble.enum MAC", "ble.enum "+network.BLEMacValidator, "Enumerate services and characteristics for the given BLE device.", func(args []string) error { - if mod.isEnumerating() { - return fmt.Errorf("An enumeration for %s is already running, please wait.", mod.currDevice.Device.ID()) + if !mod.Running() { + return errors.New("module is not running") + } else if mod.current.IsEnumerating() { + return fmt.Errorf("an enumeration for %s is already running, please wait", mod.current.device) } - - mod.writeData = nil - mod.writeUUID = nil - - return mod.enumAllTheThings(network.NormalizeMac(args[0])) + return mod.startEnumeration(mod.normalizeAddress(args[0])) }) enum.Complete("ble.enum", s.BLECompleter) mod.AddHandler(enum) - write := session.NewModuleHandler("ble.write MAC UUID HEX_DATA", "ble.write "+network.BLEMacValidator+" ([a-fA-F0-9]+) ([a-fA-F0-9]+)", - "Write the HEX_DATA buffer to the BLE device with the specified MAC address, to the characteristics with the given UUID.", - func(args []string) error { - mac := network.NormalizeMac(args[0]) - uuid, err := gatt.ParseUUID(args[1]) - if err != nil { - return fmt.Errorf("Error parsing %s: %s", args[1], err) - } - data, err := hex.DecodeString(args[2]) - if err != nil { - return fmt.Errorf("Error parsing %s: %s", args[2], err) - } + /* + write := session.NewModuleHandler("ble.write MAC UUID HEX_DATA", "ble.write "+network.BLEMacValidator+" ([a-fA-F0-9]+) ([a-fA-F0-9]+)", + "Write the HEX_DATA buffer to the BLE device with the specified MAC address, to the characteristics with the given UUID.", + func(args []string) error { + mac := mod.normalizeAddress(args[0]) + uuid := args[1] + data, err := hex.DecodeString(args[2]) + if err != nil { + return fmt.Errorf("Error parsing %s: %s", args[2], err) + } + return mod.writeBuffer(mac, uuid, data) + }) - return mod.writeBuffer(mac, uuid, data) - }) + write.Complete("ble.write", s.BLECompleter) - write.Complete("ble.write", s.BLECompleter) - mod.AddHandler(write) - - mod.AddParam(session.NewIntParameter("ble.device", - fmt.Sprintf("%d", mod.deviceId), - "Index of the HCI device to use, -1 to autodetect.")) + mod.AddHandler(write) + */ + /* + mod.AddParam(session.NewIntParameter("ble.device", + fmt.Sprintf("%d", mod.deviceId), + "Index of the HCI device to use, -1 to autodetect.")) + */ mod.AddParam(session.NewIntParameter("ble.timeout", fmt.Sprintf("%d", mod.connTimeout), @@ -141,44 +160,32 @@ func (mod BLERecon) Author() string { return "Simone Margaritelli " } -func (mod *BLERecon) isEnumerating() bool { - return mod.currDevice != nil -} - -type dummyWriter struct { - mod *BLERecon -} - -func (w dummyWriter) Write(p []byte) (n int, err error) { - w.mod.Debug("[gatt.log] %s", str.Trim(string(p))) - return len(p), nil +func (mod *BLERecon) normalizeAddress(address string) string { + // macOS does not provide real MACs + if !strings.ContainsRune(address, '-') { + address = network.NormalizeMac(address) + } + return address } func (mod *BLERecon) Configure() (err error) { if mod.Running() { return session.ErrAlreadyStarted(mod.Name()) - } else if mod.gattDevice == nil { - if err, mod.deviceId = mod.IntParam("ble.device"); err != nil { + } else if mod.adapter == nil { + /* + if err, mod.deviceId = mod.IntParam("ble.device"); err != nil { + return err + } + + mod.Debug("initializing device (id:%d) ...", mod.deviceId) + */ + + mod.Debug("initializing device ...") + + mod.adapter = bluetooth.DefaultAdapter + if err := mod.adapter.Enable(); err != nil { return err } - - mod.Debug("initializing device (id:%d) ...", mod.deviceId) - - golog.SetFlags(0) - golog.SetOutput(dummyWriter{mod}) - - if mod.gattDevice, err = gatt.NewDevice(getClientOptions(mod.deviceId)...); err != nil { - mod.Debug("error while creating new gatt device: %v", err) - return err - } - - mod.gattDevice.Handle( - gatt.PeripheralDiscovered(mod.onPeriphDiscovered), - gatt.PeripheralConnected(mod.onPeriphConnected), - gatt.PeripheralDisconnected(mod.onPeriphDisconnected), - ) - - mod.gattDevice.Init(mod.onStateChanged) } if err, mod.connTimeout = mod.IntParam("ble.timeout"); err != nil { @@ -190,6 +197,10 @@ func (mod *BLERecon) Configure() (err error) { return nil } +func (mod *BLERecon) onDevice(adapter *bluetooth.Adapter, scanResult bluetooth.ScanResult) { + mod.Session.BLE.AddIfNew(mod.normalizeAddress(scanResult.Address.String()), scanResult) +} + func (mod *BLERecon) Start() error { if err := mod.Configure(); err != nil { return err @@ -198,22 +209,8 @@ func (mod *BLERecon) Start() error { return mod.SetRunning(true, func() { go mod.pruner() - <-mod.quit - - if mod.gattDevice != nil { - mod.Info("stopping scan ...") - - if mod.currDevice != nil && mod.currDevice.Device != nil { - mod.Debug("resetting connection with %v", mod.currDevice.Device) - mod.gattDevice.CancelConnection(mod.currDevice.Device) - } - - mod.Debug("stopping device") - if err := mod.gattDevice.Stop(); err != nil { - mod.Warning("error while stopping device: %v", err) - } else { - mod.Debug("gatt device closed") - } + if err := mod.adapter.Scan(mod.onDevice); err != nil { + mod.Error("could not perform scan: %v", err) } mod.done <- true @@ -222,11 +219,17 @@ func (mod *BLERecon) Start() error { func (mod *BLERecon) Stop() error { return mod.SetRunning(false, func() { - mod.quit <- true - <-mod.done + if mod.adapter != nil { + mod.Debug("stopping scan") + if err := mod.adapter.StopScan(); err != nil { + mod.Warning("error stopping scan: %v", err) + } + <-mod.done + } + mod.Debug("module stopped, cleaning state") - mod.gattDevice = nil - mod.setCurrentDevice(nil) + // mod.adapter = nil + mod.current.Reset() mod.ResetState() }) } @@ -238,51 +241,9 @@ func (mod *BLERecon) pruner() { for mod.Running() { for _, dev := range mod.Session.BLE.Devices() { if time.Since(dev.LastSeen) > blePresentInterval { - mod.Session.BLE.Remove(dev.Device.ID()) + mod.Session.BLE.Remove(mod.normalizeAddress(dev.Address)) } } - time.Sleep(5 * time.Second) } } - -func (mod *BLERecon) setCurrentDevice(dev *network.BLEDevice) { - mod.connected = false - mod.currDevice = dev - mod.State.Store("scanning", dev) -} - -func (mod *BLERecon) writeBuffer(mac string, uuid gatt.UUID, data []byte) error { - mod.writeUUID = &uuid - mod.writeData = data - return mod.enumAllTheThings(mac) -} - -func (mod *BLERecon) enumAllTheThings(mac string) error { - dev, found := mod.Session.BLE.Get(mac) - if !found || dev == nil { - return fmt.Errorf("BLE device with address %s not found.", mac) - } else if mod.Running() { - mod.gattDevice.StopScanning() - } - - mod.setCurrentDevice(dev) - if err := mod.Configure(); err != nil && err.Error() != session.ErrAlreadyStarted("ble.recon").Error() { - return err - } - - mod.Info("connecting to %s ...", mac) - - go func() { - time.Sleep(time.Duration(mod.connTimeout) * time.Second) - if mod.isEnumerating() && !mod.connected { - mod.Warning("connection timeout") - mod.Session.Events.Add("ble.connection.timeout", mod.currDevice) - mod.onPeriphDisconnected(nil, nil) - } - }() - - mod.gattDevice.Connect(dev.Device) - - return nil -} diff --git a/modules/ble/ble_recon_events.go b/modules/ble/ble_recon_events.go deleted file mode 100644 index f31c618c..00000000 --- a/modules/ble/ble_recon_events.go +++ /dev/null @@ -1,77 +0,0 @@ -//go:build !windows && !freebsd && !openbsd && !netbsd -// +build !windows,!freebsd,!openbsd,!netbsd - -package ble - -import ( - "github.com/bettercap/gatt" -) - -func (mod *BLERecon) onStateChanged(dev gatt.Device, s gatt.State) { - mod.Debug("state changed to %v", s) - - switch s { - case gatt.StatePoweredOn: - if mod.currDevice == nil { - mod.Debug("starting discovery ...") - dev.Scan([]gatt.UUID{}, true) - } else { - mod.Debug("current device was not cleaned: %v", mod.currDevice) - } - case gatt.StatePoweredOff: - mod.Debug("resetting device instance") - mod.gattDevice.StopScanning() - mod.setCurrentDevice(nil) - mod.gattDevice = nil - - default: - mod.Warning("unexpected state: %v", s) - } -} - -func (mod *BLERecon) onPeriphDiscovered(p gatt.Peripheral, a *gatt.Advertisement, rssi int) { - mod.Session.BLE.AddIfNew(p.ID(), p, a, rssi) -} - -func (mod *BLERecon) onPeriphDisconnected(p gatt.Peripheral, err error) { - mod.Session.Events.Add("ble.device.disconnected", mod.currDevice) - mod.setCurrentDevice(nil) - if mod.Running() { - mod.Debug("device disconnected, restoring discovery.") - mod.gattDevice.Scan([]gatt.UUID{}, true) - } -} - -func (mod *BLERecon) onPeriphConnected(p gatt.Peripheral, err error) { - if err != nil { - mod.Warning("connected to %s but with error: %s", p.ID(), err) - return - } else if mod.currDevice == nil { - mod.Warning("connected to %s but after the timeout :(", p.ID()) - return - } - - mod.connected = true - - defer func(per gatt.Peripheral) { - mod.Debug("disconnecting from %s ...", per.ID()) - per.Device().CancelConnection(per) - mod.setCurrentDevice(nil) - }(p) - - mod.Session.Events.Add("ble.device.connected", mod.currDevice) - - if err := p.SetMTU(500); err != nil { - mod.Warning("failed to set MTU: %s", err) - } - - mod.Debug("connected, enumerating all the things for %s!", p.ID()) - services, err := p.DiscoverServices(nil) - // https://github.com/bettercap/bettercap/issues/498 - if err != nil && err.Error() != "success" { - mod.Error("error discovering services: %s", err) - return - } - - mod.showServices(p, services) -} diff --git a/modules/ble/ble_show.go b/modules/ble/ble_show.go index d579a679..a7077871 100644 --- a/modules/ble/ble_show.go +++ b/modules/ble/ble_show.go @@ -1,6 +1,3 @@ -//go:build !windows && !freebsd && !openbsd && !netbsd -// +build !windows,!freebsd,!openbsd,!netbsd - package ble import ( @@ -9,7 +6,6 @@ import ( "github.com/bettercap/bettercap/v2/network" - "github.com/evilsocket/islazy/ops" "github.com/evilsocket/islazy/tui" ) @@ -18,10 +14,9 @@ var ( ) func (mod *BLERecon) getRow(dev *network.BLEDevice, withName bool) []string { - rssi := network.ColorRSSI(dev.RSSI) - address := network.NormalizeMac(dev.Device.ID()) - vendor := tui.Dim(ops.Ternary(dev.Vendor == "", dev.Advertisement.Company, dev.Vendor).(string)) - isConnectable := ops.Ternary(dev.Advertisement.Connectable, tui.Green("✔"), tui.Red("✖")).(string) + rssi := network.ColorRSSI(int(dev.RSSI)) + address := dev.Address + vendor := tui.Dim(dev.Vendor) sinceSeen := time.Since(dev.LastSeen) lastSeen := dev.LastSeen.Format("15:04:05") @@ -37,10 +32,8 @@ func (mod *BLERecon) getRow(dev *network.BLEDevice, withName bool) []string { return []string{ rssi, address, - tui.Yellow(dev.Name()), + tui.Yellow(dev.Name), vendor, - dev.Advertisement.Flags.String(), - isConnectable, lastSeen, } } else { @@ -48,8 +41,6 @@ func (mod *BLERecon) getRow(dev *network.BLEDevice, withName bool) []string { rssi, address, vendor, - dev.Advertisement.Flags.String(), - isConnectable, lastSeen, } } @@ -59,8 +50,8 @@ func (mod *BLERecon) doFilter(dev *network.BLEDevice) bool { if mod.selector.Expression == nil { return true } - return mod.selector.Expression.MatchString(dev.Device.ID()) || - mod.selector.Expression.MatchString(dev.Device.Name()) || + return mod.selector.Expression.MatchString(dev.Address) || + mod.selector.Expression.MatchString(dev.Name) || mod.selector.Expression.MatchString(dev.Vendor) } @@ -109,10 +100,10 @@ func (mod *BLERecon) doSelection() (devices []*network.BLEDevice, err error) { } func (mod *BLERecon) colNames(withName bool) []string { - colNames := []string{"RSSI", "MAC", "Vendor", "Flags", "Connect", "Seen"} + colNames := []string{"RSSI", "MAC", "Vendor", "Seen"} seenIdx := 5 if withName { - colNames = []string{"RSSI", "MAC", "Name", "Vendor", "Flags", "Connect", "Seen"} + colNames = []string{"RSSI", "MAC", "Name", "Vendor", "Seen"} seenIdx = 6 } switch mod.selector.SortField { @@ -134,7 +125,7 @@ func (mod *BLERecon) Show() error { hasName := false for _, dev := range devices { - if dev.Name() != "" { + if dev.Name != "" { hasName = true break } diff --git a/modules/ble/ble_show_services.go b/modules/ble/ble_show_services.go index 36ba82de..04447594 100644 --- a/modules/ble/ble_show_services.go +++ b/modules/ble/ble_show_services.go @@ -1,20 +1,6 @@ -//go:build !windows && !freebsd && !openbsd && !netbsd -// +build !windows,!freebsd,!openbsd,!netbsd - package ble -import ( - "encoding/binary" - "fmt" - "strconv" - "strings" - - "github.com/bettercap/bettercap/v2/network" - "github.com/bettercap/gatt" - - "github.com/evilsocket/islazy/tui" -) - +/* var appearances = map[uint16]string{ 0: "Unknown", 64: "Generic Phone", @@ -410,3 +396,4 @@ func (mod *BLERecon) showServices(p gatt.Peripheral, services []*gatt.Service) { mod.Session.Refresh() } } +*/ diff --git a/modules/ble/ble_show_sort.go b/modules/ble/ble_show_sort.go index 9bf85db2..6f88243b 100644 --- a/modules/ble/ble_show_sort.go +++ b/modules/ble/ble_show_sort.go @@ -1,6 +1,3 @@ -//go:build !windows && !freebsd && !openbsd && !netbsd -// +build !windows,!freebsd,!openbsd,!netbsd - package ble import ( @@ -13,7 +10,7 @@ func (a ByBLERSSISorter) Len() int { return len(a) } func (a ByBLERSSISorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a ByBLERSSISorter) Less(i, j int) bool { if a[i].RSSI == a[j].RSSI { - return a[i].Device.ID() < a[j].Device.ID() + return a[i].Address < a[j].Address } return a[i].RSSI > a[j].RSSI } @@ -23,7 +20,7 @@ type ByBLEMacSorter []*network.BLEDevice func (a ByBLEMacSorter) Len() int { return len(a) } func (a ByBLEMacSorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a ByBLEMacSorter) Less(i, j int) bool { - return a[i].Device.ID() < a[j].Device.ID() + return a[i].Address < a[j].Address } type ByBLESeenSorter []*network.BLEDevice diff --git a/modules/ble/ble_unsupported.go b/modules/ble/ble_unsupported.go deleted file mode 100644 index 52db3da6..00000000 --- a/modules/ble/ble_unsupported.go +++ /dev/null @@ -1,56 +0,0 @@ -//go:build windows || freebsd || netbsd || openbsd -// +build windows freebsd netbsd openbsd - -package ble - -import ( - "github.com/bettercap/bettercap/v2/session" -) - -type BLERecon struct { - session.SessionModule -} - -func NewBLERecon(s *session.Session) *BLERecon { - mod := &BLERecon{ - SessionModule: session.NewSessionModule("ble.recon", s), - } - - mod.AddHandler(session.NewModuleHandler("ble.recon on", "", - "Start Bluetooth Low Energy devices discovery.", - func(args []string) error { - return session.ErrNotSupported - })) - - mod.AddHandler(session.NewModuleHandler("ble.recon off", "", - "Stop Bluetooth Low Energy devices discovery.", - func(args []string) error { - return session.ErrNotSupported - })) - - return mod -} - -func (mod BLERecon) Name() string { - return "ble.recon" -} - -func (mod BLERecon) Description() string { - return "Bluetooth Low Energy devices discovery." -} - -func (mod BLERecon) Author() string { - return "Simone Margaritelli " -} - -func (mod *BLERecon) Configure() (err error) { - return session.ErrNotSupported -} - -func (mod *BLERecon) Start() error { - return session.ErrNotSupported -} - -func (mod *BLERecon) Stop() error { - return session.ErrNotSupported -} diff --git a/modules/events_stream/events_view_ble.go b/modules/events_stream/events_view_ble.go index a3a7ed61..b0d37853 100644 --- a/modules/events_stream/events_view_ble.go +++ b/modules/events_stream/events_view_ble.go @@ -16,7 +16,7 @@ import ( func (mod *EventsStream) viewBLEEvent(output io.Writer, e session.Event) { if e.Tag == "ble.device.new" { dev := e.Data.(*network.BLEDevice) - name := dev.Device.Name() + name := dev.Name if name != "" { name = " " + tui.Bold(name) } @@ -29,12 +29,12 @@ func (mod *EventsStream) viewBLEEvent(output io.Writer, e session.Event) { e.Time.Format(mod.timeFormat), tui.Green(e.Tag), name, - dev.Device.ID(), + dev.Address, vend, tui.Dim(fmt.Sprintf("%d dBm", dev.RSSI))) } else if e.Tag == "ble.device.lost" { dev := e.Data.(*network.BLEDevice) - name := dev.Device.Name() + name := dev.Name if name != "" { name = " " + tui.Bold(name) } @@ -47,7 +47,7 @@ func (mod *EventsStream) viewBLEEvent(output io.Writer, e session.Event) { e.Time.Format(mod.timeFormat), tui.Green(e.Tag), name, - dev.Device.ID(), + dev.Address, vend) } } diff --git a/modules/graph/create.go b/modules/graph/create.go index 0accf6a7..3da557fa 100644 --- a/modules/graph/create.go +++ b/modules/graph/create.go @@ -149,7 +149,7 @@ func (mod *Module) createDot11ProbeGraph(ssid string, station *network.Station) } func (mod *Module) createBLEServerGraph(dev *network.BLEDevice) (*Node, bool, error) { - mac := network.NormalizeMac(dev.Device.ID()) + mac := dev.Address node, err := mod.db.FindNode(BLEServer, mac) isNew := node == nil if err != nil { diff --git a/network/ble.go b/network/ble.go index a026d0ae..16ac9106 100644 --- a/network/ble.go +++ b/network/ble.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package network @@ -5,14 +6,12 @@ package network import ( "encoding/json" "sync" - "time" - - "github.com/bettercap/gatt" "github.com/evilsocket/islazy/data" + "tinygo.org/x/bluetooth" ) -const BLEMacValidator = "([a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2}:[a-fA-F0-9]{1,2})" +const BLEMacValidator = "([a-fA-F0-9:\\-]+)" type BLEDevNewCallback func(dev *BLEDevice) type BLEDevLostCallback func(dev *BLEDevice) @@ -53,28 +52,23 @@ func (b *BLE) Get(id string) (dev *BLEDevice, found bool) { return } -func (b *BLE) AddIfNew(id string, p gatt.Peripheral, a *gatt.Advertisement, rssi int) *BLEDevice { +func (b *BLE) AddIfNew(id string, scanResult bluetooth.ScanResult) *BLEDevice { b.Lock() defer b.Unlock() - id = NormalizeMac(id) - alias := b.aliases.GetOr(id, "") + devAlias := b.aliases.GetOr(id, "") if dev, found := b.devices[id]; found { - dev.LastSeen = time.Now() - dev.RSSI = rssi - dev.Advertisement = a - if alias != "" { - dev.Alias = alias - } + dev.Update(scanResult, devAlias) return dev } - newDev := NewBLEDevice(p, a, rssi) - newDev.Alias = alias - b.devices[id] = newDev + dev := NewBLEDevice(scanResult) + dev.Update(scanResult, devAlias) + + b.devices[id] = dev if b.newCb != nil { - b.newCb(newDev) + b.newCb(dev) } return nil @@ -84,7 +78,6 @@ func (b *BLE) Remove(id string) { b.Lock() defer b.Unlock() - id = NormalizeMac(id) if dev, found := b.devices[id]; found { delete(b.devices, id) if b.lostCb != nil { diff --git a/network/ble_characteristics.go b/network/ble_characteristics.go new file mode 100644 index 00000000..307ea045 --- /dev/null +++ b/network/ble_characteristics.go @@ -0,0 +1,615 @@ +package network + +var BLE_Characteristics = map[string]string{ + "00002a7e-0000-1000-8000-00805f9b34fb": "Aerobic Heart Rate Lower Limit", + "00002a84-0000-1000-8000-00805f9b34fb": "Aerobic Heart Rate Upper Limit", + "00002a7f-0000-1000-8000-00805f9b34fb": "Aerobic Threshold", + "00002a80-0000-1000-8000-00805f9b34fb": "Age", + "00002a5a-0000-1000-8000-00805f9b34fb": "Aggregate", + "00002a43-0000-1000-8000-00805f9b34fb": "Alert Category ID", + "00002a42-0000-1000-8000-00805f9b34fb": "Alert Category ID Bit Mask", + "00002a06-0000-1000-8000-00805f9b34fb": "Alert Level", + "00002a44-0000-1000-8000-00805f9b34fb": "Alert Notification Control Point", + "00002a3f-0000-1000-8000-00805f9b34fb": "Alert Status", + "00002ab3-0000-1000-8000-00805f9b34fb": "Altitude", + "00002a81-0000-1000-8000-00805f9b34fb": "Anaerobic Heart Rate Lower Limit", + "00002a82-0000-1000-8000-00805f9b34fb": "Anaerobic Heart Rate Upper Limit", + "00002a83-0000-1000-8000-00805f9b34fb": "Anaerobic Threshold", + "00002a58-0000-1000-8000-00805f9b34fb": "Analog", + "00002a59-0000-1000-8000-00805f9b34fb": "Analog Output", + "00002a73-0000-1000-8000-00805f9b34fb": "Apparent Wind Direction", + "00002a72-0000-1000-8000-00805f9b34fb": "Apparent Wind Speed", + "00002a01-0000-1000-8000-00805f9b34fb": "Appearance", + "00002aa3-0000-1000-8000-00805f9b34fb": "Barometric Pressure Trend", + "00002be9-0000-1000-8000-00805f9b34fb": "Battery Critical Status", + "00002bf0-0000-1000-8000-00805f9b34fb": "Battery Energy Status", + "00002beb-0000-1000-8000-00805f9b34fb": "Battery Health Information", + "00002bea-0000-1000-8000-00805f9b34fb": "Battery Health Status", + "00002bec-0000-1000-8000-00805f9b34fb": "Battery Information", + "00002a19-0000-1000-8000-00805f9b34fb": "Battery Level", + "00002a1b-0000-1000-8000-00805f9b34fb": "Battery Level State", + "00002bed-0000-1000-8000-00805f9b34fb": "Battery Level Status", + "00002a1a-0000-1000-8000-00805f9b34fb": "Battery Power State", + "00002bee-0000-1000-8000-00805f9b34fb": "Battery Time Status", + "00002a49-0000-1000-8000-00805f9b34fb": "Blood Pressure Feature", + "00002a35-0000-1000-8000-00805f9b34fb": "Blood Pressure Measurement", + "00002a9b-0000-1000-8000-00805f9b34fb": "Body Composition Feature", + "00002a9c-0000-1000-8000-00805f9b34fb": "Body Composition Measurement", + "00002a38-0000-1000-8000-00805f9b34fb": "Body Sensor Location", + "00002aa4-0000-1000-8000-00805f9b34fb": "Bond Management Control Point", + "00002aa5-0000-1000-8000-00805f9b34fb": "Bond Management Features", + "00002a22-0000-1000-8000-00805f9b34fb": "Boot Keyboard Input Report", + "00002a32-0000-1000-8000-00805f9b34fb": "Boot Keyboard Output Report", + "00002a33-0000-1000-8000-00805f9b34fb": "Boot Mouse Input Report", + "00002aa6-0000-1000-8000-00805f9b34fb": "Central Address Resolution", + "00002aa8-0000-1000-8000-00805f9b34fb": "CGM Feature", + "00002aa7-0000-1000-8000-00805f9b34fb": "CGM Measurement", + "00002aab-0000-1000-8000-00805f9b34fb": "CGM Session Run Time", + "00002aaa-0000-1000-8000-00805f9b34fb": "CGM Session Start Time", + "00002aac-0000-1000-8000-00805f9b34fb": "CGM Specific Ops Control Point", + "00002aa9-0000-1000-8000-00805f9b34fb": "CGM Status", + "00002ace-0000-1000-8000-00805f9b34fb": "Cross Trainer Data", + "00002a5c-0000-1000-8000-00805f9b34fb": "CSC Feature", + "00002a5b-0000-1000-8000-00805f9b34fb": "CSC Measurement", + "00002a2b-0000-1000-8000-00805f9b34fb": "Current Time", + "00002a66-0000-1000-8000-00805f9b34fb": "Cycling Power Control Point", + "00002a65-0000-1000-8000-00805f9b34fb": "Cycling Power Feature", + "00002a63-0000-1000-8000-00805f9b34fb": "Cycling Power Measurement", + "00002a64-0000-1000-8000-00805f9b34fb": "Cycling Power Vector", + "00002a99-0000-1000-8000-00805f9b34fb": "Database Change Increment", + "00002a85-0000-1000-8000-00805f9b34fb": "Date of Birth", + "00002a86-0000-1000-8000-00805f9b34fb": "Date of Threshold Assessment", + "00002a08-0000-1000-8000-00805f9b34fb": "Date Time", + "00002a0a-0000-1000-8000-00805f9b34fb": "Day Date Time", + "00002a09-0000-1000-8000-00805f9b34fb": "Day of Week", + "00002a7d-0000-1000-8000-00805f9b34fb": "Descriptor Value Changed", + "00002a00-0000-1000-8000-00805f9b34fb": "Device Name", + "00002a7b-0000-1000-8000-00805f9b34fb": "Dew Point", + "00002a56-0000-1000-8000-00805f9b34fb": "Digital", + "00002a57-0000-1000-8000-00805f9b34fb": "Digital Output", + "00002a0d-0000-1000-8000-00805f9b34fb": "DST Offset", + "00002a6c-0000-1000-8000-00805f9b34fb": "Elevation", + "00002a87-0000-1000-8000-00805f9b34fb": "Email Address", + "00002bef-0000-1000-8000-00805f9b34fb": "Estimated Service Date", + "00002a0b-0000-1000-8000-00805f9b34fb": "Exact Time 100", + "00002a0c-0000-1000-8000-00805f9b34fb": "Exact Time 256", + "00002a88-0000-1000-8000-00805f9b34fb": "Fat Burn Heart Rate Lower Limit", + "00002a89-0000-1000-8000-00805f9b34fb": "Fat Burn Heart Rate Upper Limit", + "00002a26-0000-1000-8000-00805f9b34fb": "Firmware Revision String", + "00002a8a-0000-1000-8000-00805f9b34fb": "First Name", + "00002ad9-0000-1000-8000-00805f9b34fb": "Fitness Machine Control Point", + "00002acc-0000-1000-8000-00805f9b34fb": "Fitness Machine Feature", + "00002ada-0000-1000-8000-00805f9b34fb": "Fitness Machine Status", + "00002a8b-0000-1000-8000-00805f9b34fb": "Five Zone Heart Rate Limits", + "00002ab2-0000-1000-8000-00805f9b34fb": "Floor Number", + "00002a8c-0000-1000-8000-00805f9b34fb": "Gender", + "00002a51-0000-1000-8000-00805f9b34fb": "Glucose Feature", + "00002a18-0000-1000-8000-00805f9b34fb": "Glucose Measurement", + "00002a34-0000-1000-8000-00805f9b34fb": "Glucose Measurement Context", + "00002a74-0000-1000-8000-00805f9b34fb": "Gust Factor", + "00002a27-0000-1000-8000-00805f9b34fb": "Hardware Revision String", + "00002a39-0000-1000-8000-00805f9b34fb": "Heart Rate Control Point", + "00002a8d-0000-1000-8000-00805f9b34fb": "Heart Rate Max", + "00002a37-0000-1000-8000-00805f9b34fb": "Heart Rate Measurement", + "00002a7a-0000-1000-8000-00805f9b34fb": "Heat Index", + "00002a8e-0000-1000-8000-00805f9b34fb": "Height", + "00002a4c-0000-1000-8000-00805f9b34fb": "HID Control Point", + "00002a4a-0000-1000-8000-00805f9b34fb": "HID Information", + "00002a8f-0000-1000-8000-00805f9b34fb": "Hip Circumference", + "00002aba-0000-1000-8000-00805f9b34fb": "HTTP Control Point", + "00002ab9-0000-1000-8000-00805f9b34fb": "HTTP Entity Body", + "00002ab7-0000-1000-8000-00805f9b34fb": "HTTP Headers", + "00002ab8-0000-1000-8000-00805f9b34fb": "HTTP Status Code", + "00002abb-0000-1000-8000-00805f9b34fb": "HTTPS Security", + "00002a6f-0000-1000-8000-00805f9b34fb": "Humidity", + "00002b22-0000-1000-8000-00805f9b34fb": "IDD Annunciation Status", + "00002b25-0000-1000-8000-00805f9b34fb": "IDD Command Control Point", + "00002b26-0000-1000-8000-00805f9b34fb": "IDD Command Data", + "00002b23-0000-1000-8000-00805f9b34fb": "IDD Features", + "00002b28-0000-1000-8000-00805f9b34fb": "IDD History Data", + "00002b27-0000-1000-8000-00805f9b34fb": "IDD Record Access Control Point", + "00002b21-0000-1000-8000-00805f9b34fb": "IDD Status", + "00002b20-0000-1000-8000-00805f9b34fb": "IDD Status Changed", + "00002b24-0000-1000-8000-00805f9b34fb": "IDD Status Reader Control Point", + "00002a2a-0000-1000-8000-00805f9b34fb": "IEEE 11073-20601 Regulatory Certification Data List", + "00002ad2-0000-1000-8000-00805f9b34fb": "Indoor Bike Data", + "00002aad-0000-1000-8000-00805f9b34fb": "Indoor Positioning Configuration", + "00002a36-0000-1000-8000-00805f9b34fb": "Intermediate Cuff Pressure", + "00002a1e-0000-1000-8000-00805f9b34fb": "Intermediate Temperature", + "00002a77-0000-1000-8000-00805f9b34fb": "Irradiance", + "00002aa2-0000-1000-8000-00805f9b34fb": "Language", + "00002a90-0000-1000-8000-00805f9b34fb": "Last Name", + "00002aae-0000-1000-8000-00805f9b34fb": "Latitude", + "00002a6b-0000-1000-8000-00805f9b34fb": "LN Control Point", + "00002a6a-0000-1000-8000-00805f9b34fb": "LN Feature", + "00002ab1-0000-1000-8000-00805f9b34fb": "Local East Coordinate", + "00002ab0-0000-1000-8000-00805f9b34fb": "Local North Coordinate", + "00002a0f-0000-1000-8000-00805f9b34fb": "Local Time Information", + "00002a67-0000-1000-8000-00805f9b34fb": "Location and Speed Characteristic", + "00002ab5-0000-1000-8000-00805f9b34fb": "Location Name", + "00002aaf-0000-1000-8000-00805f9b34fb": "Longitude", + "00002a2c-0000-1000-8000-00805f9b34fb": "Magnetic Declination", + "00002aa0-0000-1000-8000-00805f9b34fb": "Magnetic Flux Density - 2D", + "00002aa1-0000-1000-8000-00805f9b34fb": "Magnetic Flux Density - 3D", + "00002a29-0000-1000-8000-00805f9b34fb": "Manufacturer Name String", + "00002a91-0000-1000-8000-00805f9b34fb": "Maximum Recommended Heart Rate", + "00002a21-0000-1000-8000-00805f9b34fb": "Measurement Interval", + "00002a24-0000-1000-8000-00805f9b34fb": "Model Number String", + "00002a68-0000-1000-8000-00805f9b34fb": "Navigation", + "00002a3e-0000-1000-8000-00805f9b34fb": "Network Availability", + "00002a46-0000-1000-8000-00805f9b34fb": "New Alert", + "00002ac5-0000-1000-8000-00805f9b34fb": "Object Action Control Point", + "00002ac8-0000-1000-8000-00805f9b34fb": "Object Changed", + "00002ac1-0000-1000-8000-00805f9b34fb": "Object First-Created", + "00002ac3-0000-1000-8000-00805f9b34fb": "Object ID", + "00002ac2-0000-1000-8000-00805f9b34fb": "Object Last-Modified", + "00002ac6-0000-1000-8000-00805f9b34fb": "Object List Control Point", + "00002ac7-0000-1000-8000-00805f9b34fb": "Object List Filter", + "00002abe-0000-1000-8000-00805f9b34fb": "Object Name", + "00002ac4-0000-1000-8000-00805f9b34fb": "Object Properties", + "00002ac0-0000-1000-8000-00805f9b34fb": "Object Size", + "00002abf-0000-1000-8000-00805f9b34fb": "Object Type", + "00002abd-0000-1000-8000-00805f9b34fb": "OTS Feature", + "00002a04-0000-1000-8000-00805f9b34fb": "Peripheral Preferred Connection Parameters", + "00002a02-0000-1000-8000-00805f9b34fb": "Peripheral Privacy Flag", + "00002a5f-0000-1000-8000-00805f9b34fb": "PLX Continuous Measurement Characteristic", + "00002a60-0000-1000-8000-00805f9b34fb": "PLX Features", + "00002a5e-0000-1000-8000-00805f9b34fb": "PLX Spot-Check Measurement", + "00002a50-0000-1000-8000-00805f9b34fb": "PnP ID", + "00002a75-0000-1000-8000-00805f9b34fb": "Pollen Concentration", + "00002a2f-0000-1000-8000-00805f9b34fb": "Position 2D", + "00002a30-0000-1000-8000-00805f9b34fb": "Position 3D", + "00002a69-0000-1000-8000-00805f9b34fb": "Position Quality", + "00002a6d-0000-1000-8000-00805f9b34fb": "Pressure", + "00002a4e-0000-1000-8000-00805f9b34fb": "Protocol Mode", + "00002a62-0000-1000-8000-00805f9b34fb": "Pulse Oximetry Control Point", + "00002a78-0000-1000-8000-00805f9b34fb": "Rainfall", + "00002b1d-0000-1000-8000-00805f9b34fb": "RC Feature", + "00002b1e-0000-1000-8000-00805f9b34fb": "RC Settings", + "00002a03-0000-1000-8000-00805f9b34fb": "Reconnection Address", + "00002b1f-0000-1000-8000-00805f9b34fb": "Reconnection Configuration Control Point", + "00002a52-0000-1000-8000-00805f9b34fb": "Record Access Control Point", + "00002a14-0000-1000-8000-00805f9b34fb": "Reference Time Information", + "00002a3a-0000-1000-8000-00805f9b34fb": "Removable", + "00002a4d-0000-1000-8000-00805f9b34fb": "Report", + "00002a4b-0000-1000-8000-00805f9b34fb": "Report Map", + "00002ac9-0000-1000-8000-00805f9b34fb": "Resolvable Private Address Only", + "00002a92-0000-1000-8000-00805f9b34fb": "Resting Heart Rate", + "00002a40-0000-1000-8000-00805f9b34fb": "Ringer Control point", + "00002a41-0000-1000-8000-00805f9b34fb": "Ringer Setting", + "00002ad1-0000-1000-8000-00805f9b34fb": "Rower Data", + "00002a54-0000-1000-8000-00805f9b34fb": "RSC Feature", + "00002a53-0000-1000-8000-00805f9b34fb": "RSC Measurement", + "00002a55-0000-1000-8000-00805f9b34fb": "SC Control Point", + "00002a4f-0000-1000-8000-00805f9b34fb": "Scan Interval Window", + "00002a31-0000-1000-8000-00805f9b34fb": "Scan Refresh", + "00002a3c-0000-1000-8000-00805f9b34fb": "Scientific Temperature Celsius", + "00002a10-0000-1000-8000-00805f9b34fb": "Secondary Time Zone", + "00002a5d-0000-1000-8000-00805f9b34fb": "Sensor Location", + "00002a05-0000-1000-8000-00805f9b34fb": "Service Changed", + "00002a0e-0000-1000-8000-00805f9b34fb": "Time Zone", + "00002a11-0000-1000-8000-00805f9b34fb": "Time with DST", + "00002a12-0000-1000-8000-00805f9b34fb": "Time Accuracy", + "00002a13-0000-1000-8000-00805f9b34fb": "Time Source", + "00002a15-0000-1000-8000-00805f9b34fb": "Time Broadcast", + "00002a16-0000-1000-8000-00805f9b34fb": "Time Update Control Point", + "00002a17-0000-1000-8000-00805f9b34fb": "Time Update State", + "00002a25-0000-1000-8000-00805f9b34fb": "Serial Number String", + "00002a3b-0000-1000-8000-00805f9b34fb": "Service Required", + "00002a28-0000-1000-8000-00805f9b34fb": "Software Revision String", + "00002a93-0000-1000-8000-00805f9b34fb": "Sport Type for Aerobic and Anaerobic Thresholds", + "00002ad0-0000-1000-8000-00805f9b34fb": "Stair Climber Data", + "00002acf-0000-1000-8000-00805f9b34fb": "Step Climber Data", + "00002a3d-0000-1000-8000-00805f9b34fb": "String", + "00002ad7-0000-1000-8000-00805f9b34fb": "Supported Heart Rate Range", + "00002ad5-0000-1000-8000-00805f9b34fb": "Supported Inclination Range", + "00002a47-0000-1000-8000-00805f9b34fb": "Supported New Alert Category", + "00002ad8-0000-1000-8000-00805f9b34fb": "Supported Power Range", + "00002ad6-0000-1000-8000-00805f9b34fb": "Supported Resistance Level Range", + "00002ad4-0000-1000-8000-00805f9b34fb": "Supported Speed Range", + "00002a48-0000-1000-8000-00805f9b34fb": "Supported Unread Alert Category", + "00002a23-0000-1000-8000-00805f9b34fb": "System ID", + "00002abc-0000-1000-8000-00805f9b34fb": "TDS Control Point", + "00002a6e-0000-1000-8000-00805f9b34fb": "Temperature", + "00002a1f-0000-1000-8000-00805f9b34fb": "Temperature Celsius", + "00002a20-0000-1000-8000-00805f9b34fb": "Temperature Fahrenheit", + "00002a1c-0000-1000-8000-00805f9b34fb": "Temperature Measurement", + "00002a1d-0000-1000-8000-00805f9b34fb": "Temperature Type", + "00002a94-0000-1000-8000-00805f9b34fb": "Three Zone Heart Rate Limits", + "00002a70-0000-1000-8000-00805f9b34fb": "True Wind Speed", + "00002a71-0000-1000-8000-00805f9b34fb": "True Wind Direction", + "00002a95-0000-1000-8000-00805f9b34fb": "Two Zone Heart Rate Limit", + "00002a07-0000-1000-8000-00805f9b34fb": "Tx Power Level", + "00002ab4-0000-1000-8000-00805f9b34fb": "Uncertainty", + "00002a45-0000-1000-8000-00805f9b34fb": "Unread Alert Status", + "00002ab6-0000-1000-8000-00805f9b34fb": "URI", + "00002a9f-0000-1000-8000-00805f9b34fb": "User Control Point", + "00002a9a-0000-1000-8000-00805f9b34fb": "User Index", + "00002a76-0000-1000-8000-00805f9b34fb": "UV Index", + "00002a79-0000-1000-8000-00805f9b34fb": "Wind Chill", + "00002a96-0000-1000-8000-00805f9b34fb": "VO2 Max", + "00002a97-0000-1000-8000-00805f9b34fb": "Waist Circumference", + "00002a98-0000-1000-8000-00805f9b34fb": "Weight", + "00002a9d-0000-1000-8000-00805f9b34fb": "Weight Measurement", + "00002a9e-0000-1000-8000-00805f9b34fb": "Weight Scale Feature", + "00002acd-0000-1000-8000-00805f9b34fb": "Treadmill Data", + "00002ad3-0000-1000-8000-00805f9b34fb": "Training Status", + "00002ae0-0000-1000-8000-00805f9b34fb": "Average Current", + "00002ae1-0000-1000-8000-00805f9b34fb": "Average Voltage", + "00002ae2-0000-1000-8000-00805f9b34fb": "Boolean", + "00002ae3-0000-1000-8000-00805f9b34fb": "Chromatic Distance From Planckian", + "00002ae4-0000-1000-8000-00805f9b34fb": "Chromaticity Coordinates", + "00002ae5-0000-1000-8000-00805f9b34fb": "Chromaticity In CCT And Duv Values", + "00002ae6-0000-1000-8000-00805f9b34fb": "Chromaticity Tolerance", + "00002ae7-0000-1000-8000-00805f9b34fb": "CIE 13.3-1995 Color Rendering Index", + "00002ae8-0000-1000-8000-00805f9b34fb": "Coefficient", + "00002ae9-0000-1000-8000-00805f9b34fb": "Correlated Color Temperature", + "00002aea-0000-1000-8000-00805f9b34fb": "Count 16", + "00002aeb-0000-1000-8000-00805f9b34fb": "Count 24", + "00002aec-0000-1000-8000-00805f9b34fb": "Country Code", + "00002aed-0000-1000-8000-00805f9b34fb": "Date UTC", + "00002aee-0000-1000-8000-00805f9b34fb": "Electric Current", + "00002aef-0000-1000-8000-00805f9b34fb": "Electric Current Range", + "00002af0-0000-1000-8000-00805f9b34fb": "Electric Current Specification", + "00002af1-0000-1000-8000-00805f9b34fb": "Electric Current Statistics", + "00002af2-0000-1000-8000-00805f9b34fb": "Energy", + "00002af3-0000-1000-8000-00805f9b34fb": "Energy In A Period Of Day", + "00002af4-0000-1000-8000-00805f9b34fb": "Event Statistics", + "00002af5-0000-1000-8000-00805f9b34fb": "Fixed String 16", + "00002af6-0000-1000-8000-00805f9b34fb": "Fixed String 24", + "00002af7-0000-1000-8000-00805f9b34fb": "Fixed String 36", + "00002af8-0000-1000-8000-00805f9b34fb": "Fixed String 8", + "00002af9-0000-1000-8000-00805f9b34fb": "Generic Level", + "00002afa-0000-1000-8000-00805f9b34fb": "Global Trade Item Number", + "00002afb-0000-1000-8000-00805f9b34fb": "Illuminance", + "00002afc-0000-1000-8000-00805f9b34fb": "Luminous Efficacy", + "00002afd-0000-1000-8000-00805f9b34fb": "Luminous Energy", + "00002afe-0000-1000-8000-00805f9b34fb": "Luminous Exposure", + "00002aff-0000-1000-8000-00805f9b34fb": "Luminous Flux", + "00002b00-0000-1000-8000-00805f9b34fb": "Luminous Flux Range", + "00002b01-0000-1000-8000-00805f9b34fb": "Luminous Intensity", + "00002b02-0000-1000-8000-00805f9b34fb": "B02 Mass Flow", + "00002b03-0000-1000-8000-00805f9b34fb": "Perceived Lightness", + "00002b04-0000-1000-8000-00805f9b34fb": "Percentage 8", + "00002b05-0000-1000-8000-00805f9b34fb": "Power", + "00002b06-0000-1000-8000-00805f9b34fb": "Power Specification", + "00002b07-0000-1000-8000-00805f9b34fb": "Relative Runtime In A Current Range", + "00002b08-0000-1000-8000-00805f9b34fb": "Relative Runtime In A Generic Level Range", + "00002b09-0000-1000-8000-00805f9b34fb": "Relative Value In A Voltage Range", + "00002b0a-0000-1000-8000-00805f9b34fb": "Relative Value In An Illuminance Range", + "00002b0b-0000-1000-8000-00805f9b34fb": "Relative Value In A Period Of Day", + "00002b0c-0000-1000-8000-00805f9b34fb": "Relative Value In A Temperature Range", + "00002b0d-0000-1000-8000-00805f9b34fb": "Temperature 8", + "00002b0e-0000-1000-8000-00805f9b34fb": "Temperature 8 In A Period Of Day", + "00002b0f-0000-1000-8000-00805f9b34fb": "Temperature 8 Statistics", + "00002b10-0000-1000-8000-00805f9b34fb": "Temperature Range", + "00002b11-0000-1000-8000-00805f9b34fb": "Temperature Statistics", + "00002b12-0000-1000-8000-00805f9b34fb": "Time Decihour 8", + "00002b13-0000-1000-8000-00805f9b34fb": "Time Exponential 8", + "00002b14-0000-1000-8000-00805f9b34fb": "Time Hour 24", + "00002b15-0000-1000-8000-00805f9b34fb": "Time Millisecond 24", + "00002b16-0000-1000-8000-00805f9b34fb": "Time Second 16", + "00002b17-0000-1000-8000-00805f9b34fb": "Time Second 8", + "00002b18-0000-1000-8000-00805f9b34fb": "Voltage", + "00002b19-0000-1000-8000-00805f9b34fb": "Voltage Specification", + "00002b1a-0000-1000-8000-00805f9b34fb": "Voltage Statistics", + "00002b1b-0000-1000-8000-00805f9b34fb": "Volume Flow", + "00002b1c-0000-1000-8000-00805f9b34fb": "Chromaticity Coordinate", + "00002b29-0000-1000-8000-00805f9b34fb": "Client Supported Features", + "00002b2a-0000-1000-8000-00805f9b34fb": "Database Hash", + "00002b2b-0000-1000-8000-00805f9b34fb": "BSS Control Point", + "00002b2c-0000-1000-8000-00805f9b34fb": "BSS Response", + "00002b2d-0000-1000-8000-00805f9b34fb": "Emergency ID", + "00002b2e-0000-1000-8000-00805f9b34fb": "Emergency Text", + "00002b34-0000-1000-8000-00805f9b34fb": "Enhanced Blood Pressure Measurement", + "00002b35-0000-1000-8000-00805f9b34fb": "Enhanced Intermediate Cuff Pressure", + "00002b36-0000-1000-8000-00805f9b34fb": "Blood Pressure Record", + "00002b38-0000-1000-8000-00805f9b34fb": "BR-EDR Handover Data", + "00002b39-0000-1000-8000-00805f9b34fb": "Bluetooth SIG Data", + "00002b3a-0000-1000-8000-00805f9b34fb": "Server Supported Features", + "00002b3b-0000-1000-8000-00805f9b34fb": "Physical Activity Monitor Features", + "00002b3c-0000-1000-8000-00805f9b34fb": "General Activity Instantaneous Data", + "00002b3d-0000-1000-8000-00805f9b34fb": "General Activity Summary Data", + "00002b3e-0000-1000-8000-00805f9b34fb": "CardioRespiratory Activity Instantaneous Data", + "00002b3f-0000-1000-8000-00805f9b34fb": "CardioRespiratory Activity Summary Data", + "00002b40-0000-1000-8000-00805f9b34fb": "Step Counter Activity Summary Data", + "00002b41-0000-1000-8000-00805f9b34fb": "Sleep Activity Instantaneous Data", + "00002b42-0000-1000-8000-00805f9b34fb": "Sleep Activity Summary Data", + "00002b43-0000-1000-8000-00805f9b34fb": "Physical Activity Monitor Control Point", + "00002b44-0000-1000-8000-00805f9b34fb": "Activity Current Session", + "00002b45-0000-1000-8000-00805f9b34fb": "Physical Activity Session Descriptor", + "00002b46-0000-1000-8000-00805f9b34fb": "Preferred Units", + "00002b47-0000-1000-8000-00805f9b34fb": "High Resolution Height", + "00002b48-0000-1000-8000-00805f9b34fb": "Middle Name", + "00002b49-0000-1000-8000-00805f9b34fb": "Stride Length", + "00002b4a-0000-1000-8000-00805f9b34fb": "Handedness", + "00002b4b-0000-1000-8000-00805f9b34fb": "Device Wearing Position", + "00002b4c-0000-1000-8000-00805f9b34fb": "Four Zone Heart Rate Limits", + "00002b4d-0000-1000-8000-00805f9b34fb": "High Intensity Exercise Threshold", + "00002b4e-0000-1000-8000-00805f9b34fb": "Activity Goal", + "00002b4f-0000-1000-8000-00805f9b34fb": "Sedentary Interval Notification", + "00002b50-0000-1000-8000-00805f9b34fb": "Caloric Intake", + "00002b51-0000-1000-8000-00805f9b34fb": "TMAP Role", + "00002b77-0000-1000-8000-00805f9b34fb": "Audio Input State", + "00002b78-0000-1000-8000-00805f9b34fb": "Gain Settings Attribute", + "00002b79-0000-1000-8000-00805f9b34fb": "Audio Input Type", + "00002b7a-0000-1000-8000-00805f9b34fb": "Audio Input Status", + "00002b7b-0000-1000-8000-00805f9b34fb": "Audio Input Control Point", + "00002b7c-0000-1000-8000-00805f9b34fb": "Audio Input Description", + "00002b7d-0000-1000-8000-00805f9b34fb": "Volume State", + "00002b7e-0000-1000-8000-00805f9b34fb": "Volume Control Point", + "00002b7f-0000-1000-8000-00805f9b34fb": "Volume Flags", + "00002b80-0000-1000-8000-00805f9b34fb": "Volume Offset State", + "00002b81-0000-1000-8000-00805f9b34fb": "Audio Location", + "00002b82-0000-1000-8000-00805f9b34fb": "Volume Offset Control Point", + "00002b83-0000-1000-8000-00805f9b34fb": "Audio Output Description", + "00002b84-0000-1000-8000-00805f9b34fb": "Set Identity Resolving Key", + "00002b85-0000-1000-8000-00805f9b34fb": "Coordinated Set Size", + "00002b86-0000-1000-8000-00805f9b34fb": "Set Member Lock", + "00002b87-0000-1000-8000-00805f9b34fb": "Set Member Rank", + "00002b8e-0000-1000-8000-00805f9b34fb": "Device Time Feature", + "00002b8f-0000-1000-8000-00805f9b34fb": "Device Time Parameters", + "00002b90-0000-1000-8000-00805f9b34fb": "Device Time", + "00002b91-0000-1000-8000-00805f9b34fb": "Device Time Control Point", + "00002b92-0000-1000-8000-00805f9b34fb": "Time Change Log Data", + "00002b93-0000-1000-8000-00805f9b34fb": "Media Player Name", + "00002b94-0000-1000-8000-00805f9b34fb": "Media Player Icon Object ID", + "00002b95-0000-1000-8000-00805f9b34fb": "Media Player Icon URL", + "00002b96-0000-1000-8000-00805f9b34fb": "Track Changed", + "00002b97-0000-1000-8000-00805f9b34fb": "Track Title", + "00002b98-0000-1000-8000-00805f9b34fb": "Track Duration", + "00002b99-0000-1000-8000-00805f9b34fb": "Track Position", + "00002b9a-0000-1000-8000-00805f9b34fb": "Playback Speed", + "00002b9b-0000-1000-8000-00805f9b34fb": "Seeking Speed", + "00002b9c-0000-1000-8000-00805f9b34fb": "Current Track Segments Object ID", + "00002b9d-0000-1000-8000-00805f9b34fb": "Current Track Object ID", + "00002b9e-0000-1000-8000-00805f9b34fb": "Next Track Object ID", + "00002b9f-0000-1000-8000-00805f9b34fb": "Parent Group Object ID", + "00002ba0-0000-1000-8000-00805f9b34fb": "Current Group Object ID", + "00002ba1-0000-1000-8000-00805f9b34fb": "Playing Order", + "00002ba2-0000-1000-8000-00805f9b34fb": "Playing Orders Supported", + "00002ba3-0000-1000-8000-00805f9b34fb": "Media State", + "00002ba4-0000-1000-8000-00805f9b34fb": "Media Control Point", + "00002ba5-0000-1000-8000-00805f9b34fb": "Media Control Point Opcodes Supported", + "00002ba6-0000-1000-8000-00805f9b34fb": "Search Results Object ID", + "00002ba7-0000-1000-8000-00805f9b34fb": "Search Control Point", + "00002ba9-0000-1000-8000-00805f9b34fb": "Media Player Icon Object Type", + "00002baa-0000-1000-8000-00805f9b34fb": "Track Segments Object Type", + "00002bab-0000-1000-8000-00805f9b34fb": "Track Object Type", + "00002bac-0000-1000-8000-00805f9b34fb": "Group Object Type", + "00002bad-0000-1000-8000-00805f9b34fb": "Constant Tone Extension Enable", + "00002bae-0000-1000-8000-00805f9b34fb": "Advertising Constant Tone Extension Minimum Length", + "00002baf-0000-1000-8000-00805f9b34fb": "Advertising Constant Tone Extension Minimum Transmit Count", + "00002bb0-0000-1000-8000-00805f9b34fb": "Advertising Constant Tone Extension Transmit Duration", + "00002bb1-0000-1000-8000-00805f9b34fb": "Advertising Constant Tone Extension Interval", + "00002bb2-0000-1000-8000-00805f9b34fb": "Advertising Constant Tone Extension PHY", + "00002bb3-0000-1000-8000-00805f9b34fb": "Bearer Provider Name", + "00002bb4-0000-1000-8000-00805f9b34fb": "Bearer UCI", + "00002bb5-0000-1000-8000-00805f9b34fb": "Bearer Technology", + "00002bb6-0000-1000-8000-00805f9b34fb": "Bearer URI Schemes Supported List", + "00002bb7-0000-1000-8000-00805f9b34fb": "Bearer Signal Strength", + "00002bb8-0000-1000-8000-00805f9b34fb": "Bearer Signal Strength Reporting Interval", + "00002bb9-0000-1000-8000-00805f9b34fb": "Bearer List Current Calls", + "00002bba-0000-1000-8000-00805f9b34fb": "Content Control ID", + "00002bbb-0000-1000-8000-00805f9b34fb": "Status Flags", + "00002bbc-0000-1000-8000-00805f9b34fb": "Incoming Call Target Bearer URI", + "00002bbd-0000-1000-8000-00805f9b34fb": "Call State", + "00002bbe-0000-1000-8000-00805f9b34fb": "Call Control Point", + "00002bbf-0000-1000-8000-00805f9b34fb": "Call Control Point Optional Opcodes", + "00002bc0-0000-1000-8000-00805f9b34fb": "Termination Reason", + "00002bc1-0000-1000-8000-00805f9b34fb": "Incoming Call", + "00002bc2-0000-1000-8000-00805f9b34fb": "Call Friendly Name", + "00002bc3-0000-1000-8000-00805f9b34fb": "Mute", + "00002bc4-0000-1000-8000-00805f9b34fb": "Sink ASE", + "00002bc5-0000-1000-8000-00805f9b34fb": "Source ASE", + "00002bc6-0000-1000-8000-00805f9b34fb": "ASE Control Point", + "00002bc7-0000-1000-8000-00805f9b34fb": "Broadcast Audio Scan Control Point", + "00002bc8-0000-1000-8000-00805f9b34fb": "Broadcast Receive State", + "00002bc9-0000-1000-8000-00805f9b34fb": "Sink PAC", + "00002bca-0000-1000-8000-00805f9b34fb": "Sink Audio Locations", + "00002bcb-0000-1000-8000-00805f9b34fb": "Source PAC", + "00002bcc-0000-1000-8000-00805f9b34fb": "Source Audio Locations", + "00002bcd-0000-1000-8000-00805f9b34fb": "Available Audio Contexts", + "00002bce-0000-1000-8000-00805f9b34fb": "Supported Audio Contexts", + "00002bcf-0000-1000-8000-00805f9b34fb": "Ammonia Concentration", + "00002bd0-0000-1000-8000-00805f9b34fb": "Carbon Monoxide Concentration", + "00002bd1-0000-1000-8000-00805f9b34fb": "Methane Concentration", + "00002bd2-0000-1000-8000-00805f9b34fb": "Nitrogen Dioxide Concentration", + "00002bd3-0000-1000-8000-00805f9b34fb": "Non-Methane Volatile Organic Compounds Concentration", + "00002bd4-0000-1000-8000-00805f9b34fb": "Ozone Concentration", + "00002bd5-0000-1000-8000-00805f9b34fb": "Particulate Matter - PM1 Concentration", + "00002bd6-0000-1000-8000-00805f9b34fb": "Particulate Matter - PM2.5 Concentration", + "00002bd7-0000-1000-8000-00805f9b34fb": "Particulate Matter - PM10 Concentration", + "00002bd8-0000-1000-8000-00805f9b34fb": "Sulfur Dioxide Concentration", + "00002bd9-0000-1000-8000-00805f9b34fb": "Sulfur Hexafluoride Concentration", + "00002bda-0000-1000-8000-00805f9b34fb": "Hearing Aid Features", + "00002bdb-0000-1000-8000-00805f9b34fb": "Hearing Aid Preset Control Point", + "00002bdc-0000-1000-8000-00805f9b34fb": "Active Preset Index", + "00001524-1212-efde-1523-785feabcd123": "Blinky Button State", + "00001525-1212-efde-1523-785feabcd123": "Blinky LED State", + "00001531-1212-efde-1523-785feabcd123": "Legacy DFU Control Point", + "00001532-1212-efde-1523-785feabcd123": "Legacy DFU Packet", + "00001534-1212-efde-1523-785feabcd123": "Legacy DFU Version", + "8ec90001-f315-4f60-9fb8-838830daea50": "DFU Control Point", + "8ec90002-f315-4f60-9fb8-838830daea50": "DFU Packet", + "8ec90003-f315-4f60-9fb8-838830daea50": "Buttonless DFU Without Bonds", + "8ec90004-f315-4f60-9fb8-838830daea50": "Buttonless DFU With Bonds", + "8e400001-f315-4f60-9fb8-838830daea50": "Experimental Buttonless DFU", + "da2e7828-fbce-4e01-ae9e-261174997c48": "SMP Characteristic", + "932c32bd-0002-47a2-835a-a8d455b859dd": "Philips Hue Light On/Off Toggle", + "932c32bd-0003-47a2-835a-a8d455b859dd": "Philips Hue Light Brightness Level", + "932c32bd-0005-47a2-835a-a8d455b859dd": "Philips Hue Light Color", + "ef680101-9b35-4933-9b10-52ffa9740042": "Thingy Device Name", + "ef680102-9b35-4933-9b10-52ffa9740042": "Thingy Advertising Parameters", + "ef680104-9b35-4933-9b10-52ffa9740042": "Thingy Connection Parameters", + "ef680105-9b35-4933-9b10-52ffa9740042": "Thingy Eddystone URL", + "ef680106-9b35-4933-9b10-52ffa9740042": "Thingy Cloud Token", + "ef680107-9b35-4933-9b10-52ffa9740042": "Thingy FW Version", + "ef680108-9b35-4933-9b10-52ffa9740042": "Thingy MTU Request", + "ef680201-9b35-4933-9b10-52ffa9740042": "Thingy Temperature", + "ef680202-9b35-4933-9b10-52ffa9740042": "Thingy Pressure", + "ef680203-9b35-4933-9b10-52ffa9740042": "Thingy Humidity", + "ef680204-9b35-4933-9b10-52ffa9740042": "Thingy Air Quality", + "ef680205-9b35-4933-9b10-52ffa9740042": "Thingy Color", + "ef680206-9b35-4933-9b10-52ffa9740042": "Thingy Configuration", + "ef680301-9b35-4933-9b10-52ffa9740042": "Thingy LED State", + "ef680302-9b35-4933-9b10-52ffa9740042": "Thingy Button State", + "ef680303-9b35-4933-9b10-52ffa9740042": "Thingy EXT Pin", + "ef680401-9b35-4933-9b10-52ffa9740042": "Thingy Motion Config", + "ef680402-9b35-4933-9b10-52ffa9740042": "Thingy Tap", + "ef680403-9b35-4933-9b10-52ffa9740042": "Thingy Orientation", + "ef680404-9b35-4933-9b10-52ffa9740042": "Thingy Quaternion", + "ef680405-9b35-4933-9b10-52ffa9740042": "Thingy Pedometer", + "ef680406-9b35-4933-9b10-52ffa9740042": "Thingy Raw Data", + "ef680407-9b35-4933-9b10-52ffa9740042": "Thingy Euler", + "ef680408-9b35-4933-9b10-52ffa9740042": "Thingy Rotation Matrix", + "ef680409-9b35-4933-9b10-52ffa9740042": "Thingy Heading", + "ef68040a-9b35-4933-9b10-52ffa9740042": "Thingy Gravity Vector", + "ef680501-9b35-4933-9b10-52ffa9740042": "Thingy Sound Config", + "ef680502-9b35-4933-9b10-52ffa9740042": "Thingy Speaker Data", + "ef680503-9b35-4933-9b10-52ffa9740042": "Thingy Speaker Status", + "ef680504-9b35-4933-9b10-52ffa9740042": "Thingy Microphone", + "6e400002-b5a3-f393-e0a9-e50e24dcca9e": "UART RX Characteristic", + "6e400003-b5a3-f393-e0a9-e50e24dcca9e": "UART TX Characteristic", + "57a70001-9350-11ed-a1eb-0242ac120002": "Status Characteristic", + "e2a00002-ec31-4ec3-a97a-1c34d87e9878": "Edge Impulse Remote Management RX Characteristic", + "e2a00003-ec31-4ec3-a97a-1c34d87e9878": "Edge Impulse Remote Management TX Characteristic", + "a3c87501-8ed3-4bdf-8a39-a01bebede295": "Eddystone Capabilities", + "a3c87502-8ed3-4bdf-8a39-a01bebede295": "Eddystone Active Slot", + "a3c87503-8ed3-4bdf-8a39-a01bebede295": "Eddystone Advertising Interval", + "a3c87504-8ed3-4bdf-8a39-a01bebede295": "Eddystone Radio Tx Power", + "a3c87505-8ed3-4bdf-8a39-a01bebede295": "Eddystone (Advanced) Advertised Tx Power", + "a3c87506-8ed3-4bdf-8a39-a01bebede295": "Eddystone Lock State", + "a3c87507-8ed3-4bdf-8a39-a01bebede295": "Eddystone Unlock", + "a3c87508-8ed3-4bdf-8a39-a01bebede295": "Eddystone Public ECDH Key", + "a3c87509-8ed3-4bdf-8a39-a01bebede295": "Eddystone EID Identity Key", + "a3c8750a-8ed3-4bdf-8a39-a01bebede295": "Eddystone ADV Slot Data", + "a3c8750b-8ed3-4bdf-8a39-a01bebede295": "Eddystone Advanced Factory Reset", + "a3c8750c-8ed3-4bdf-8a39-a01bebede295": "Eddystone (Advanced) Remain Connectable", + "fe2c1233-8366-4814-8eb0-01de32100bea": "Fast Pair Model ID", + "fe2c1234-8366-4814-8eb0-01de32100bea": "Fast Pair Key-based Pairing", + "fe2c1235-8366-4814-8eb0-01de32100bea": "Fast Pair Passkey", + "fe2c1236-8366-4814-8eb0-01de32100bea": "Fast Pair Account Key", + "fe2c1237-8366-4814-8eb0-01de32100bea": "Fast Pair Data", + "00001233-0000-1000-8000-00805f9b34fb": "Deprecated Fast Pair Model ID", + "00001234-0000-1000-8000-00805f9b34fb": "Deprecated Fast Pair Key-based Pairing", + "00001235-0000-1000-8000-00805f9b34fb": "Deprecated Fast Pair Passkey", + "00001236-0000-1000-8000-00805f9b34fb": "Deprecated Fast Pair Account Key", + "00001237-0000-1000-8000-00805f9b34fb": "Deprecated Fast Pair Data", + "9fbf120d-6301-42d9-8c58-25e699a21dbd": "Apple Notification Source", + "69d1d8f3-45e1-49a8-9821-9bbdfdaad9d9": "Apple Control Point", + "22eac6e9-24d6-4bb5-be44-b36ace7c7bfb": "Apple Data Source", + "9b3c81d8-57b1-4a8a-b8df-0e56f7ca51c2": "Apple Remote Command", + "2f7cabce-808d-411f-9a0c-bb92ba96c102": "Apple Entity Update", + "c6b2f38c-23ab-46d8-a6ab-a3a870bbd5d7": "Apple Entity Attribute", + "7dfc6001-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6002-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6003-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6004-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6005-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6101-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6102-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6103-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6104-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6105-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6106-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6107-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6108-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6201-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6202-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc6203-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc8003-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7004-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7005-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7006-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7007-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7008-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7009-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc700a-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc700b-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc700c-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7103-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7104-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7105-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7106-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7107-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7108-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc7109-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc710b-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc710c-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc710d-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc8004-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "7dfc9001-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Characteristic", + "e95dca4b-251d-470a-a062-fa1922dfa9a8": "micro:bit Accelerometer Data", + "e95dfb24-251d-470a-a062-fa1922dfa9a8": "micro:bit Accelerometer Period", + "e95dfb11-251d-470a-a062-fa1922dfa9a8": "micro:bit Magnetometer Data", + "e95d386c-251d-470a-a062-fa1922dfa9a8": "micro:bit Magnetometer Period", + "e95d9715-251d-470a-a062-fa1922dfa9a8": "micro:bit Magnetometer Bearing", + "e95dda90-251d-470a-a062-fa1922dfa9a8": "micro:bit Button A State", + "e95dda91-251d-470a-a062-fa1922dfa9a8": "micro:bit Button B State", + "e95d8d00-251d-470a-a062-fa1922dfa9a8": "micro:bit Pin Data", + "e95d5899-251d-470a-a062-fa1922dfa9a8": "micro:bit Pin AD Configuration", + "e95db9fe-251d-470a-a062-fa1922dfa9a8": "micro:bit Pin I/O Configuration", + "e95dd822-251d-470a-a062-fa1922dfa9a8": "micro:bit PWM Control", + "e95d7b77-251d-470a-a062-fa1922dfa9a8": "micro:bit LED Matrix State", + "e95d93ee-251d-470a-a062-fa1922dfa9a8": "micro:bit LED Text", + "e95d0d2d-251d-470a-a062-fa1922dfa9a8": "micro:bit Scrolling Delay", + "e95db84c-251d-470a-a062-fa1922dfa9a8": "micro:bit Requirements", + "e95d9775-251d-470a-a062-fa1922dfa9a8": "micro:bit Event", + "e95d23c4-251d-470a-a062-fa1922dfa9a8": "micro:bit Client Requirements", + "e95d5404-251d-470a-a062-fa1922dfa9a8": "micro:bit Client Event", + "e95d93b1-251d-470a-a062-fa1922dfa9a8": "micro:bit DFU Control", + "e95d9250-251d-470a-a062-fa1922dfa9a8": "micro:bit Temperature", + "e95d1b25-251d-470a-a062-fa1922dfa9a8": "micro:bit Temperature Period", + "00002adb-0000-1000-8000-00805f9b34fb": "Mesh Provisioning Data In", + "00002adc-0000-1000-8000-00805f9b34fb": "Mesh Provisioning Data Out", + "00002add-0000-1000-8000-00805f9b34fb": "Mesh Proxy Data In", + "00002ade-0000-1000-8000-00805f9b34fb": "Mesh Proxy Data Out", + "00001624-1212-efde-1623-785feabcd123": "LEGO\u00ae Wireless Protocol v3 Hub Characteristic", + "00001626-1212-efde-1623-785feabcd123": "LEGO\u00ae Wireless Protocol v3 Bootloader Characteristic", + "adaf0001-c332-42a8-93bd-25e905756cb8": "Adafruit Sensor Measurement Period", + "adaf0002-c332-42a8-93bd-25e905756cb8": "Adafruit Sensor Service Version", + "adaf0101-c332-42a8-93bd-25e905756cb8": "Adafruit Temperature", + "adaf0201-c332-42a8-93bd-25e905756cb8": "Adafruit Acceleration", + "adaf0301-c332-42a8-93bd-25e905756cb8": "Adafruit Light Level", + "adaf0401-c332-42a8-93bd-25e905756cb8": "Adafruit Gyro", + "adaf0501-c332-42a8-93bd-25e905756cb8": "Adafruit Magnetic", + "adaf0601-c332-42a8-93bd-25e905756cb8": "Adafruit Pressed", + "adaf0701-c332-42a8-93bd-25e905756cb8": "Adafruit Humidity", + "adaf0801-c332-42a8-93bd-25e905756cb8": "Adafruit Pressure", + "adaf0901-c332-42a8-93bd-25e905756cb8": "Adafruit Pixel Pin", + "adaf0902-c332-42a8-93bd-25e905756cb8": "Adafruit Pixel Pin Type", + "adaf0903-c332-42a8-93bd-25e905756cb8": "Adafruit Pixel Data", + "adaf0904-c332-42a8-93bd-25e905756cb8": "Adafruit Pixel Buffer Size", + "adaf0a01-c332-42a8-93bd-25e905756cb8": "Adafruit Color", + "adaf0b01-c332-42a8-93bd-25e905756cb8": "Adafruit Sound Samples", + "adaf0b02-c332-42a8-93bd-25e905756cb8": "Adafruit Number of Channels", + "adaf0c01-c332-42a8-93bd-25e905756cb8": "Adafruit Tone", + "adaf0d01-c332-42a8-93bd-25e905756cb8": "Adafruit Quaternions", + "adaf0d02-c332-42a8-93bd-25e905756cb8": "Adafruit Calibration In", + "adaf0d03-c332-42a8-93bd-25e905756cb8": "Adafruit Calibration Out", + "adaf0e01-c332-42a8-93bd-25e905756cb8": "Adafruit Proximity", + "adaf0100-4669-6c65-5472-616e73666572": "Adafruit Version", + "adaf0200-4669-6c65-5472-616e73666572": "Adafruit Raw TX/RX", + "f000ffc1-0451-4000-b000-000000000000": "Texas Instruments Image Identify", + "f000ffc2-0451-4000-b000-000000000000": "Texas Instruments Image Block", + "f000ffc5-0451-4000-b000-000000000000": "Texas Instruments OAD Control", + "d083b2bd-be16-4600-b397-61512ca2f5ad": "Helium Hotspot Onboarding Key", + "0a852c59-50d3-4492-bfd3-22fe58a24f01": "Helium Hotspot Public Key", + "d7515033-7e7b-45be-803f-c8737b171a29": "Helium Hotspot WiFi Services", + "b833d34f-d871-422c-bf9e-8e6ec117d57e": "Helium Hotspot Diagnostics", + "9c4314f2-8a0c-45fd-a58d-d4a7e64c3a57": "Helium Hotspot WiFi MAC Address", + "180efdef-7579-4b4a-b2df-72733b7fa2fe": "Helium Hotspot Lights", + "7731de63-bc6a-4100-8ab1-89b2356b038b": "Helium Hotspot WiFi SSID", + "d435f5de-01a4-4e7d-84ba-dfd347f60275": "Helium Hotspot Assert Location", + "df3b16ca-c985-4da2-a6d2-9b9b9abdb858": "Helium Hotspot Add Gateway", + "398168aa-0111-4ec0-b1fa-171671270608": "Helium Hotspot WiFi Connect", + "e5866bd6-0288-4476-98ca-ef7da6b4d289": "Helium Hotspot Ethernet Online", + "8cc6e0b3-98c5-40cc-b1d8-692940e6994b": "Helium Hotspot WiFi Remove", + "e125bda4-6fb8-11ea-bc55-0242ac130003": "Helium Hotspot WiFi Configured Services", + "54220001-f6a5-4007-a371-722f4ebd8436": "MDS Supported Features Characteristic", + "54220002-f6a5-4007-a371-722f4ebd8436": "MDS Device Identifier Characteristic", + "54220003-f6a5-4007-a371-722f4ebd8436": "MDS Device Data URI Characteristic", + "54220004-f6a5-4007-a371-722f4ebd8436": "MDS Device Authorization Characteristic", + "54220005-f6a5-4007-a371-722f4ebd8436": "MDS Device Data Export Characteristic", +} diff --git a/network/ble_companies.go b/network/ble_companies.go new file mode 100644 index 00000000..e42241c3 --- /dev/null +++ b/network/ble_companies.go @@ -0,0 +1,3417 @@ +package network + +var BLE_Companies = map[uint16]string{ + 0: "Ericsson AB", + 1: "Nokia Mobile Phones", + 2: "Intel Corp.", + 3: "IBM Corp.", + 4: "Toshiba Corp.", + 5: "3Com", + 6: "Microsoft", + 7: "Lucent", + 8: "Motorola", + 9: "Infineon Technologies AG", + 10: "Qualcomm Technologies International, Ltd. (QTIL)", + 11: "Silicon Wave", + 12: "Digianswer A/S", + 13: "Texas Instruments Inc.", + 14: "Parthus Technologies Inc.", + 15: "Broadcom Corporation", + 16: "Mitel Semiconductor", + 17: "Widcomm, Inc.", + 18: "Zeevo, Inc.", + 19: "Atmel Corporation", + 20: "Mitsubishi Electric Corporation", + 21: "RTX A/S", + 22: "KC Technology Inc.", + 23: "Newlogic", + 24: "Transilica, Inc.", + 25: "Rohde & Schwarz GmbH & Co. KG", + 26: "TTPCom Limited", + 27: "Signia Technologies, Inc.", + 28: "Conexant Systems Inc.", + 29: "Qualcomm", + 30: "Inventel", + 31: "AVM Berlin", + 32: "BandSpeed, Inc.", + 33: "Mansella Ltd", + 34: "NEC Corporation", + 35: "WavePlus Technology Co., Ltd.", + 36: "Alcatel", + 37: "NXP B.V.", + 38: "C Technologies", + 39: "Open Interface", + 40: "R F Micro Devices", + 41: "Hitachi Ltd", + 42: "Symbol Technologies, Inc.", + 43: "Tenovis", + 44: "Macronix International Co. Ltd.", + 45: "GCT Semiconductor", + 46: "Norwood Systems", + 47: "MewTel Technology Inc.", + 48: "ST Microelectronics", + 49: "Synopsys, Inc.", + 50: "Red-M (Communications) Ltd", + 51: "Commil Ltd", + 52: "Computer Access Technology Corporation (CATC)", + 53: "Eclipse (HQ Espana) S.L.", + 54: "Renesas Electronics Corporation", + 55: "Mobilian Corporation", + 56: "Syntronix Corporation", + 57: "Integrated System Solution Corp.", + 58: "Panasonic Holdings Corporation", + 59: "Gennum Corporation", + 60: "BlackBerry Limited", + 61: "IPextreme, Inc.", + 62: "Systems and Chips, Inc", + 63: "Bluetooth SIG, Inc", + 64: "Seiko Epson Corporation", + 65: "Integrated Silicon Solution Taiwan, Inc.", + 66: "CONWISE Technology Corporation Ltd", + 67: "PARROT AUTOMOTIVE SAS", + 68: "Socket Mobile", + 69: "Atheros Communications, Inc.", + 70: "MediaTek, Inc.", + 71: "Bluegiga", + 72: "Marvell Technology Group Ltd.", + 73: "3DSP Corporation", + 74: "Accel Semiconductor Ltd.", + 75: "Continental Automotive Systems", + 76: "Apple, Inc.", + 77: "Staccato Communications, Inc.", + 78: "Avago Technologies", + 79: "APT Ltd.", + 80: "SiRF Technology, Inc.", + 81: "Tzero Technologies, Inc.", + 82: "J&M Corporation", + 83: "Free2move AB", + 84: "3DiJoy Corporation", + 85: "Plantronics, Inc.", + 86: "Sony Ericsson Mobile Communications", + 87: "Harman International Industries, Inc.", + 88: "Vizio, Inc.", + 89: "Nordic Semiconductor ASA", + 90: "EM Microelectronic-Marin SA", + 91: "Ralink Technology Corporation", + 92: "Belkin International, Inc.", + 93: "Realtek Semiconductor Corporation", + 94: "Stonestreet One, LLC", + 95: "Wicentric, Inc.", + 96: "RivieraWaves S.A.S", + 97: "RDA Microelectronics", + 98: "Gibson Guitars", + 99: "MiCommand Inc.", + 100: "Band XI International, LLC", + 101: "HP, Inc.", + 102: "9Solutions Oy", + 103: "GN Audio A/S", + 104: "General Motors", + 105: "A&D Engineering, Inc.", + 106: "MindTree Ltd.", + 107: "Polar Electro OY", + 108: "Beautiful Enterprise Co., Ltd.", + 109: "BriarTek, Inc", + 110: "Summit Data Communications, Inc.", + 111: "Sound ID", + 112: "Monster, LLC", + 113: "connectBlue AB", + 114: "ShangHai Super Smart Electronics Co. Ltd.", + 115: "Group Sense Ltd.", + 116: "Zomm, LLC", + 117: "Samsung Electronics Co. Ltd.", + 118: "Creative Technology Ltd.", + 119: "Laird Connectivity LLC", + 120: "Nike, Inc.", + 121: "lesswire AG", + 122: "MStar Semiconductor, Inc.", + 123: "Hanlynn Technologies", + 124: "A & R Cambridge", + 125: "Seers Technology Co., Ltd.", + 126: "Sports Tracking Technologies Ltd.", + 127: "Autonet Mobile", + 128: "DeLorme Publishing Company, Inc.", + 129: "WuXi Vimicro", + 130: "DSEA A/S", + 131: "TimeKeeping Systems, Inc.", + 132: "Ludus Helsinki Ltd.", + 133: "BlueRadios, Inc.", + 134: "Equinux AG", + 135: "Garmin International, Inc.", + 136: "Ecotest", + 137: "GN Hearing A/S", + 138: "Jawbone", + 139: "Topcon Positioning Systems, LLC", + 140: "Gimbal Inc.", + 141: "Zscan Software", + 142: "Quintic Corp", + 143: "Telit Wireless Solutions GmbH", + 144: "Funai Electric Co., Ltd.", + 145: "Advanced PANMOBIL systems GmbH & Co. KG", + 146: "ThinkOptics, Inc.", + 147: "Universal Electronics, Inc.", + 148: "Airoha Technology Corp.", + 149: "NEC Lighting, Ltd.", + 150: "ODM Technology, Inc.", + 151: "ConnecteDevice Ltd.", + 152: "zero1.tv GmbH", + 153: "i.Tech Dynamic Global Distribution Ltd.", + 154: "Alpwise", + 155: "Jiangsu Toppower Automotive Electronics Co., Ltd.", + 156: "Colorfy, Inc.", + 157: "Geoforce Inc.", + 158: "Bose Corporation", + 159: "Suunto Oy", + 160: "Kensington Computer Products Group", + 161: "SR-Medizinelektronik", + 162: "Vertu Corporation Limited", + 163: "Meta Watch Ltd.", + 164: "LINAK A/S", + 165: "OTL Dynamics LLC", + 166: "Panda Ocean Inc.", + 167: "Visteon Corporation", + 168: "ARP Devices Limited", + 169: "MARELLI EUROPE S.P.A.", + 170: "CAEN RFID srl", + 171: "Ingenieur-Systemgruppe Zahn GmbH", + 172: "Green Throttle Games", + 173: "Peter Systemtechnik GmbH", + 174: "Omegawave Oy", + 175: "Cinetix", + 176: "Passif Semiconductor Corp", + 177: "Saris Cycling Group, Inc", + 178: "Bekey A/S", + 179: "Clarinox Technologies Pty. Ltd.", + 180: "BDE Technology Co., Ltd.", + 181: "Swirl Networks", + 182: "Meso international", + 183: "TreLab Ltd", + 184: "Qualcomm Innovation Center, Inc. (QuIC)", + 185: "Johnson Controls, Inc.", + 186: "Starkey Hearing Technologies", + 187: "S-Power Electronics Limited", + 188: "Ace Sensor Inc", + 189: "Aplix Corporation", + 190: "AAMP of America", + 191: "Stalmart Technology Limited", + 192: "AMICCOM Electronics Corporation", + 193: "Shenzhen Excelsecu Data Technology Co.,Ltd", + 194: "Geneq Inc.", + 195: "adidas AG", + 196: "LG Electronics", + 197: "Onset Computer Corporation", + 198: "Selfly BV", + 199: "Quuppa Oy.", + 200: "GeLo Inc", + 201: "Evluma", + 202: "MC10", + 203: "Binauric SE", + 204: "Beats Electronics", + 205: "Microchip Technology Inc.", + 206: "Eve Systems GmbH", + 207: "ARCHOS SA", + 208: "Dexcom, Inc.", + 209: "Polar Electro Europe B.V.", + 210: "Dialog Semiconductor B.V.", + 211: "Taixingbang Technology (HK) Co,. LTD.", + 212: "Kawantech", + 213: "Austco Communication Systems", + 214: "Timex Group USA, Inc.", + 215: "Qualcomm Technologies, Inc.", + 216: "Qualcomm Connected Experiences, Inc.", + 217: "Voyetra Turtle Beach", + 218: "txtr GmbH", + 219: "Snuza (Pty) Ltd", + 220: "Procter & Gamble", + 221: "Hosiden Corporation", + 222: "Muzik LLC", + 223: "Misfit Wearables Corp", + 224: "Google", + 225: "Danlers Ltd", + 226: "Semilink Inc", + 227: "inMusic Brands, Inc", + 228: "L.S. Research, Inc.", + 229: "Eden Software Consultants Ltd.", + 230: "Freshtemp", + 231: "KS Technologies", + 232: "ACTS Technologies", + 233: "Vtrack Systems", + 234: "www.vtracksystems.com", + 235: "Server Technology Inc.", + 236: "BioResearch Associates", + 237: "Jolly Logic, LLC", + 238: "Above Average Outcomes, Inc.", + 239: "Bitsplitters GmbH", + 240: "PayPal, Inc.", + 241: "Witron Technology Limited", + 242: "Morse Project Inc.", + 243: "Kent Displays Inc.", + 244: "Nautilus Inc.", + 245: "Smartifier Oy", + 246: "Elcometer Limited", + 247: "VSN Technologies, Inc.", + 248: "AceUni Corp., Ltd.", + 249: "StickNFind", + 250: "Crystal Alarm AB", + 251: "KOUKAAM a.s.", + 252: "Delphi Corporation", + 253: "ValenceTech Limited", + 254: "Stanley Black and Decker", + 255: "Typo Products, LLC", + 256: "TomTom International BV", + 257: "Fugoo, Inc.", + 258: "Keiser Corporation", + 259: "Bang & Olufsen A/S", + 260: "PLUS Location Systems Pty Ltd", + 261: "Ubiquitous Computing Technology Corporation", + 262: "Innovative Yachtter Solutions", + 263: "Demant A/S", + 264: "Chicony Electronics Co., Ltd.", + 265: "Atus BV", + 266: "Codegate Ltd", + 267: "ERi, Inc", + 268: "Transducers Direct, LLC", + 269: "DENSO TEN Limited", + 270: "Audi AG", + 271: "HiSilicon Technologies CO., LIMITED", + 272: "Nippon Seiki Co., Ltd.", + 273: "Steelseries ApS", + 274: "Visybl Inc.", + 275: "Openbrain Technologies, Co., Ltd.", + 276: "Xensr", + 277: "e.solutions", + 278: "10AK Technologies", + 279: "Wimoto Technologies Inc", + 280: "Radius Networks, Inc.", + 281: "Wize Technology Co., Ltd.", + 282: "Qualcomm Labs, Inc.", + 283: "Hewlett Packard Enterprise", + 284: "Baidu", + 285: "Arendi AG", + 286: "Skoda Auto a.s.", + 287: "Volkswagen AG", + 288: "Porsche AG", + 289: "Sino Wealth Electronic Ltd.", + 290: "AirTurn, Inc.", + 291: "Kinsa, Inc", + 292: "HID Global", + 293: "SEAT es", + 294: "Promethean Ltd.", + 295: "Salutica Allied Solutions", + 296: "GPSI Group Pty Ltd", + 297: "Nimble Devices Oy", + 298: "Changzhou Yongse Infotech Co., Ltd.", + 299: "SportIQ", + 300: "TEMEC Instruments B.V.", + 301: "Sony Corporation", + 302: "ASSA ABLOY", + 303: "Clarion Co. Inc.", + 304: "Warehouse Innovations", + 305: "Cypress Semiconductor", + 306: "MADS Inc", + 307: "Blue Maestro Limited", + 308: "Resolution Products, Ltd.", + 309: "Aireware LLC", + 310: "Silvair, Inc.", + 311: "Prestigio Plaza Ltd.", + 312: "NTEO Inc.", + 313: "Focus Systems Corporation", + 314: "Tencent Holdings Ltd.", + 315: "Allegion", + 316: "Murata Manufacturing Co., Ltd.", + 317: "WirelessWERX", + 318: "Nod, Inc.", + 319: "B&B Manufacturing Company", + 320: "Alpine Electronics (China) Co., Ltd", + 321: "FedEx Services", + 322: "Grape Systems Inc.", + 323: "Bkon Connect", + 324: "Lintech GmbH", + 325: "Novatel Wireless", + 326: "Ciright", + 327: "Mighty Cast, Inc.", + 328: "Ambimat Electronics", + 329: "Perytons Ltd.", + 330: "Tivoli Audio, LLC", + 331: "Master Lock", + 332: "Mesh-Net Ltd", + 333: "HUIZHOU DESAY SV AUTOMOTIVE CO., LTD.", + 334: "Tangerine, Inc.", + 335: "B&W Group Ltd.", + 336: "Pioneer Corporation", + 337: "OnBeep", + 338: "Vernier Software & Technology", + 339: "ROL Ergo", + 340: "Pebble Technology", + 341: "NETATMO", + 342: "Accumulate AB", + 343: "Anhui Huami Information Technology Co., Ltd.", + 344: "Inmite s.r.o.", + 345: "ChefSteps, Inc.", + 346: "micas AG", + 347: "Biomedical Research Ltd.", + 348: "Pitius Tec S.L.", + 349: "Estimote, Inc.", + 350: "Unikey Technologies, Inc.", + 351: "Timer Cap Co.", + 352: "AwoX", + 353: "yikes", + 354: "MADSGlobalNZ Ltd.", + 355: "PCH International", + 356: "Qingdao Yeelink Information Technology Co., Ltd.", + 357: "Milwaukee Electric Tools", + 358: "MISHIK Pte Ltd", + 359: "Ascensia Diabetes Care US Inc.", + 360: "Spicebox LLC", + 361: "emberlight", + 362: "Emerson Digital Cold Chain, Inc.", + 363: "Qblinks", + 364: "MYSPHERA", + 365: "LifeScan Inc", + 366: "Volantic AB", + 367: "Podo Labs, Inc", + 368: "Roche Diabetes Care AG", + 369: "Amazon.com Services LLC", + 370: "Connovate Technology Private Limited", + 371: "Kocomojo, LLC", + 372: "Everykey Inc.", + 373: "Dynamic Controls", + 374: "SentriLock", + 375: "I-SYST inc.", + 376: "CASIO COMPUTER CO., LTD.", + 377: "LAPIS Semiconductor Co.,Ltd", + 378: "Telemonitor, Inc.", + 379: "taskit GmbH", + 380: "Mercedes-Benz Group AG", + 381: "BatAndCat", + 382: "BluDotz Ltd", + 383: "XTel Wireless ApS", + 384: "Gigaset Communications GmbH", + 385: "Gecko Health Innovations, Inc.", + 386: "HOP Ubiquitous", + 387: "Walt Disney", + 388: "Nectar", + 389: "bel'apps LLC", + 390: "CORE Lighting Ltd", + 391: "Seraphim Sense Ltd", + 392: "Unico RBC", + 393: "Physical Enterprises Inc.", + 394: "Able Trend Technology Limited", + 395: "Konica Minolta, Inc.", + 396: "Wilo SE", + 397: "Extron Design Services", + 398: "Fitbit, Inc.", + 399: "Fireflies Systems", + 400: "Intelletto Technologies Inc.", + 401: "FDK CORPORATION", + 402: "Cloudleaf, Inc", + 403: "Maveric Automation LLC", + 404: "Acoustic Stream Corporation", + 405: "Zuli", + 406: "Paxton Access Ltd", + 407: "WiSilica Inc.", + 408: "VENGIT Korlatolt Felelossegu Tarsasag", + 409: "SALTO SYSTEMS S.L.", + 410: "TRON Forum", + 411: "CUBETECH s.r.o.", + 412: "Cokiya Incorporated", + 413: "CVS Health", + 414: "Ceruus", + 415: "Strainstall Ltd", + 416: "Channel Enterprises (HK) Ltd.", + 417: "FIAMM", + 418: "GIGALANE.CO.,LTD", + 419: "EROAD", + 420: "MSA Innovation, LLC", + 421: "Icon Health and Fitness", + 422: "Wille Engineering", + 423: "ENERGOUS CORPORATION", + 424: "Taobao", + 425: "Canon Inc.", + 426: "Geophysical Technology Inc.", + 427: "Meta Platforms, Inc.", + 428: "Trividia Health, Inc.", + 429: "FlightSafety International", + 430: "Earlens Corporation", + 431: "Sunrise Micro Devices, Inc.", + 432: "Star Micronics Co., Ltd.", + 433: "Netizens Sp. z o.o.", + 434: "Nymi Inc.", + 435: "Nytec, Inc.", + 436: "Trineo Sp. z o.o.", + 437: "Nest Labs Inc.", + 438: "LM Technologies Ltd", + 439: "General Electric Company", + 440: "i+D3 S.L.", + 441: "HANA Micron", + 442: "Stages Cycling LLC", + 443: "Cochlear Bone Anchored Solutions AB", + 444: "SenionLab AB", + 445: "Syszone Co., Ltd", + 446: "Pulsate Mobile Ltd.", + 447: "Hong Kong HunterSun Electronic Limited", + 448: "pironex GmbH", + 449: "BRADATECH Corp.", + 450: "Transenergooil AG", + 451: "Bunch", + 452: "DME Microelectronics", + 453: "Bitcraze AB", + 454: "HASWARE Inc.", + 455: "Abiogenix Inc.", + 456: "Poly-Control ApS", + 457: "Avi-on", + 458: "Laerdal Medical AS", + 459: "Fetch My Pet", + 460: "Sam Labs Ltd.", + 461: "Chengdu Synwing Technology Ltd", + 462: "HOUWA SYSTEM DESIGN, k.k.", + 463: "BSH", + 464: "Primus Inter Pares Ltd", + 465: "August Home, Inc", + 466: "Gill Electronics", + 467: "Sky Wave Design", + 468: "Newlab S.r.l.", + 469: "ELAD srl", + 470: "G-wearables inc.", + 471: "Squadrone Systems Inc.", + 472: "Code Corporation", + 473: "Savant Systems LLC", + 474: "Logitech International SA", + 475: "Innblue Consulting", + 476: "iParking Ltd.", + 477: "Koninklijke Philips N.V.", + 478: "Minelab Electronics Pty Limited", + 479: "Bison Group Ltd.", + 480: "Widex A/S", + 481: "Jolla Ltd", + 482: "Lectronix, Inc.", + 483: "Caterpillar Inc", + 484: "Freedom Innovations", + 485: "Dynamic Devices Ltd", + 486: "Technology Solutions (UK) Ltd", + 487: "IPS Group Inc.", + 488: "STIR", + 489: "Sano, Inc.", + 490: "Advanced Application Design, Inc.", + 491: "AutoMap LLC", + 492: "Spreadtrum Communications Shanghai Ltd", + 493: "CuteCircuit LTD", + 494: "Valeo Service", + 495: "Fullpower Technologies, Inc.", + 496: "KloudNation", + 497: "Zebra Technologies Corporation", + 498: "Itron, Inc.", + 499: "The University of Tokyo", + 500: "UTC Fire and Security", + 501: "Cool Webthings Limited", + 502: "DJO Global", + 503: "Gelliner Limited", + 504: "Anyka (Guangzhou) Microelectronics Technology Co, LTD", + 505: "Medtronic Inc.", + 506: "Gozio Inc.", + 507: "Form Lifting, LLC", + 508: "Wahoo Fitness, LLC", + 509: "Kontakt Micro-Location Sp. z o.o.", + 510: "Radio Systems Corporation", + 511: "Freescale Semiconductor, Inc.", + 512: "Verifone Systems Pte Ltd. Taiwan Branch", + 513: "AR Timing", + 514: "Rigado LLC", + 515: "Kemppi Oy", + 516: "Tapcentive Inc.", + 517: "Smartbotics Inc.", + 518: "Otter Products, LLC", + 519: "STEMP Inc.", + 520: "LumiGeek LLC", + 521: "InvisionHeart Inc.", + 522: "Macnica Inc.", + 523: "Jaguar Land Rover Limited", + 524: "CoroWare Technologies, Inc", + 525: "Simplo Technology Co., LTD", + 526: "Omron Healthcare Co., LTD", + 527: "Comodule GMBH", + 528: "ikeGPS", + 529: "Telink Semiconductor Co. Ltd", + 530: "Interplan Co., Ltd", + 531: "Wyler AG", + 532: "IK Multimedia Production srl", + 533: "Lukoton Experience Oy", + 534: "MTI Ltd", + 535: "Tech4home, Lda", + 536: "Hiotech AB", + 537: "DOTT Limited", + 538: "Blue Speck Labs, LLC", + 539: "Cisco Systems, Inc", + 540: "Mobicomm Inc", + 541: "Edamic", + 542: "Goodnet, Ltd", + 543: "Luster Leaf Products Inc", + 544: "Manus Machina BV", + 545: "Mobiquity Networks Inc", + 546: "Praxis Dynamics", + 547: "Philip Morris Products S.A.", + 548: "Comarch SA", + 549: "Nestl\u00e9 Nespresso S.A.", + 550: "Merlinia A/S", + 551: "LifeBEAM Technologies", + 552: "Twocanoes Labs, LLC", + 553: "Muoverti Limited", + 554: "Stamer Musikanlagen GMBH", + 555: "Tesla, Inc.", + 556: "Pharynks Corporation", + 557: "Lupine", + 558: "Siemens AG", + 559: "Huami (Shanghai) Culture Communication CO., LTD", + 560: "Foster Electric Company, Ltd", + 561: "ETA SA", + 562: "x-Senso Solutions Kft", + 563: "Shenzhen SuLong Communication Ltd", + 564: "FengFan (BeiJing) Technology Co, Ltd", + 565: "Qrio Inc", + 566: "Pitpatpet Ltd", + 567: "MSHeli s.r.l.", + 568: "Trakm8 Ltd", + 569: "JIN CO, Ltd", + 570: "Alatech Tehnology", + 571: "Beijing CarePulse Electronic Technology Co, Ltd", + 572: "Awarepoint", + 573: "ViCentra B.V.", + 574: "Raven Industries", + 575: "WaveWare Technologies Inc.", + 576: "Argenox Technologies", + 577: "Bragi GmbH", + 578: "16Lab Inc", + 579: "Masimo Corp", + 580: "Iotera Inc", + 581: "Endress+Hauser", + 582: "ACKme Networks, Inc.", + 583: "FiftyThree Inc.", + 584: "Parker Hannifin Corp", + 585: "Transcranial Ltd", + 586: "Uwatec AG", + 587: "Orlan LLC", + 588: "Blue Clover Devices", + 589: "M-Way Solutions GmbH", + 590: "Microtronics Engineering GmbH", + 591: "Schneider Schreibger\u00c3\u00a4te GmbH", + 592: "Sapphire Circuits LLC", + 593: "Lumo Bodytech Inc.", + 594: "UKC Technosolution", + 595: "Xicato Inc.", + 596: "Playbrush", + 597: "Dai Nippon Printing Co., Ltd.", + 598: "G24 Power Limited", + 599: "AdBabble Local Commerce Inc.", + 600: "Devialet SA", + 601: "ALTYOR", + 602: "University of Applied Sciences Valais/Haute Ecole Valaisanne", + 603: "Five Interactive, LLC dba Zendo", + 604: "NetEase Hangzhou Network co.Ltd.", + 605: "Lexmark International Inc.", + 606: "Fluke Corporation", + 607: "Yardarm Technologies", + 608: "SensaRx", + 609: "SECVRE GmbH", + 610: "Glacial Ridge Technologies", + 611: "Identiv, Inc.", + 612: "DDS, Inc.", + 613: "SMK Corporation", + 614: "Schawbel Technologies LLC", + 615: "XMI Systems SA", + 616: "Cerevo", + 617: "Torrox GmbH & Co KG", + 618: "Gemalto", + 619: "DEKA Research & Development Corp.", + 620: "Domster Tadeusz Szydlowski", + 621: "Technogym SPA", + 622: "FLEURBAEY BVBA", + 623: "Aptcode Solutions", + 624: "LSI ADL Technology", + 625: "Animas Corp", + 626: "Alps Alpine Co., Ltd.", + 627: "OCEASOFT", + 628: "Motsai Research", + 629: "Geotab", + 630: "E.G.O. Elektro-Geraetebau GmbH", + 631: "bewhere inc", + 632: "Johnson Outdoors Inc", + 633: "steute Schaltgerate GmbH & Co. KG", + 634: "Ekomini inc.", + 635: "DEFA AS", + 636: "Aseptika Ltd", + 637: "HUAWEI Technologies Co., Ltd.", + 638: "HabitAware, LLC", + 639: "ruwido austria gmbh", + 640: "ITEC corporation", + 641: "StoneL", + 642: "Sonova AG", + 643: "Maven Machines, Inc.", + 644: "Synapse Electronics", + 645: "WOWTech Canada Ltd.", + 646: "RF Code, Inc.", + 647: "Wally Ventures S.L.", + 648: "Willowbank Electronics Ltd", + 649: "SK Telecom", + 650: "Jetro AS", + 651: "Code Gears LTD", + 652: "NANOLINK APS", + 653: "IF, LLC", + 654: "RF Digital Corp", + 655: "Church & Dwight Co., Inc", + 656: "Multibit Oy", + 657: "CliniCloud Inc", + 658: "SwiftSensors", + 659: "Blue Bite", + 660: "ELIAS GmbH", + 661: "Sivantos GmbH", + 662: "Petzl", + 663: "storm power ltd", + 664: "EISST Ltd", + 665: "Inexess Technology Simma KG", + 666: "Currant, Inc.", + 667: "C2 Development, Inc.", + 668: "Blue Sky Scientific, LLC", + 669: "ALOTTAZS LABS, LLC", + 670: "Kupson spol. s r.o.", + 671: "Areus Engineering GmbH", + 672: "Impossible Camera GmbH", + 673: "InventureTrack Systems", + 674: "Sera4 Ltd.", + 675: "Itude", + 676: "Pacific Lock Company", + 677: "Tendyron Corporation", + 678: "Robert Bosch GmbH", + 679: "Illuxtron international B.V.", + 680: "miSport Ltd.", + 681: "Chargelib", + 682: "Doppler Lab", + 683: "BBPOS Limited", + 684: "RTB Elektronik GmbH & Co. KG", + 685: "Rx Networks, Inc.", + 686: "WeatherFlow, Inc.", + 687: "Technicolor USA Inc.", + 688: "Bestechnic(Shanghai),Ltd", + 689: "Raden Inc", + 690: "Oura Health Oy", + 691: "CLABER S.P.A.", + 692: "Hyginex, Inc.", + 693: "HANSHIN ELECTRIC RAILWAY CO.,LTD.", + 694: "Schneider Electric", + 695: "Oort Technologies LLC", + 696: "Chrono Therapeutics", + 697: "Rinnai Corporation", + 698: "Swissprime Technologies AG", + 699: "Koha.,Co.Ltd", + 700: "Genevac Ltd", + 701: "Chemtronics", + 702: "Seguro Technology Sp. z o.o.", + 703: "Redbird Flight Simulations", + 704: "Dash Robotics", + 705: "LINE Corporation", + 706: "Guillemot Corporation", + 707: "Techtronic Power Tools Technology Limited", + 708: "Wilson Sporting Goods", + 709: "Lenovo (Singapore) Pte Ltd.", + 710: "Ayatan Sensors", + 711: "Electronics Tomorrow Limited", + 712: "OneSpan", + 713: "PayRange Inc.", + 714: "ABOV Semiconductor", + 715: "AINA-Wireless Inc.", + 716: "Eijkelkamp Soil & Water", + 717: "BMA ergonomics b.v.", + 718: "Teva Branded Pharmaceutical Products R&D, Inc.", + 719: "Anima", + 720: "3M", + 721: "Empatica Srl", + 722: "Afero, Inc.", + 723: "Powercast Corporation", + 724: "Secuyou ApS", + 725: "OMRON Corporation", + 726: "Send Solutions", + 727: "NIPPON SYSTEMWARE CO.,LTD.", + 728: "Neosfar", + 729: "Fliegl Agrartechnik GmbH", + 730: "Gilvader", + 731: "Digi International Inc (R)", + 732: "DeWalch Technologies, Inc.", + 733: "Flint Rehabilitation Devices, LLC", + 734: "Samsung SDS Co., Ltd.", + 735: "Blur Product Development", + 736: "University of Michigan", + 737: "Victron Energy BV", + 738: "NTT docomo", + 739: "Carmanah Technologies Corp.", + 740: "Bytestorm Ltd.", + 741: "Espressif Systems (Shanghai) Co., Ltd.", + 742: "Unwire", + 743: "Connected Yard, Inc.", + 744: "American Music Environments", + 745: "Sensogram Technologies, Inc.", + 746: "Fujitsu Limited", + 747: "Ardic Technology", + 748: "Delta Systems, Inc", + 749: "HTC Corporation", + 750: "Citizen Holdings Co., Ltd.", + 751: "SMART-INNOVATION.inc", + 752: "Blackrat Software", + 753: "The Idea Cave, LLC", + 754: "GoPro, Inc.", + 755: "AuthAir, Inc", + 756: "Vensi, Inc.", + 757: "Indagem Tech LLC", + 758: "Intemo Technologies", + 759: "DreamVisions co., Ltd.", + 760: "Runteq Oy Ltd", + 761: "IMAGINATION TECHNOLOGIES LTD", + 762: "CoSTAR TEchnologies", + 763: "Clarius Mobile Health Corp.", + 764: "Shanghai Frequen Microelectronics Co., Ltd.", + 765: "Uwanna, Inc.", + 766: "Lierda Science & Technology Group Co., Ltd.", + 767: "Silicon Laboratories", + 768: "World Moto Inc.", + 769: "Giatec Scientific Inc.", + 770: "Loop Devices, Inc", + 771: "IACA electronique", + 772: "Proxy Technologies, Inc.", + 773: "Swipp ApS", + 774: "Life Laboratory Inc.", + 775: "FUJI INDUSTRIAL CO.,LTD.", + 776: "Surefire, LLC", + 777: "Dolby Labs", + 778: "Ellisys", + 779: "Magnitude Lighting Converters", + 780: "Hilti AG", + 781: "Devdata S.r.l.", + 782: "Deviceworx", + 783: "Shortcut Labs", + 784: "SGL Italia S.r.l.", + 785: "PEEQ DATA", + 786: "Ducere Technologies Pvt Ltd", + 787: "DiveNav, Inc.", + 788: "RIIG AI Sp. z o.o.", + 789: "Thermo Fisher Scientific", + 790: "AG Measurematics Pvt. Ltd.", + 791: "CHUO Electronics CO., LTD.", + 792: "Aspenta International", + 793: "Eugster Frismag AG", + 794: "Wurth Elektronik eiSos GmbH & Co. KG", + 795: "HQ Inc", + 796: "Lab Sensor Solutions", + 797: "Enterlab ApS", + 798: "Eyefi, Inc.", + 799: "MetaSystem S.p.A.", + 800: "SONO ELECTRONICS. CO., LTD", + 801: "Jewelbots", + 802: "Compumedics Limited", + 803: "Rotor Bike Components", + 804: "Astro, Inc.", + 805: "Amotus Solutions", + 806: "Healthwear Technologies (Changzhou)Ltd", + 807: "Essex Electronics", + 808: "Grundfos A/S", + 809: "Eargo, Inc.", + 810: "Electronic Design Lab", + 811: "ESYLUX", + 812: "NIPPON SMT.CO.,Ltd", + 813: "BM innovations GmbH", + 814: "indoormap", + 815: "OttoQ Inc", + 816: "North Pole Engineering", + 817: "3flares Technologies Inc.", + 818: "Electrocompaniet A.S.", + 819: "Mul-T-Lock", + 820: "Airthings ASA", + 821: "Enlighted Inc", + 822: "GISTIC", + 823: "AJP2 Holdings, LLC", + 824: "COBI GmbH", + 825: "Blue Sky Scientific, LLC", + 826: "Appception, Inc.", + 827: "Courtney Thorne Limited", + 828: "Virtuosys", + 829: "TPV Technology Limited", + 830: "Monitra SA", + 831: "Automation Components, Inc.", + 832: "Letsense s.r.l.", + 833: "Etesian Technologies LLC", + 834: "GERTEC BRASIL LTDA.", + 835: "Drekker Development Pty. Ltd.", + 836: "Whirl Inc", + 837: "Locus Positioning", + 838: "Acuity Brands Lighting, Inc", + 839: "Prevent Biometrics", + 840: "Arioneo", + 841: "VersaMe", + 842: "Vaddio", + 843: "Libratone A/S", + 844: "HM Electronics, Inc.", + 845: "TASER International, Inc.", + 846: "SafeTrust Inc.", + 847: "Heartland Payment Systems", + 848: "Bitstrata Systems Inc.", + 849: "Pieps GmbH", + 850: "iRiding(Xiamen)Technology Co.,Ltd.", + 851: "Alpha Audiotronics, Inc.", + 852: "TOPPAN FORMS CO.,LTD.", + 853: "Sigma Designs, Inc.", + 854: "Spectrum Brands, Inc.", + 855: "Polymap Wireless", + 856: "MagniWare Ltd.", + 857: "Novotec Medical GmbH", + 858: "Phillips-Medisize A/S", + 859: "Matrix Inc.", + 860: "Eaton Corporation", + 861: "KYS", + 862: "Naya Health, Inc.", + 863: "Acromag", + 864: "Insulet Corporation", + 865: "Wellinks Inc.", + 866: "ON Semiconductor", + 867: "FREELAP SA", + 868: "Favero Electronics Srl", + 869: "BioMech Sensor LLC", + 870: "BOLTT Sports technologies Private limited", + 871: "Saphe International", + 872: "Metormote AB", + 873: "littleBits", + 874: "SetPoint Medical", + 875: "BRControls Products BV", + 876: "Zipcar", + 877: "AirBolt Pty Ltd", + 878: "MOTIVE TECHNOLOGIES, INC.", + 879: "Motiv, Inc.", + 880: "Wazombi Labs O\u00c3\u0153", + 881: "ORBCOMM", + 882: "Nixie Labs, Inc.", + 883: "AppNearMe Ltd", + 884: "Holman Industries", + 885: "Expain AS", + 886: "Electronic Temperature Instruments Ltd", + 887: "Plejd AB", + 888: "Propeller Health", + 889: "Shenzhen iMCO Electronic Technology Co.,Ltd", + 890: "Algoria", + 891: "Apption Labs Inc.", + 892: "Cronologics Corporation", + 893: "MICRODIA Ltd.", + 894: "lulabytes S.L.", + 895: "Soci\u00e9t\u00e9 des Produits Nestl\u00e9 S.A.", + 896: "LLC \"MEGA-F service\"", + 897: "Sharp Corporation", + 898: "Precision Outcomes Ltd", + 899: "Kronos Incorporated", + 900: "OCOSMOS Co., Ltd.", + 901: "Embedded Electronic Solutions Ltd. dba e2Solutions", + 902: "Aterica Inc.", + 903: "BluStor PMC, Inc.", + 904: "Kapsch TrafficCom AB", + 905: "ActiveBlu Corporation", + 906: "Kohler Mira Limited", + 907: "Noke", + 908: "Appion Inc.", + 909: "Resmed Ltd", + 910: "Crownstone B.V.", + 911: "Xiaomi Inc.", + 912: "INFOTECH s.r.o.", + 913: "Thingsquare AB", + 914: "T&D", + 915: "LAVAZZA S.p.A.", + 916: "Netclearance Systems, Inc.", + 917: "SDATAWAY", + 918: "BLOKS GmbH", + 919: "LEGO System A/S", + 920: "Thetatronics Ltd", + 921: "Nikon Corporation", + 922: "NeST", + 923: "South Silicon Valley Microelectronics", + 924: "ALE International", + 925: "CareView Communications, Inc.", + 926: "SchoolBoard Limited", + 927: "Molex Corporation", + 928: "IVT Wireless Limited", + 929: "Alpine Labs LLC", + 930: "Candura Instruments", + 931: "SmartMovt Technology Co., Ltd", + 932: "Token Zero Ltd", + 933: "ACE CAD Enterprise Co., Ltd. (ACECAD)", + 934: "Medela, Inc", + 935: "AeroScout", + 936: "Esrille Inc.", + 937: "THINKERLY SRL", + 938: "Exon Sp. z o.o.", + 939: "Meizu Technology Co., Ltd.", + 940: "Smablo LTD", + 941: "XiQ", + 942: "Allswell Inc.", + 943: "Comm-N-Sense Corp DBA Verigo", + 944: "VIBRADORM GmbH", + 945: "Otodata Wireless Network Inc.", + 946: "Propagation Systems Limited", + 947: "Midwest Instruments & Controls", + 948: "Alpha Nodus, inc.", + 949: "petPOMM, Inc", + 950: "Mattel", + 951: "Airbly Inc.", + 952: "A-Safe Limited", + 953: "FREDERIQUE CONSTANT SA", + 954: "Maxscend Microelectronics Company Limited", + 955: "Abbott", + 956: "ASB Bank Ltd", + 957: "amadas", + 958: "Applied Science, Inc.", + 959: "iLumi Solutions Inc.", + 960: "Arch Systems Inc.", + 961: "Ember Technologies, Inc.", + 962: "Snapchat Inc", + 963: "Casambi Technologies Oy", + 964: "Pico Technology Inc.", + 965: "St. Jude Medical, Inc.", + 966: "Intricon", + 967: "Structural Health Systems, Inc.", + 968: "Avvel International", + 969: "Gallagher Group", + 970: "In2things Automation Pvt. Ltd.", + 971: "SYSDEV Srl", + 972: "Vonkil Technologies Ltd", + 973: "Wynd Technologies, Inc.", + 974: "CONTRINEX S.A.", + 975: "MIRA, Inc.", + 976: "Watteam Ltd", + 977: "Density Inc.", + 978: "IOT Pot India Private Limited", + 979: "Sigma Connectivity AB", + 980: "PEG PEREGO SPA", + 981: "Wyzelink Systems Inc.", + 982: "Yota Devices LTD", + 983: "FINSECUR", + 984: "Zen-Me Labs Ltd", + 985: "3IWare Co., Ltd.", + 986: "EnOcean GmbH", + 987: "Instabeat, Inc", + 988: "Nima Labs", + 989: "Andreas Stihl AG & Co. KG", + 990: "Nathan Rhoades LLC", + 991: "Grob Technologies, LLC", + 992: "Actions (Zhuhai) Technology Co., Limited", + 993: "SPD Development Company Ltd", + 994: "Sensoan Oy", + 995: "Qualcomm Life Inc", + 996: "Chip-ing AG", + 997: "ffly4u", + 998: "IoT Instruments Oy", + 999: "TRUE Fitness Technology", + 1000: "Reiner Kartengeraete GmbH & Co. KG.", + 1001: "SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.", + 1002: "Hello Inc.", + 1003: "Ozo Edu, Inc.", + 1004: "Jigowatts Inc.", + 1005: "BASIC MICRO.COM,INC.", + 1006: "CUBE TECHNOLOGIES", + 1007: "foolography GmbH", + 1008: "CLINK", + 1009: "Hestan Smart Cooking Inc.", + 1010: "WindowMaster A/S", + 1011: "Flowscape AB", + 1012: "PAL Technologies Ltd", + 1013: "WHERE, Inc.", + 1014: "Iton Technology Corp.", + 1015: "Owl Labs Inc.", + 1016: "Rockford Corp.", + 1017: "Becon Technologies Co.,Ltd.", + 1018: "Vyassoft Technologies Inc", + 1019: "Nox Medical", + 1020: "Kimberly-Clark", + 1021: "Trimble Inc.", + 1022: "Littelfuse", + 1023: "Withings", + 1024: "i-developer IT Beratung UG", + 1025: "Relations Inc.", + 1026: "Sears Holdings Corporation", + 1027: "Gantner Electronic GmbH", + 1028: "Authomate Inc", + 1029: "Vertex International, Inc.", + 1030: "Airtago", + 1031: "Swiss Audio SA", + 1032: "ToGetHome Inc.", + 1033: "RYSE INC.", + 1034: "ZF OPENMATICS s.r.o.", + 1035: "Jana Care Inc.", + 1036: "Senix Corporation", + 1037: "NorthStar Battery Company, LLC", + 1038: "SKF (U.K.) Limited", + 1039: "CO-AX Technology, Inc.", + 1040: "Fender Musical Instruments", + 1041: "Luidia Inc", + 1042: "SEFAM", + 1043: "Wireless Cables Inc", + 1044: "Lightning Protection International Pty Ltd", + 1045: "Uber Technologies Inc", + 1046: "SODA GmbH", + 1047: "Fatigue Science", + 1048: "Reserved", + 1049: "Novalogy LTD", + 1050: "Friday Labs Limited", + 1051: "OrthoAccel Technologies", + 1052: "WaterGuru, Inc.", + 1053: "Benning Elektrotechnik und Elektronik GmbH & Co. KG", + 1054: "Dell Computer Corporation", + 1055: "Kopin Corporation", + 1056: "TecBakery GmbH", + 1057: "Backbone Labs, Inc.", + 1058: "DELSEY SA", + 1059: "Chargifi Limited", + 1060: "Trainesense Ltd.", + 1061: "Unify Software and Solutions GmbH & Co. KG", + 1062: "Husqvarna AB", + 1063: "Focus fleet and fuel management inc", + 1064: "SmallLoop, LLC", + 1065: "Prolon Inc.", + 1066: "BD Medical", + 1067: "iMicroMed Incorporated", + 1068: "Ticto N.V.", + 1069: "Meshtech AS", + 1070: "MemCachier Inc.", + 1071: "Danfoss A/S", + 1072: "SnapStyk Inc.", + 1073: "Alticor Inc.", + 1074: "Silk Labs, Inc.", + 1075: "Pillsy Inc.", + 1076: "Hatch Baby, Inc.", + 1077: "Blocks Wearables Ltd.", + 1078: "Drayson Technologies (Europe) Limited", + 1079: "eBest IOT Inc.", + 1080: "Helvar Ltd", + 1081: "Radiance Technologies", + 1082: "Nuheara Limited", + 1083: "Appside co., ltd.", + 1084: "DeLaval", + 1085: "Coiler Corporation", + 1086: "Thermomedics, Inc.", + 1087: "Tentacle Sync GmbH", + 1088: "Valencell, Inc.", + 1089: "iProtoXi Oy", + 1090: "SECOM CO., LTD.", + 1091: "Tucker International LLC", + 1092: "Metanate Limited", + 1093: "Kobian Canada Inc.", + 1094: "NETGEAR, Inc.", + 1095: "Fabtronics Australia Pty Ltd", + 1096: "Grand Centrix GmbH", + 1097: "1UP USA.com llc", + 1098: "SHIMANO INC.", + 1099: "Nain Inc.", + 1100: "LifeStyle Lock, LLC", + 1101: "VEGA Grieshaber KG", + 1102: "Xtrava Inc.", + 1103: "TTS Tooltechnic Systems AG & Co. KG", + 1104: "Teenage Engineering AB", + 1105: "Tunstall Nordic AB", + 1106: "Svep Design Center AB", + 1107: "Qorvo Utrecht B.V.", + 1108: "Sphinx Electronics GmbH & Co KG", + 1109: "Atomation", + 1110: "Nemik Consulting Inc", + 1111: "RF INNOVATION", + 1112: "Mini Solution Co., Ltd.", + 1113: "Lumenetix, Inc", + 1114: "2048450 Ontario Inc", + 1115: "SPACEEK LTD", + 1116: "Delta T Corporation", + 1117: "Boston Scientific Corporation", + 1118: "Nuviz, Inc.", + 1119: "Real Time Automation, Inc.", + 1120: "Kolibree", + 1121: "vhf elektronik GmbH", + 1122: "Bonsai Systems GmbH", + 1123: "Fathom Systems Inc.", + 1124: "Bellman & Symfon", + 1125: "International Forte Group LLC", + 1126: "CycleLabs Solutions inc.", + 1127: "Codenex Oy", + 1128: "Kynesim Ltd", + 1129: "Palago AB", + 1130: "INSIGMA INC.", + 1131: "PMD Solutions", + 1132: "Qingdao Realtime Technology Co., Ltd.", + 1133: "BEGA Gantenbrink-Leuchten KG", + 1134: "Pambor Ltd.", + 1135: "Develco Products A/S", + 1136: "iDesign s.r.l.", + 1137: "TiVo Corp", + 1138: "Control-J Pty Ltd", + 1139: "Steelcase, Inc.", + 1140: "iApartment co., ltd.", + 1141: "Icom inc.", + 1142: "Oxstren Wearable Technologies Private Limited", + 1143: "Blue Spark Technologies", + 1144: "FarSite Communications Limited", + 1145: "mywerk system GmbH", + 1146: "Sinosun Technology Co., Ltd.", + 1147: "MIYOSHI ELECTRONICS CORPORATION", + 1148: "POWERMAT LTD", + 1149: "Occly LLC", + 1150: "OurHub Dev IvS", + 1151: "Pro-Mark, Inc.", + 1152: "Dynometrics Inc.", + 1153: "Quintrax Limited", + 1154: "POS Tuning Udo Vosshenrich GmbH & Co. KG", + 1155: "Multi Care Systems B.V.", + 1156: "Revol Technologies Inc", + 1157: "SKIDATA AG", + 1158: "DEV TECNOLOGIA INDUSTRIA, COMERCIO E MANUTENCAO DE EQUIPAMENTOS LTDA. - ME", + 1159: "Centrica Connected Home", + 1160: "Automotive Data Solutions Inc", + 1161: "Igarashi Engineering", + 1162: "Taelek Oy", + 1163: "CP Electronics Limited", + 1164: "Vectronix AG", + 1165: "S-Labs Sp. z o.o.", + 1166: "Companion Medical, Inc.", + 1167: "BlueKitchen GmbH", + 1168: "Matting AB", + 1169: "SOREX - Wireless Solutions GmbH", + 1170: "ADC Technology, Inc.", + 1171: "Lynxemi Pte Ltd", + 1172: "SENNHEISER electronic GmbH & Co. KG", + 1173: "LMT Mercer Group, Inc", + 1174: "Polymorphic Labs LLC", + 1175: "Cochlear Limited", + 1176: "METER Group, Inc. USA", + 1177: "Ruuvi Innovations Ltd.", + 1178: "Situne AS", + 1179: "nVisti, LLC", + 1180: "DyOcean", + 1181: "Uhlmann & Zacher GmbH", + 1182: "AND!XOR LLC", + 1183: "Popper Pay AB", + 1184: "Vypin, LLC", + 1185: "PNI Sensor Corporation", + 1186: "ovrEngineered, LLC", + 1187: "GT-tronics HK Ltd", + 1188: "Herbert Waldmann GmbH & Co. KG", + 1189: "Guangzhou FiiO Electronics Technology Co.,Ltd", + 1190: "Vinetech Co., Ltd", + 1191: "Dallas Logic Corporation", + 1192: "BioTex, Inc.", + 1193: "DISCOVERY SOUND TECHNOLOGY, LLC", + 1194: "LINKIO SAS", + 1195: "Harbortronics, Inc.", + 1196: "Undagrid B.V.", + 1197: "Shure Inc", + 1198: "ERM Electronic Systems LTD", + 1199: "BIOROWER Handelsagentur GmbH", + 1200: "Weba Sport und Med. Artikel GmbH", + 1201: "Kartographers Technologies Pvt. Ltd.", + 1202: "The Shadow on the Moon", + 1203: "mobike (Hong Kong) Limited", + 1204: "Inuheat Group AB", + 1205: "Swiftronix AB", + 1206: "Diagnoptics Technologies", + 1207: "Analog Devices, Inc.", + 1208: "Soraa Inc.", + 1209: "CSR Building Products Limited", + 1210: "Crestron Electronics, Inc.", + 1211: "Neatebox Ltd", + 1212: "Draegerwerk AG & Co. KGaA", + 1213: "AlbynMedical", + 1214: "Averos FZCO", + 1215: "VIT Initiative, LLC", + 1216: "Statsports International", + 1217: "Sospitas, s.r.o.", + 1218: "Dmet Products Corp.", + 1219: "Mantracourt Electronics Limited", + 1220: "TeAM Hutchins AB", + 1221: "Seibert Williams Glass, LLC", + 1222: "Insta GmbH", + 1223: "Svantek Sp. z o.o.", + 1224: "Shanghai Flyco Electrical Appliance Co., Ltd.", + 1225: "Thornwave Labs Inc", + 1226: "Steiner-Optik GmbH", + 1227: "Novo Nordisk A/S", + 1228: "Enflux Inc.", + 1229: "Safetech Products LLC", + 1230: "GOOOLED S.R.L.", + 1231: "DOM Sicherheitstechnik GmbH & Co. KG", + 1232: "Olympus Corporation", + 1233: "KTS GmbH", + 1234: "Anloq Technologies Inc.", + 1235: "Queercon, Inc", + 1236: "5th Element Ltd", + 1237: "Gooee Limited", + 1238: "LUGLOC LLC", + 1239: "Blincam, Inc.", + 1240: "FUJIFILM Corporation", + 1241: "RM Acquisition LLC", + 1242: "Franceschi Marina snc", + 1243: "Engineered Audio, LLC.", + 1244: "IOTTIVE (OPC) PRIVATE LIMITED", + 1245: "4MOD Technology", + 1246: "Lutron Electronics Co., Inc.", + 1247: "Emerson Electric Co.", + 1248: "Guardtec, Inc.", + 1249: "REACTEC LIMITED", + 1250: "EllieGrid", + 1251: "Under Armour", + 1252: "Woodenshark", + 1253: "Avack Oy", + 1254: "Smart Solution Technology, Inc.", + 1255: "REHABTRONICS INC.", + 1256: "STABILO International", + 1257: "Busch Jaeger Elektro GmbH", + 1258: "Pacific Bioscience Laboratories, Inc", + 1259: "Bird Home Automation GmbH", + 1260: "Motorola Solutions", + 1261: "R9 Technology, Inc.", + 1262: "Auxivia", + 1263: "DaisyWorks, Inc", + 1264: "Kosi Limited", + 1265: "Theben AG", + 1266: "InDreamer Techsol Private Limited", + 1267: "Cerevast Medical", + 1268: "ZanCompute Inc.", + 1269: "Pirelli Tyre S.P.A.", + 1270: "McLear Limited", + 1271: "Shenzhen Goodix Technology Co., Ltd", + 1272: "Convergence Systems Limited", + 1273: "Interactio", + 1274: "Androtec GmbH", + 1275: "Benchmark Drives GmbH & Co. KG", + 1276: "SwingLync L. L. C.", + 1277: "Tapkey GmbH", + 1278: "Woosim Systems Inc.", + 1279: "Microsemi Corporation", + 1280: "Wiliot LTD.", + 1281: "Polaris IND", + 1282: "Specifi-Kali LLC", + 1283: "Locoroll, Inc", + 1284: "PHYPLUS Inc", + 1285: "InPlay, Inc.", + 1286: "Hager", + 1287: "Yellowcog", + 1288: "Axes System sp. z o. o.", + 1289: "Garage Smart, Inc.", + 1290: "Shake-on B.V.", + 1291: "Vibrissa Inc.", + 1292: "OSRAM GmbH", + 1293: "TRSystems GmbH", + 1294: "Yichip Microelectronics (Hangzhou) Co.,Ltd.", + 1295: "Foundation Engineering LLC", + 1296: "UNI-ELECTRONICS, INC.", + 1297: "Brookfield Equinox LLC", + 1298: "Soprod SA", + 1299: "9974091 Canada Inc.", + 1300: "FIBRO GmbH", + 1301: "RB Controls Co., Ltd.", + 1302: "Footmarks", + 1303: "Amtronic Sverige AB", + 1304: "MAMORIO.inc", + 1305: "Tyto Life LLC", + 1306: "Leica Camera AG", + 1307: "Angee Technologies Ltd.", + 1308: "EDPS", + 1309: "OFF Line Co., Ltd.", + 1310: "Detect Blue Limited", + 1311: "Setec Pty Ltd", + 1312: "Target Corporation", + 1313: "IAI Corporation", + 1314: "NS Tech, Inc.", + 1315: "MTG Co., Ltd.", + 1316: "Hangzhou iMagic Technology Co., Ltd", + 1317: "HONGKONG NANO IC TECHNOLOGIES CO., LIMITED", + 1318: "Honeywell International Inc.", + 1319: "Albrecht JUNG", + 1320: "Lunera Lighting Inc.", + 1321: "Lumen UAB", + 1322: "Keynes Controls Ltd", + 1323: "Novartis AG", + 1324: "Geosatis SA", + 1325: "EXFO, Inc.", + 1326: "LEDVANCE GmbH", + 1327: "Center ID Corp.", + 1328: "Adolene, Inc.", + 1329: "D&M Holdings Inc.", + 1330: "CRESCO Wireless, Inc.", + 1331: "Nura Operations Pty Ltd", + 1332: "Frontiergadget, Inc.", + 1333: "Smart Component Technologies Limited", + 1334: "ZTR Control Systems LLC", + 1335: "MetaLogics Corporation", + 1336: "Medela AG", + 1337: "OPPLE Lighting Co., Ltd", + 1338: "Savitech Corp.,", + 1339: "prodigy", + 1340: "Screenovate Technologies Ltd", + 1341: "TESA SA", + 1342: "CLIM8 LIMITED", + 1343: "Silergy Corp", + 1344: "SilverPlus, Inc", + 1345: "Sharknet srl", + 1346: "Mist Systems, Inc.", + 1347: "MIWA LOCK CO.,Ltd", + 1348: "OrthoSensor, Inc.", + 1349: "Candy Hoover Group s.r.l", + 1350: "Apexar Technologies S.A.", + 1351: "LOGICDATA Electronic & Software Entwicklungs GmbH", + 1352: "Knick Elektronische Messgeraete GmbH & Co. KG", + 1353: "Smart Technologies and Investment Limited", + 1354: "Linough Inc.", + 1355: "Advanced Electronic Designs, Inc.", + 1356: "Carefree Scott Fetzer Co Inc", + 1357: "Sensome", + 1358: "FORTRONIK storitve d.o.o.", + 1359: "Sinnoz", + 1360: "Versa Networks, Inc.", + 1361: "Sylero", + 1362: "Avempace SARL", + 1363: "Nintendo Co., Ltd.", + 1364: "National Instruments", + 1365: "KROHNE Messtechnik GmbH", + 1366: "Otodynamics Ltd", + 1367: "Arwin Technology Limited", + 1368: "benegear, inc.", + 1369: "Newcon Optik", + 1370: "CANDY HOUSE, Inc.", + 1371: "FRANKLIN TECHNOLOGY INC", + 1372: "Lely", + 1373: "Valve Corporation", + 1374: "Hekatron Vertriebs GmbH", + 1375: "PROTECH S.A.S. DI GIRARDI ANDREA & C.", + 1376: "Sarita CareTech APS", + 1377: "Finder S.p.A.", + 1378: "Thalmic Labs Inc.", + 1379: "Steinel Vertrieb GmbH", + 1380: "Beghelli Spa", + 1381: "Beijing Smartspace Technologies Inc.", + 1382: "CORE TRANSPORT TECHNOLOGIES NZ LIMITED", + 1383: "Xiamen Everesports Goods Co., Ltd", + 1384: "Bodyport Inc.", + 1385: "Audionics System, INC.", + 1386: "Flipnavi Co.,Ltd.", + 1387: "Rion Co., Ltd.", + 1388: "Long Range Systems, LLC", + 1389: "Redmond Industrial Group LLC", + 1390: "VIZPIN INC.", + 1391: "BikeFinder AS", + 1392: "Consumer Sleep Solutions LLC", + 1393: "PSIKICK, INC.", + 1394: "AntTail.com", + 1395: "Lighting Science Group Corp.", + 1396: "AFFORDABLE ELECTRONICS INC", + 1397: "Integral Memroy Plc", + 1398: "Globalstar, Inc.", + 1399: "True Wearables, Inc.", + 1400: "Wellington Drive Technologies Ltd", + 1401: "Ensemble Tech Private Limited", + 1402: "OMNI Remotes", + 1403: "Duracell U.S. Operations Inc.", + 1404: "Toor Technologies LLC", + 1405: "Instinct Performance", + 1406: "Beco, Inc", + 1407: "Scuf Gaming International, LLC", + 1408: "ARANZ Medical Limited", + 1409: "LYS TECHNOLOGIES LTD", + 1410: "Breakwall Analytics, LLC", + 1411: "Code Blue Communications", + 1412: "Gira Giersiepen GmbH & Co. KG", + 1413: "Hearing Lab Technology", + 1414: "LEGRAND", + 1415: "Derichs GmbH", + 1416: "ALT-TEKNIK LLC", + 1417: "Star Technologies", + 1418: "START TODAY CO.,LTD.", + 1419: "Maxim Integrated Products", + 1420: "Fracarro Radioindustrie SRL", + 1421: "Jungheinrich Aktiengesellschaft", + 1422: "Meta Platforms Technologies, LLC", + 1423: "HENDON SEMICONDUCTORS PTY LTD", + 1424: "Pur3 Ltd", + 1425: "Viasat Group S.p.A.", + 1426: "IZITHERM", + 1427: "Spaulding Clinical Research", + 1428: "Kohler Company", + 1429: "Inor Process AB", + 1430: "My Smart Blinds", + 1431: "RadioPulse Inc", + 1432: "rapitag GmbH", + 1433: "Lazlo326, LLC.", + 1434: "Teledyne Lecroy, Inc.", + 1435: "Dataflow Systems Limited", + 1436: "Macrogiga Electronics", + 1437: "Tandem Diabetes Care", + 1438: "Polycom, Inc.", + 1439: "Fisher & Paykel Healthcare", + 1440: "RCP Software Oy", + 1441: "Shanghai Xiaoyi Technology Co.,Ltd.", + 1442: "ADHERIUM(NZ) LIMITED", + 1443: "Axiomware Systems Incorporated", + 1444: "O. E. M. Controls, Inc.", + 1445: "Kiiroo BV", + 1446: "Telecon Mobile Limited", + 1447: "Sonos Inc", + 1448: "Tom Allebrandi Consulting", + 1449: "Monidor", + 1450: "Tramex Limited", + 1451: "Nofence AS", + 1452: "GoerTek Dynaudio Co., Ltd.", + 1453: "INIA", + 1454: "CARMATE MFG.CO.,LTD", + 1455: "OV LOOP, INC.", + 1456: "NewTec GmbH", + 1457: "Medallion Instrumentation Systems", + 1458: "CAREL INDUSTRIES S.P.A.", + 1459: "Parabit Systems, Inc.", + 1460: "White Horse Scientific ltd", + 1461: "verisilicon", + 1462: "Elecs Industry Co.,Ltd.", + 1463: "Beijing Pinecone Electronics Co.,Ltd.", + 1464: "Ambystoma Labs Inc.", + 1465: "Suzhou Pairlink Network Technology", + 1466: "igloohome", + 1467: "Oxford Metrics plc", + 1468: "Leviton Mfg. Co., Inc.", + 1469: "ULC Robotics Inc.", + 1470: "RFID Global by Softwork SrL", + 1471: "Real-World-Systems Corporation", + 1472: "Nalu Medical, Inc.", + 1473: "P.I.Engineering", + 1474: "Grote Industries", + 1475: "Runtime, Inc.", + 1476: "Codecoup sp. z o.o. sp. k.", + 1477: "SELVE GmbH & Co. KG", + 1478: "Smart Animal Training Systems, LLC", + 1479: "Lippert Components, INC", + 1480: "SOMFY SAS", + 1481: "TBS Electronics B.V.", + 1482: "MHL Custom Inc", + 1483: "LucentWear LLC", + 1484: "WATTS ELECTRONICS", + 1485: "RJ Brands LLC", + 1486: "V-ZUG Ltd", + 1487: "Biowatch SA", + 1488: "Anova Applied Electronics", + 1489: "Lindab AB", + 1490: "frogblue TECHNOLOGY GmbH", + 1491: "Acurable Limited", + 1492: "LAMPLIGHT Co., Ltd.", + 1493: "TEGAM, Inc.", + 1494: "Zhuhai Jieli technology Co.,Ltd", + 1495: "modum.io AG", + 1496: "Farm Jenny LLC", + 1497: "Toyo Electronics Corporation", + 1498: "Applied Neural Research Corp", + 1499: "Avid Identification Systems, Inc.", + 1500: "Petronics Inc.", + 1501: "essentim GmbH", + 1502: "QT Medical INC.", + 1503: "VIRTUALCLINIC.DIRECT LIMITED", + 1504: "Viper Design LLC", + 1505: "Human, Incorporated", + 1506: "stAPPtronics GmbH", + 1507: "Elemental Machines, Inc.", + 1508: "Taiyo Yuden Co., Ltd", + 1509: "INEO ENERGY& SYSTEMS", + 1510: "Motion Instruments Inc.", + 1511: "PressurePro", + 1512: "COWBOY", + 1513: "iconmobile GmbH", + 1514: "ACS-Control-System GmbH", + 1515: "Bayerische Motoren Werke AG", + 1516: "Gycom Svenska AB", + 1517: "Fuji Xerox Co., Ltd", + 1518: "Wristcam Inc.", + 1519: "SIKOM AS", + 1520: "beken", + 1521: "The Linux Foundation", + 1522: "Try and E CO.,LTD.", + 1523: "SeeScan", + 1524: "Clearity, LLC", + 1525: "GS TAG", + 1526: "DPTechnics", + 1527: "TRACMO, INC.", + 1528: "Anki Inc.", + 1529: "Hagleitner Hygiene International GmbH", + 1530: "Konami Sports Life Co., Ltd.", + 1531: "Arblet Inc.", + 1532: "Masbando GmbH", + 1533: "Innoseis", + 1534: "Niko nv", + 1535: "Wellnomics Ltd", + 1536: "iRobot Corporation", + 1537: "Schrader Electronics", + 1538: "Geberit International AG", + 1539: "Fourth Evolution Inc", + 1540: "Cell2Jack LLC", + 1541: "FMW electronic Futterer u. Maier-Wolf OHG", + 1542: "John Deere", + 1543: "Rookery Technology Ltd", + 1544: "KeySafe-Cloud", + 1545: "BUCHI Labortechnik AG", + 1546: "IQAir AG", + 1547: "Triax Technologies Inc", + 1548: "Vuzix Corporation", + 1549: "TDK Corporation", + 1550: "Blueair AB", + 1551: "Signify Netherlands B.V.", + 1552: "ADH GUARDIAN USA LLC", + 1553: "Beurer GmbH", + 1554: "Playfinity AS", + 1555: "Hans Dinslage GmbH", + 1556: "OnAsset Intelligence, Inc.", + 1557: "INTER ACTION Corporation", + 1558: "OS42 UG (haftungsbeschraenkt)", + 1559: "WIZCONNECTED COMPANY LIMITED", + 1560: "Audio-Technica Corporation", + 1561: "Six Guys Labs, s.r.o.", + 1562: "R.W. Beckett Corporation", + 1563: "silex technology, inc.", + 1564: "Univations Limited", + 1565: "SENS Innovation ApS", + 1566: "Diamond Kinetics, Inc.", + 1567: "Phrame Inc.", + 1568: "Forciot Oy", + 1569: "Noordung d.o.o.", + 1570: "Beam Labs, LLC", + 1571: "Philadelphia Scientific (U.K.) Limited", + 1572: "Biovotion AG", + 1573: "Square Panda, Inc.", + 1574: "Amplifico", + 1575: "WEG S.A.", + 1576: "Ensto Oy", + 1577: "PHONEPE PVT LTD", + 1578: "Lunatico Astronomia SL", + 1579: "MinebeaMitsumi Inc.", + 1580: "ASPion GmbH", + 1581: "Vossloh-Schwabe Deutschland GmbH", + 1582: "Procept", + 1583: "ONKYO Corporation", + 1584: "Asthrea D.O.O.", + 1585: "Fortiori Design LLC", + 1586: "Hugo Muller GmbH & Co KG", + 1587: "Wangi Lai PLT", + 1588: "Fanstel Corp", + 1589: "Crookwood", + 1590: "ELECTRONICA INTEGRAL DE SONIDO S.A.", + 1591: "GiP Innovation Tools GmbH", + 1592: "LX SOLUTIONS PTY LIMITED", + 1593: "Shenzhen Minew Technologies Co., Ltd.", + 1594: "Prolojik Limited", + 1595: "Kromek Group Plc", + 1596: "Contec Medical Systems Co., Ltd.", + 1597: "Xradio Technology Co.,Ltd.", + 1598: "The Indoor Lab, LLC", + 1599: "LDL TECHNOLOGY", + 1600: "Dish Network LLC", + 1601: "Revenue Collection Systems FRANCE SAS", + 1602: "Bluetrum Technology Co.,Ltd", + 1603: "makita corporation", + 1604: "Apogee Instruments", + 1605: "BM3", + 1606: "SGV Group Holding GmbH & Co. KG", + 1607: "MED-EL", + 1608: "Ultune Technologies", + 1609: "Ryeex Technology Co.,Ltd.", + 1610: "Open Research Institute, Inc.", + 1611: "Scale-Tec, Ltd", + 1612: "Zumtobel Group AG", + 1613: "iLOQ Oy", + 1614: "KRUXWorks Technologies Private Limited", + 1615: "Digital Matter Pty Ltd", + 1616: "Coravin, Inc.", + 1617: "Stasis Labs, Inc.", + 1618: "ITZ Innovations- und Technologiezentrum GmbH", + 1619: "Meggitt SA", + 1620: "Ledlenser GmbH & Co. KG", + 1621: "Renishaw PLC", + 1622: "ZhuHai AdvanPro Technology Company Limited", + 1623: "Meshtronix Limited", + 1624: "Payex Norge AS", + 1625: "UnSeen Technologies Oy", + 1626: "Zound Industries International AB", + 1627: "Sesam Solutions BV", + 1628: "PixArt Imaging Inc.", + 1629: "Panduit Corp.", + 1630: "Alo AB", + 1631: "Ricoh Company Ltd", + 1632: "RTC Industries, Inc.", + 1633: "Mode Lighting Limited", + 1634: "Particle Industries, Inc.", + 1635: "Advanced Telemetry Systems, Inc.", + 1636: "RHA TECHNOLOGIES LTD", + 1637: "Pure International Limited", + 1638: "WTO Werkzeug-Einrichtungen GmbH", + 1639: "Spark Technology Labs Inc.", + 1640: "Bleb Technology srl", + 1641: "Livanova USA, Inc.", + 1642: "Brady Worldwide Inc.", + 1643: "DewertOkin GmbH", + 1644: "Ztove ApS", + 1645: "Venso EcoSolutions AB", + 1646: "Eurotronik Kranj d.o.o.", + 1647: "Hug Technology Ltd", + 1648: "Gema Switzerland GmbH", + 1649: "Buzz Products Ltd.", + 1650: "Kopi", + 1651: "Innova Ideas Limited", + 1652: "BeSpoon", + 1653: "Deco Enterprises, Inc.", + 1654: "Expai Solutions Private Limited", + 1655: "Innovation First, Inc.", + 1656: "SABIK Offshore GmbH", + 1657: "4iiii Innovations Inc.", + 1658: "The Energy Conservatory, Inc.", + 1659: "I.FARM, INC.", + 1660: "Tile, Inc.", + 1661: "Form Athletica Inc.", + 1662: "MbientLab Inc", + 1663: "NETGRID S.N.C. DI BISSOLI MATTEO, CAMPOREALE SIMONE, TOGNETTI FEDERICO", + 1664: "Mannkind Corporation", + 1665: "Trade FIDES a.s.", + 1666: "Photron Limited", + 1667: "Eltako GmbH", + 1668: "Dermalapps, LLC", + 1669: "Greenwald Industries", + 1670: "inQs Co., Ltd.", + 1671: "Cherry GmbH", + 1672: "Amsted Digital Solutions Inc.", + 1673: "Tacx b.v.", + 1674: "Raytac Corporation", + 1675: "Jiangsu Teranovo Tech Co., Ltd.", + 1676: "Changzhou Sound Dragon Electronics and Acoustics Co., Ltd", + 1677: "JetBeep Inc.", + 1678: "Razer Inc.", + 1679: "JRM Group Limited", + 1680: "Eccrine Systems, Inc.", + 1681: "Curie Point AB", + 1682: "Georg Fischer AG", + 1683: "Hach - Danaher", + 1684: "T&A Laboratories LLC", + 1685: "Koki Holdings Co., Ltd.", + 1686: "Gunakar Private Limited", + 1687: "Stemco Products Inc", + 1688: "Wood IT Security, LLC", + 1689: "RandomLab SAS", + 1690: "Adero, Inc.", + 1691: "Dragonchip Limited", + 1692: "Noomi AB", + 1693: "Vakaros LLC", + 1694: "Delta Electronics, Inc.", + 1695: "FlowMotion Technologies AS", + 1696: "OBIQ Location Technology Inc.", + 1697: "Cardo Systems, Ltd", + 1698: "Globalworx GmbH", + 1699: "Nymbus, LLC", + 1700: "LIMNO Co. Ltd.", + 1701: "TEKZITEL PTY LTD", + 1702: "Roambee Corporation", + 1703: "Chipsea Technologies (ShenZhen) Corp.", + 1704: "GD Midea Air-Conditioning Equipment Co., Ltd.", + 1705: "Soundmax Electronics Limited", + 1706: "Produal Oy", + 1707: "HMS Industrial Networks AB", + 1708: "Ingchips Technology Co., Ltd.", + 1709: "InnovaSea Systems Inc.", + 1710: "SenseQ Inc.", + 1711: "Shoof Technologies", + 1712: "BRK Brands, Inc.", + 1713: "SimpliSafe, Inc.", + 1714: "Tussock Innovation 2013 Limited", + 1715: "The Hablab ApS", + 1716: "Sencilion Oy", + 1717: "Wabilogic Ltd.", + 1718: "Sociometric Solutions, Inc.", + 1719: "iCOGNIZE GmbH", + 1720: "ShadeCraft, Inc", + 1721: "Beflex Inc.", + 1722: "Beaconzone Ltd", + 1723: "Leaftronix Analogic Solutions Private Limited", + 1724: "TWS Srl", + 1725: "ABB Oy", + 1726: "HitSeed Oy", + 1727: "Delcom Products Inc.", + 1728: "CAME S.p.A.", + 1729: "Alarm.com Holdings, Inc", + 1730: "Measurlogic Inc.", + 1731: "King I Electronics.Co.,Ltd", + 1732: "Dream Labs GmbH", + 1733: "Urban Compass, Inc", + 1734: "Simm Tronic Limited", + 1735: "Somatix Inc", + 1736: "Storz & Bickel GmbH & Co. KG", + 1737: "MYLAPS B.V.", + 1738: "Shenzhen Zhongguang Infotech Technology Development Co., Ltd", + 1739: "Dyeware, LLC", + 1740: "Dongguan SmartAction Technology Co.,Ltd.", + 1741: "DIG Corporation", + 1742: "FIOR & GENTZ", + 1743: "Belparts N.V.", + 1744: "Etekcity Corporation", + 1745: "Meyer Sound Laboratories, Incorporated", + 1746: "CeoTronics AG", + 1747: "TriTeq Lock and Security, LLC", + 1748: "DYNAKODE TECHNOLOGY PRIVATE LIMITED", + 1749: "Sensirion AG", + 1750: "JCT Healthcare Pty Ltd", + 1751: "FUBA Automotive Electronics GmbH", + 1752: "AW Company", + 1753: "Shanghai Mountain View Silicon Co.,Ltd.", + 1754: "Zliide Technologies ApS", + 1755: "Automatic Labs, Inc.", + 1756: "Industrial Network Controls, LLC", + 1757: "Intellithings Ltd.", + 1758: "Navcast, Inc.", + 1759: "HLI Solutions Inc.", + 1760: "Avaya Inc.", + 1761: "Milestone AV Technologies LLC", + 1762: "Alango Technologies Ltd", + 1763: "Spinlock Ltd", + 1764: "Aluna", + 1765: "OPTEX CO.,LTD.", + 1766: "NIHON DENGYO KOUSAKU", + 1767: "VELUX A/S", + 1768: "Almendo Technologies GmbH", + 1769: "Zmartfun Electronics, Inc.", + 1770: "SafeLine Sweden AB", + 1771: "Houston Radar LLC", + 1772: "Sigur", + 1773: "J Neades Ltd", + 1774: "Avantis Systems Limited", + 1775: "ALCARE Co., Ltd.", + 1776: "Chargy Technologies, SL", + 1777: "Shibutani Co., Ltd.", + 1778: "Trapper Data AB", + 1779: "Alfred International Inc.", + 1780: "Touch\u00e9 Technology Ltd", + 1781: "Vigil Technologies Inc.", + 1782: "Vitulo Plus BV", + 1783: "WILKA Schliesstechnik GmbH", + 1784: "BodyPlus Technology Co.,Ltd", + 1785: "happybrush GmbH", + 1786: "Enequi AB", + 1787: "Sartorius AG", + 1788: "Tom Communication Industrial Co.,Ltd.", + 1789: "ESS Embedded System Solutions Inc.", + 1790: "Mahr GmbH", + 1791: "Redpine Signals Inc", + 1792: "TraqFreq LLC", + 1793: "PAFERS TECH", + 1794: "Akciju sabiedriba \"SAF TEHNIKA\"", + 1795: "Beijing Jingdong Century Trading Co., Ltd.", + 1796: "JBX Designs Inc.", + 1797: "AB Electrolux", + 1798: "Wernher von Braun Center for ASdvanced Research", + 1799: "Essity Hygiene and Health Aktiebolag", + 1800: "Be Interactive Co., Ltd", + 1801: "Carewear Corp.", + 1802: "Huf H\u00fclsbeck & F\u00fcrst GmbH & Co. KG", + 1803: "Element Products, Inc.", + 1804: "Beijing Winner Microelectronics Co.,Ltd", + 1805: "SmartSnugg Pty Ltd", + 1806: "FiveCo Sarl", + 1807: "California Things Inc.", + 1808: "Audiodo AB", + 1809: "ABAX AS", + 1810: "Bull Group Company Limited", + 1811: "Respiri Limited", + 1812: "MindPeace Safety LLC", + 1813: "MBARC LABS Inc", + 1814: "Altonics", + 1815: "iQsquare BV", + 1816: "IDIBAIX enginneering", + 1817: "COREIOT PTY LTD", + 1818: "REVSMART WEARABLE HK CO LTD", + 1819: "Precor", + 1820: "F5 Sports, Inc", + 1821: "exoTIC Systems", + 1822: "DONGGUAN HELE ELECTRONICS CO., LTD", + 1823: "Dongguan Liesheng Electronic Co.Ltd", + 1824: "Oculeve, Inc.", + 1825: "Clover Network, Inc.", + 1826: "Xiamen Eholder Electronics Co.Ltd", + 1827: "Ford Motor Company", + 1828: "Guangzhou SuperSound Information Technology Co.,Ltd", + 1829: "Tedee Sp. z o.o.", + 1830: "PHC Corporation", + 1831: "STALKIT AS", + 1832: "Eli Lilly and Company", + 1833: "SwaraLink Technologies", + 1834: "JMR embedded systems GmbH", + 1835: "Bitkey Inc.", + 1836: "GWA Hygiene GmbH", + 1837: "Safera Oy", + 1838: "Open Platform Systems LLC", + 1839: "OnePlus Electronics (Shenzhen) Co., Ltd.", + 1840: "Wildlife Acoustics, Inc.", + 1841: "ABLIC Inc.", + 1842: "Dairy Tech, Inc.", + 1843: "Iguanavation, Inc.", + 1844: "DiUS Computing Pty Ltd", + 1845: "UpRight Technologies LTD", + 1846: "Luna XIO, Inc.", + 1847: "LLC Navitek", + 1848: "Glass Security Pte Ltd", + 1849: "Jiangsu Qinheng Co., Ltd.", + 1850: "Chandler Systems Inc.", + 1851: "Fantini Cosmi s.p.a.", + 1852: "Acubit ApS", + 1853: "Beijing Hao Heng Tian Tech Co., Ltd.", + 1854: "Bluepack S.R.L.", + 1855: "Beijing Unisoc Technologies Co., Ltd.", + 1856: "HITIQ LIMITED", + 1857: "MAC SRL", + 1858: "DML LLC", + 1859: "Sanofi", + 1860: "SOCOMEC", + 1861: "WIZNOVA, Inc.", + 1862: "Seitec Elektronik GmbH", + 1863: "OR Technologies Pty Ltd", + 1864: "GuangZhou KuGou Computer Technology Co.Ltd", + 1865: "DIAODIAO (Beijing) Technology Co., Ltd.", + 1866: "Illusory Studios LLC", + 1867: "Sarvavid Software Solutions LLP", + 1868: "iopool s.a.", + 1869: "Amtech Systems, LLC", + 1870: "EAGLE DETECTION SA", + 1871: "MEDIATECH S.R.L.", + 1872: "Hamilton Professional Services of Canada Incorporated", + 1873: "Changsha JEMO IC Design Co.,Ltd", + 1874: "Elatec GmbH", + 1875: "JLG Industries, Inc.", + 1876: "Michael Parkin", + 1877: "Brother Industries, Ltd", + 1878: "Lumens For Less, Inc", + 1879: "ELA Innovation", + 1880: "umanSense AB", + 1881: "Shanghai InGeek Cyber Security Co., Ltd.", + 1882: "HARMAN CO.,LTD.", + 1883: "Smart Sensor Devices AB", + 1884: "Antitronics Inc.", + 1885: "RHOMBUS SYSTEMS, INC.", + 1886: "Katerra Inc.", + 1887: "Remote Solution Co., LTD.", + 1888: "Vimar SpA", + 1889: "Mantis Tech LLC", + 1890: "TerOpta Ltd", + 1891: "PIKOLIN S.L.", + 1892: "WWZN Information Technology Company Limited", + 1893: "Voxx International", + 1894: "ART AND PROGRAM, INC.", + 1895: "NITTO DENKO ASIA TECHNICAL CENTRE PTE. LTD.", + 1896: "Peloton Interactive Inc.", + 1897: "Force Impact Technologies", + 1898: "Dmac Mobile Developments, LLC", + 1899: "Engineered Medical Technologies", + 1900: "Noodle Technology inc", + 1901: "Graesslin GmbH", + 1902: "WuQi technologies, Inc.", + 1903: "Successful Endeavours Pty Ltd", + 1904: "InnoCon Medical ApS", + 1905: "Corvex Connected Safety", + 1906: "Thirdwayv Inc.", + 1907: "Echoflex Solutions Inc.", + 1908: "C-MAX Asia Limited", + 1909: "4eBusiness GmbH", + 1910: "Cyber Transport Control GmbH", + 1911: "Cue", + 1912: "KOAMTAC INC.", + 1913: "Loopshore Oy", + 1914: "Niruha Systems Private Limited", + 1915: "AmaterZ, Inc.", + 1916: "radius co., ltd.", + 1917: "Sensority, s.r.o.", + 1918: "Sparkage Inc.", + 1919: "Glenview Software Corporation", + 1920: "Finch Technologies Ltd.", + 1921: "Qingping Technology (Beijing) Co., Ltd.", + 1922: "DeviceDrive AS", + 1923: "ESEMBER LIMITED LIABILITY COMPANY", + 1924: "audifon GmbH & Co. KG", + 1925: "O2 Micro, Inc.", + 1926: "HLP Controls Pty Limited", + 1927: "Pangaea Solution", + 1928: "BubblyNet, LLC", + 1929: "PCB Piezotronics, Inc.", + 1930: "The Wildflower Foundation", + 1931: "Optikam Tech Inc.", + 1932: "MINIBREW HOLDING B.V", + 1933: "Cybex GmbH", + 1934: "FUJIMIC NIIGATA, INC.", + 1935: "Hanna Instruments, Inc.", + 1936: "KOMPAN A/S", + 1937: "Scosche Industries, Inc.", + 1938: "Cricut, Inc.", + 1939: "AEV spol. s r.o.", + 1940: "The Coca-Cola Company", + 1941: "GASTEC CORPORATION", + 1942: "StarLeaf Ltd", + 1943: "Water-i.d. GmbH", + 1944: "HoloKit, Inc.", + 1945: "PlantChoir Inc.", + 1946: "GuangDong Oppo Mobile Telecommunications Corp., Ltd.", + 1947: "CST ELECTRONICS (PROPRIETARY) LIMITED", + 1948: "Sky UK Limited", + 1949: "Digibale Pty Ltd", + 1950: "Smartloxx GmbH", + 1951: "Pune Scientific LLP", + 1952: "Regent Beleuchtungskorper AG", + 1953: "Apollo Neuroscience, Inc.", + 1954: "Roku, Inc.", + 1955: "Comcast Cable", + 1956: "Xiamen Mage Information Technology Co., Ltd.", + 1957: "RAB Lighting, Inc.", + 1958: "Musen Connect, Inc.", + 1959: "Zume, Inc.", + 1960: "conbee GmbH", + 1961: "Bruel & Kjaer Sound & Vibration", + 1962: "The Kroger Co.", + 1963: "Granite River Solutions, Inc.", + 1964: "LoupeDeck Oy", + 1965: "New H3C Technologies Co.,Ltd", + 1966: "Aurea Solucoes Tecnologicas Ltda.", + 1967: "Hong Kong Bouffalo Lab Limited", + 1968: "GV Concepts Inc.", + 1969: "Thomas Dynamics, LLC", + 1970: "Moeco IOT Inc.", + 1971: "2N TELEKOMUNIKACE a.s.", + 1972: "Hormann KG Antriebstechnik", + 1973: "CRONO CHIP, S.L.", + 1974: "Soundbrenner Limited", + 1975: "ETABLISSEMENTS GEORGES RENAULT", + 1976: "iSwip", + 1977: "Epona Biotec Limited", + 1978: "Battery-Biz Inc.", + 1979: "EPIC S.R.L.", + 1980: "KD CIRCUITS LLC", + 1981: "Genedrive Diagnostics Ltd", + 1982: "Axentia Technologies AB", + 1983: "REGULA Ltd.", + 1984: "Biral AG", + 1985: "A.W. Chesterton Company", + 1986: "Radinn AB", + 1987: "CIMTechniques, Inc.", + 1988: "Johnson Health Tech NA", + 1989: "June Life, Inc.", + 1990: "Bluenetics GmbH", + 1991: "iaconicDesign Inc.", + 1992: "WRLDS Creations AB", + 1993: "Skullcandy, Inc.", + 1994: "Modul-System HH AB", + 1995: "West Pharmaceutical Services, Inc.", + 1996: "Barnacle Systems Inc.", + 1997: "Smart Wave Technologies Canada Inc", + 1998: "Shanghai Top-Chip Microelectronics Tech. Co., LTD", + 1999: "NeoSensory, Inc.", + 2000: "Hangzhou Tuya Information Technology Co., Ltd", + 2001: "Shanghai Panchip Microelectronics Co., Ltd", + 2002: "React Accessibility Limited", + 2003: "LIVNEX Co.,Ltd.", + 2004: "Kano Computing Limited", + 2005: "hoots classic GmbH", + 2006: "ecobee Inc.", + 2007: "Nanjing Qinheng Microelectronics Co., Ltd", + 2008: "SOLUTIONS AMBRA INC.", + 2009: "Micro-Design, Inc.", + 2010: "STARLITE Co., Ltd.", + 2011: "Remedee Labs", + 2012: "ThingOS GmbH & Co KG", + 2013: "Linear Circuits", + 2014: "Unlimited Engineering SL", + 2015: "Snap-on Incorporated", + 2016: "Edifier International Limited", + 2017: "Lucie Labs", + 2018: "Alfred Kaercher SE & Co. KG", + 2019: "Airoha Technology Corp.", + 2020: "Geeksme S.L.", + 2021: "Minut, Inc.", + 2022: "Waybeyond Limited", + 2023: "Komfort IQ, Inc.", + 2024: "Packetcraft, Inc.", + 2025: "H\u00e4fele GmbH & Co KG", + 2026: "ShapeLog, Inc.", + 2027: "NOVABASE S.R.L.", + 2028: "Frecce LLC", + 2029: "Joule IQ, INC.", + 2030: "KidzTek LLC", + 2031: "Aktiebolaget Sandvik Coromant", + 2032: "e-moola.com Pty Ltd", + 2033: "Zimi Innovations Pty Ltd", + 2034: "SERENE GROUP, INC", + 2035: "DIGISINE ENERGYTECH CO. LTD.", + 2036: "MEDIRLAB Orvosbiologiai Fejleszto Korlatolt Felelossegu Tarsasag", + 2037: "Byton North America Corporation", + 2038: "Shenzhen TonliScience and Technology Development Co.,Ltd", + 2039: "Cesar Systems Ltd.", + 2040: "quip NYC Inc.", + 2041: "Direct Communication Solutions, Inc.", + 2042: "Klipsch Group, Inc.", + 2043: "Access Co., Ltd", + 2044: "Renault SA", + 2045: "JSK CO., LTD.", + 2046: "BIROTA", + 2047: "maxon motor ltd.", + 2048: "Optek", + 2049: "CRONUS ELECTRONICS LTD", + 2050: "NantSound, Inc.", + 2051: "Domintell s.a.", + 2052: "Andon Health Co.,Ltd", + 2053: "Urbanminded Ltd", + 2054: "TYRI Sweden AB", + 2055: "ECD Electronic Components GmbH Dresden", + 2056: "SISTEMAS KERN, SOCIEDAD AN\u00d3MINA", + 2057: "Trulli Audio", + 2058: "Altaneos", + 2059: "Nanoleaf Canada Limited", + 2060: "Ingy B.V.", + 2061: "Azbil Co.", + 2062: "TATTCOM LLC", + 2063: "Paradox Engineering SA", + 2064: "LECO Corporation", + 2065: "Becker Antriebe GmbH", + 2066: "Mstream Technologies., Inc.", + 2067: "Flextronics International USA Inc.", + 2068: "Ossur hf.", + 2069: "SKC Inc", + 2070: "SPICA SYSTEMS LLC", + 2071: "Wangs Alliance Corporation", + 2072: "tatwah SA", + 2073: "Hunter Douglas Inc", + 2074: "Shenzhen Conex", + 2075: "DIM3", + 2076: "Bobrick Washroom Equipment, Inc.", + 2077: "Potrykus Holdings and Development LLC", + 2078: "iNFORM Technology GmbH", + 2079: "eSenseLab LTD", + 2080: "Brilliant Home Technology, Inc.", + 2081: "INOVA Geophysical, Inc.", + 2082: "adafruit industries", + 2083: "Nexite Ltd", + 2084: "8Power Limited", + 2085: "CME PTE. LTD.", + 2086: "Hyundai Motor Company", + 2087: "Kickmaker", + 2088: "Shanghai Suisheng Information Technology Co., Ltd.", + 2089: "HEXAGON METROLOGY DIVISION ROMER", + 2090: "Mitutoyo Corporation", + 2091: "shenzhen fitcare electronics Co.,Ltd", + 2092: "INGICS TECHNOLOGY CO., LTD.", + 2093: "INCUS PERFORMANCE LTD.", + 2094: "ABB S.p.A.", + 2095: "Blippit AB", + 2096: "Core Health and Fitness LLC", + 2097: "Foxble, LLC", + 2098: "Intermotive,Inc.", + 2099: "Conneqtech B.V.", + 2100: "RIKEN KEIKI CO., LTD.,", + 2101: "Canopy Growth Corporation", + 2102: "Bitwards Oy", + 2103: "vivo Mobile Communication Co., Ltd.", + 2104: "Etymotic Research, Inc.", + 2105: "A puissance 3", + 2106: "BPW Bergische Achsen Kommanditgesellschaft", + 2107: "Piaggio Fast Forward", + 2108: "BeerTech LTD", + 2109: "Tokenize, Inc.", + 2110: "Zorachka LTD", + 2111: "D-Link Corp.", + 2112: "Down Range Systems LLC", + 2113: "General Luminaire (Shanghai) Co., Ltd.", + 2114: "Tangshan HongJia electronic technology co., LTD.", + 2115: "FRAGRANCE DELIVERY TECHNOLOGIES LTD", + 2116: "Pepperl + Fuchs GmbH", + 2117: "Dometic Corporation", + 2118: "USound GmbH", + 2119: "DNANUDGE LIMITED", + 2120: "JUJU JOINTS CANADA CORP.", + 2121: "Dopple Technologies B.V.", + 2122: "ARCOM", + 2123: "Biotechware SRL", + 2124: "ORSO Inc.", + 2125: "SafePort", + 2126: "Carol Cole Company", + 2127: "Embedded Fitness B.V.", + 2128: "Yealink (Xiamen) Network Technology Co.,LTD", + 2129: "Subeca, Inc.", + 2130: "Cognosos, Inc.", + 2131: "Pektron Group Limited", + 2132: "Tap Sound System", + 2133: "Helios Sports, Inc.", + 2134: "Canopy Growth Corporation", + 2135: "Parsyl Inc", + 2136: "SOUNDBOKS", + 2137: "BlueUp", + 2138: "DAKATECH", + 2139: "Nisshinbo Micro Devices Inc.", + 2140: "ACOS CO.,LTD.", + 2141: "Guilin Zhishen Information Technology Co.,Ltd.", + 2142: "Krog Systems LLC", + 2143: "COMPEGPS TEAM,SOCIEDAD LIMITADA", + 2144: "Alflex Products B.V.", + 2145: "SmartSensor Labs Ltd", + 2146: "SmartDrive", + 2147: "Yo-tronics Technology Co., Ltd.", + 2148: "Rafaelmicro", + 2149: "Emergency Lighting Products Limited", + 2150: "LAONZ Co.,Ltd", + 2151: "Western Digital Techologies, Inc.", + 2152: "WIOsense GmbH & Co. KG", + 2153: "EVVA Sicherheitstechnologie GmbH", + 2154: "Odic Incorporated", + 2155: "Pacific Track, LLC", + 2156: "Revvo Technologies, Inc.", + 2157: "Biometrika d.o.o.", + 2158: "Vorwerk Elektrowerke GmbH & Co. KG", + 2159: "Trackunit A/S", + 2160: "Wyze Labs, Inc", + 2161: "Dension Elektronikai Kft.", + 2162: "11 Health & Technologies Limited", + 2163: "Innophase Incorporated", + 2164: "Treegreen Limited", + 2165: "Berner International LLC", + 2166: "SmartResQ ApS", + 2167: "Tome, Inc.", + 2168: "The Chamberlain Group, Inc.", + 2169: "MIZUNO Corporation", + 2170: "ZRF, LLC", + 2171: "BYSTAMP", + 2172: "Crosscan GmbH", + 2173: "Konftel AB", + 2174: "1bar.net Limited", + 2175: "Phillips Connect Technologies LLC", + 2176: "imagiLabs AB", + 2177: "Optalert", + 2178: "PSYONIC, Inc.", + 2179: "Wintersteiger AG", + 2180: "Controlid Industria, Comercio de Hardware e Servicos de Tecnologia Ltda", + 2181: "LEVOLOR INC", + 2182: "Movella Technologies B.V.", + 2183: "Hydro-Gear Limited Partnership", + 2184: "EnPointe Fencing Pty Ltd", + 2185: "XANTHIO", + 2186: "sclak s.r.l.", + 2187: "Tricorder Arraay Technologies LLC", + 2188: "GB Solution co.,Ltd", + 2189: "Soliton Systems K.K.", + 2190: "GIGA-TMS INC", + 2191: "Tait International Limited", + 2192: "NICHIEI INTEC CO., LTD.", + 2193: "SmartWireless GmbH & Co. KG", + 2194: "Ingenieurbuero Birnfeld UG (haftungsbeschraenkt)", + 2195: "Maytronics Ltd", + 2196: "EPIFIT", + 2197: "Gimer medical", + 2198: "Nokian Renkaat Oyj", + 2199: "Current Lighting Solutions LLC", + 2200: "Sensibo, Inc.", + 2201: "SFS unimarket AG", + 2202: "Private limited company \"Teltonika\"", + 2203: "Saucon Technologies", + 2204: "Embedded Devices Co. Company", + 2205: "J-J.A.D.E. Enterprise LLC", + 2206: "i-SENS, inc.", + 2207: "Witschi Electronic Ltd", + 2208: "Aclara Technologies LLC", + 2209: "EXEO TECH CORPORATION", + 2210: "Epic Systems Co., Ltd.", + 2211: "Hoffmann SE", + 2212: "Realme Chongqing Mobile Telecommunications Corp., Ltd.", + 2213: "UMEHEAL Ltd", + 2214: "Intelligenceworks Inc.", + 2215: "TGR 1.618 Limited", + 2216: "Shanghai Kfcube Inc", + 2217: "Fraunhofer IIS", + 2218: "SZ DJI TECHNOLOGY CO.,LTD", + 2219: "Coburn Technology, LLC", + 2220: "Topre Corporation", + 2221: "Kayamatics Limited", + 2222: "Moticon ReGo AG", + 2223: "Polidea Sp. z o.o.", + 2224: "Trivedi Advanced Technologies LLC", + 2225: "CORE|vision BV", + 2226: "PF SCHWEISSTECHNOLOGIE GMBH", + 2227: "IONIQ Skincare GmbH & Co. KG", + 2228: "Sengled Co., Ltd.", + 2229: "TransferFi", + 2230: "Boehringer Ingelheim Vetmedica GmbH", + 2231: "ABB Inc", + 2232: "Check Technology Solutions LLC", + 2233: "U-Shin Ltd.", + 2234: "HYPER ICE, INC.", + 2235: "Tokai-rika co.,ltd.", + 2236: "Prevayl Limited", + 2237: "bf1systems limited", + 2238: "ubisys technologies GmbH", + 2239: "SIRC Co., Ltd.", + 2240: "Accent Advanced Systems SLU", + 2241: "Rayden.Earth LTD", + 2242: "Lindinvent AB", + 2243: "CHIPOLO d.o.o.", + 2244: "CellAssist, LLC", + 2245: "J. Wagner GmbH", + 2246: "Integra Optics Inc", + 2247: "Monadnock Systems Ltd.", + 2248: "Liteboxer Technologies Inc.", + 2249: "Noventa AG", + 2250: "Nubia Technology Co.,Ltd.", + 2251: "JT INNOVATIONS LIMITED", + 2252: "TGM TECHNOLOGY CO., LTD.", + 2253: "ifly", + 2254: "ZIMI CORPORATION", + 2255: "betternotstealmybike UG (with limited liability)", + 2256: "ESTOM Infotech Kft.", + 2257: "Sensovium Inc.", + 2258: "Virscient Limited", + 2259: "Novel Bits, LLC", + 2260: "ADATA Technology Co., LTD.", + 2261: "KEYes", + 2262: "Nome Oy", + 2263: "Inovonics Corp", + 2264: "WARES", + 2265: "Pointr Labs Limited", + 2266: "Miridia Technology Incorporated", + 2267: "Tertium Technology", + 2268: "SHENZHEN AUKEY E BUSINESS CO., LTD", + 2269: "code-Q", + 2270: "TE Connectivity Corporation", + 2271: "IRIS OHYAMA CO.,LTD.", + 2272: "Philia Technology", + 2273: "KOZO KEIKAKU ENGINEERING Inc.", + 2274: "Shenzhen Simo Technology co. LTD", + 2275: "Republic Wireless, Inc.", + 2276: "Rashidov ltd", + 2277: "Crowd Connected Ltd", + 2278: "Eneso Tecnologia de Adaptacion S.L.", + 2279: "Barrot Technology Co.,Ltd.", + 2280: "Naonext", + 2281: "Taiwan Intelligent Home Corp.", + 2282: "COWBELL ENGINEERING CO.,LTD.", + 2283: "Beijing Big Moment Technology Co., Ltd.", + 2284: "Denso Corporation", + 2285: "IMI Hydronic Engineering International SA", + 2286: "Askey Computer Corp.", + 2287: "Cumulus Digital Systems, Inc", + 2288: "Joovv, Inc.", + 2289: "The L.S. Starrett Company", + 2290: "Microoled", + 2291: "PSP - Pauli Services & Products GmbH", + 2292: "Kodimo Technologies Company Limited", + 2293: "Tymtix Technologies Private Limited", + 2294: "Dermal Photonics Corporation", + 2295: "MTD Products Inc & Affiliates", + 2296: "instagrid GmbH", + 2297: "Spacelabs Medical Inc.", + 2298: "Troo Corporation", + 2299: "Darkglass Electronics Oy", + 2300: "Hill-Rom", + 2301: "BioIntelliSense, Inc.", + 2302: "Ketronixs Sdn Bhd", + 2303: "Plastimold Products, Inc", + 2304: "Beijing Zizai Technology Co., LTD.", + 2305: "Lucimed", + 2306: "TSC Auto-ID Technology Co., Ltd.", + 2307: "DATAMARS, Inc.", + 2308: "SUNCORPORATION", + 2309: "Yandex Services AG", + 2310: "Scope Logistical Solutions", + 2311: "User Hello, LLC", + 2312: "Pinpoint Innovations Limited", + 2313: "70mai Co.,Ltd.", + 2314: "Zhuhai Hoksi Technology CO.,LTD", + 2315: "EMBR labs, INC", + 2316: "Radiawave Technologies Co.,Ltd.", + 2317: "IOT Invent GmbH", + 2318: "OPTIMUSIOT TECH LLP", + 2319: "VC Inc.", + 2320: "ASR Microelectronics (Shanghai) Co., Ltd.", + 2321: "Douglas Lighting Controls Inc.", + 2322: "Nerbio Medical Software Platforms Inc", + 2323: "Braveheart Wireless, Inc.", + 2324: "INEO-SENSE", + 2325: "Honda Motor Co., Ltd.", + 2326: "Ambient Sensors LLC", + 2327: "ASR Microelectronics(ShenZhen)Co., Ltd.", + 2328: "Technosphere Labs Pvt. Ltd.", + 2329: "NO SMD LIMITED", + 2330: "Albertronic BV", + 2331: "Luminostics, Inc.", + 2332: "Oblamatik AG", + 2333: "Innokind, Inc.", + 2334: "Melbot Studios, Sociedad Limitada", + 2335: "Myzee Technology", + 2336: "Omnisense Limited", + 2337: "KAHA PTE. LTD.", + 2338: "Shanghai MXCHIP Information Technology Co., Ltd.", + 2339: "JSB TECH PTE LTD", + 2340: "Fundacion Tecnalia Research and Innovation", + 2341: "Yukai Engineering Inc.", + 2342: "Gooligum Technologies Pty Ltd", + 2343: "ROOQ GmbH", + 2344: "AiRISTA", + 2345: "Qingdao Haier Technology Co., Ltd.", + 2346: "Sappl Verwaltungs- und Betriebs GmbH", + 2347: "TekHome", + 2348: "PCI Private Limited", + 2349: "Leggett & Platt, Incorporated", + 2350: "PS GmbH", + 2351: "C.O.B.O. SpA", + 2352: "James Walker RotaBolt Limited", + 2353: "BREATHINGS Co., Ltd.", + 2354: "BarVision, LLC", + 2355: "SRAM", + 2356: "KiteSpring Inc.", + 2357: "Reconnect, Inc.", + 2358: "Elekon AG", + 2359: "RealThingks GmbH", + 2360: "Henway Technologies, LTD.", + 2361: "ASTEM Co.,Ltd.", + 2362: "LinkedSemi Microelectronics (Xiamen) Co., Ltd", + 2363: "ENSESO LLC", + 2364: "Xenoma Inc.", + 2365: "Adolf Wuerth GmbH & Co KG", + 2366: "Catalyft Labs, Inc.", + 2367: "JEPICO Corporation", + 2368: "Hero Workout GmbH", + 2369: "Rivian Automotive, LLC", + 2370: "TRANSSION HOLDINGS LIMITED", + 2371: "Reserved", + 2372: "Agitron d.o.o.", + 2373: "Globe (Jiangsu) Co., Ltd", + 2374: "AMC International Alfa Metalcraft Corporation AG", + 2375: "First Light Technologies Ltd.", + 2376: "Wearable Link Limited", + 2377: "Metronom Health Europe", + 2378: "Zwift, Inc.", + 2379: "Kindeva Drug Delivery L.P.", + 2380: "GimmiSys GmbH", + 2381: "tkLABS INC.", + 2382: "PassiveBolt, Inc.", + 2383: "Limited Liability Company \"Mikrotikls\"", + 2384: "Capetech", + 2385: "PPRS", + 2386: "Apptricity Corporation", + 2387: "LogiLube, LLC", + 2388: "Julbo", + 2389: "Breville Group", + 2390: "Kerlink", + 2391: "Ohsung Electronics", + 2392: "ZTE Corporation", + 2393: "HerdDogg, Inc", + 2394: "Selekt Bilgisayar, lletisim Urunleri lnsaat Sanayi ve Ticaret Limited Sirketi", + 2395: "Lismore Instruments Limited", + 2396: "LogiLube, LLC", + 2397: "Electronic Theatre Controls", + 2398: "BioEchoNet inc.", + 2399: "NUANCE HEARING LTD", + 2400: "Sena Technologies Inc.", + 2401: "Linkura AB", + 2402: "GL Solutions K.K.", + 2403: "Moonbird BV", + 2404: "Countrymate Technology Limited", + 2405: "Asahi Kasei Corporation", + 2406: "PointGuard, LLC", + 2407: "Neo Materials and Consulting Inc.", + 2408: "Actev Motors, Inc.", + 2409: "Woan Technology (Shenzhen) Co., Ltd.", + 2410: "dricos, Inc.", + 2411: "Guide ID B.V.", + 2412: "9374-7319 Quebec inc", + 2413: "Gunwerks, LLC", + 2414: "Band Industries, inc.", + 2415: "Lund Motion Products, Inc.", + 2416: "IBA Dosimetry GmbH", + 2417: "GA", + 2418: "Closed Joint Stock Company \"Zavod Flometr\" (\"Zavod Flometr\" CJSC)", + 2419: "Popit Oy", + 2420: "ABEYE", + 2421: "BlueIOT(Beijing) Technology Co.,Ltd", + 2422: "Fauna Audio GmbH", + 2423: "TOYOTA motor corporation", + 2424: "ZifferEins GmbH & Co. KG", + 2425: "BIOTRONIK SE & Co. KG", + 2426: "CORE CORPORATION", + 2427: "CTEK Sweden AB", + 2428: "Thorley Industries, LLC", + 2429: "CLB B.V.", + 2430: "SonicSensory Inc", + 2431: "ISEMAR S.R.L.", + 2432: "DEKRA TESTING AND CERTIFICATION, S.A.U.", + 2433: "Bernard Krone Holding SE & Co.KG", + 2434: "ELPRO-BUCHS AG", + 2435: "Feedback Sports LLC", + 2436: "TeraTron GmbH", + 2437: "Lumos Health Inc.", + 2438: "Cello Hill, LLC", + 2439: "TSE BRAKES, INC.", + 2440: "BHM-Tech Produktionsgesellschaft m.b.H", + 2441: "WIKA Alexander Wiegand SE & Co.KG", + 2442: "Biovigil", + 2443: "Mequonic Engineering, S.L.", + 2444: "bGrid B.V.", + 2445: "C3-WIRELESS, LLC", + 2446: "ADVEEZ", + 2447: "Aktiebolaget Regin", + 2448: "Anton Paar GmbH", + 2449: "Telenor ASA", + 2450: "Big Kaiser Precision Tooling Ltd", + 2451: "Absolute Audio Labs B.V.", + 2452: "VT42 Pty Ltd", + 2453: "Bronkhorst High-Tech B.V.", + 2454: "C. & E. Fein GmbH", + 2455: "NextMind", + 2456: "Pixie Dust Technologies, Inc.", + 2457: "eTactica ehf", + 2458: "New Audio LLC", + 2459: "Sendum Wireless Corporation", + 2460: "deister electronic GmbH", + 2461: "YKK AP Inc.", + 2462: "Step One Limited", + 2463: "Koya Medical, Inc.", + 2464: "Proof Diagnostics, Inc.", + 2465: "VOS Systems, LLC", + 2466: "ENGAGENOW DATA SCIENCES PRIVATE LIMITED", + 2467: "ARDUINO SA", + 2468: "KUMHO ELECTRICS, INC", + 2469: "Security Enhancement Systems, LLC", + 2470: "BEIJING ELECTRIC VEHICLE CO.,LTD", + 2471: "Paybuddy ApS", + 2472: "KHN Solutions LLC", + 2473: "Nippon Ceramic Co.,Ltd.", + 2474: "PHOTODYNAMIC INCORPORATED", + 2475: "DashLogic, Inc.", + 2476: "Ambiq", + 2477: "Narhwall Inc.", + 2478: "Pozyx NV", + 2479: "ifLink Open Community", + 2480: "Deublin Company, LLC", + 2481: "BLINQY", + 2482: "DYPHI", + 2483: "BlueX Microelectronics Corp Ltd.", + 2484: "PentaLock Aps.", + 2485: "AUTEC Gesellschaft fuer Automationstechnik mbH", + 2486: "Pegasus Technologies, Inc.", + 2487: "Bout Labs, LLC", + 2488: "PlayerData Limited", + 2489: "SAVOY ELECTRONIC LIGHTING", + 2490: "Elimo Engineering Ltd", + 2491: "SkyStream Corporation", + 2492: "Aerosens LLC", + 2493: "Centre Suisse d'Electronique et de Microtechnique SA", + 2494: "Vessel Ltd.", + 2495: "Span.IO, Inc.", + 2496: "AnotherBrain inc.", + 2497: "Rosewill", + 2498: "Universal Audio, Inc.", + 2499: "JAPAN TOBACCO INC.", + 2500: "UVISIO", + 2501: "HungYi Microelectronics Co.,Ltd.", + 2502: "Honor Device Co., Ltd.", + 2503: "Combustion, LLC", + 2504: "XUNTONG", + 2505: "CrowdGlow Ltd", + 2506: "Mobitrace", + 2507: "Hx Engineering, LLC", + 2508: "Senso4s d.o.o.", + 2509: "Blyott", + 2510: "Julius Blum GmbH", + 2511: "BlueStreak IoT, LLC", + 2512: "Chess Wise B.V.", + 2513: "ABLEPAY TECHNOLOGIES AS", + 2514: "Temperature Sensitive Solutions Systems Sweden AB", + 2515: "HeartHero, inc.", + 2516: "ORBIS Inc.", + 2517: "GEAR RADIO ELECTRONICS CORP.", + 2518: "EAR TEKNIK ISITME VE ODIOMETRI CIHAZLARI SANAYI VE TICARET ANONIM SIRKETI", + 2519: "Coyotta", + 2520: "Synergy Tecnologia em Sistemas Ltda", + 2521: "VivoSensMedical GmbH", + 2522: "Nagravision SA", + 2523: "Bionic Avionics Inc.", + 2524: "AON2 Ltd.", + 2525: "Innoware Development AB", + 2526: "JLD Technology Solutions, LLC", + 2527: "Magnus Technology Sdn Bhd", + 2528: "Preddio Technologies Inc.", + 2529: "Tag-N-Trac Inc", + 2530: "Wuhan Linptech Co.,Ltd.", + 2531: "Friday Home Aps", + 2532: "CPS AS", + 2533: "Mobilogix", + 2534: "Masonite Corporation", + 2535: "Kabushikigaisha HANERON", + 2536: "Melange Systems Pvt. Ltd.", + 2537: "LumenRadio AB", + 2538: "Athlos Oy", + 2539: "KEAN ELECTRONICS PTY LTD", + 2540: "Yukon advanced optics worldwide, UAB", + 2541: "Sibel Inc.", + 2542: "OJMAR SA", + 2543: "Steinel Solutions AG", + 2544: "WatchGas B.V.", + 2545: "OM Digital Solutions Corporation", + 2546: "Audeara Pty Ltd", + 2547: "Beijing Zero Zero Infinity Technology Co.,Ltd.", + 2548: "Spectrum Technologies, Inc.", + 2549: "OKI Electric Industry Co., Ltd", + 2550: "Mobile Action Technology Inc.", + 2551: "SENSATEC Co., Ltd.", + 2552: "R.O. S.R.L.", + 2553: "Hangzhou Yaguan Technology Co. LTD", + 2554: "Listen Technologies Corporation", + 2555: "TOITU CO., LTD.", + 2556: "Confidex", + 2557: "Keep Technologies, Inc.", + 2558: "Lichtvision Engineering GmbH", + 2559: "AIRSTAR", + 2560: "Ampler Bikes OU", + 2561: "Cleveron AS", + 2562: "Ayxon-Dynamics GmbH", + 2563: "donutrobotics Co., Ltd.", + 2564: "Flosonics Medical", + 2565: "Southwire Company, LLC", + 2566: "Shanghai wuqi microelectronics Co.,Ltd", + 2567: "Reflow Pty Ltd", + 2568: "Oras Oy", + 2569: "ECCT", + 2570: "Volan Technology Inc.", + 2571: "SIANA Systems", + 2572: "Shanghai Yidian Intelligent Technology Co., Ltd.", + 2573: "Blue Peacock GmbH", + 2574: "Roland Corporation", + 2575: "LIXIL Corporation", + 2576: "SUBARU Corporation", + 2577: "Sensolus", + 2578: "Dyson Technology Limited", + 2579: "Tec4med LifeScience GmbH", + 2580: "CROXEL, INC.", + 2581: "Syng Inc", + 2582: "RIDE VISION LTD", + 2583: "Plume Design Inc", + 2584: "Cambridge Animal Technologies Ltd", + 2585: "Maxell, Ltd.", + 2586: "Link Labs, Inc.", + 2587: "Embrava Pty Ltd", + 2588: "INPEAK S.C.", + 2589: "API-K", + 2590: "CombiQ AB", + 2591: "DeVilbiss Healthcare LLC", + 2592: "Jiangxi Innotech Technology Co., Ltd", + 2593: "Apollogic Sp. z o.o.", + 2594: "DAIICHIKOSHO CO., LTD.", + 2595: "BIXOLON CO.,LTD", + 2596: "Atmosic Technologies, Inc.", + 2597: "Eran Financial Services LLC", + 2598: "Louis Vuitton", + 2599: "AYU DEVICES PRIVATE LIMITED", + 2600: "NanoFlex Power Corporation", + 2601: "Worthcloud Technology Co.,Ltd", + 2602: "Yamaha Corporation", + 2603: "PaceBait IVS", + 2604: "Shenzhen H&T Intelligent Control Co., Ltd", + 2605: "Shenzhen Feasycom Technology Co., Ltd.", + 2606: "Zuma Array Limited", + 2607: "Instamic, Inc.", + 2608: "Air-Weigh", + 2609: "Nevro Corp.", + 2610: "Pinnacle Technology, Inc.", + 2611: "WMF AG", + 2612: "Luxer Corporation", + 2613: "safectory GmbH", + 2614: "NGK SPARK PLUG CO., LTD.", + 2615: "2587702 Ontario Inc.", + 2616: "Bouffalo Lab (Nanjing)., Ltd.", + 2617: "BLUETICKETING SRL", + 2618: "Incotex Co. Ltd.", + 2619: "Galileo Technology Limited", + 2620: "Siteco GmbH", + 2621: "DELABIE", + 2622: "Hefei Yunlian Semiconductor Co., Ltd", + 2623: "Shenzhen Yopeak Optoelectronics Technology Co., Ltd.", + 2624: "GEWISS S.p.A.", + 2625: "OPEX Corporation", + 2626: "Motionalysis, Inc.", + 2627: "Busch Systems International Inc.", + 2628: "Novidan, Inc.", + 2629: "3SI Security Systems, Inc", + 2630: "Beijing HC-Infinite Technology Limited", + 2631: "The Wand Company Ltd", + 2632: "JRC Mobility Inc.", + 2633: "Venture Research Inc.", + 2634: "Map Large, Inc.", + 2635: "MistyWest Energy and Transport Ltd.", + 2636: "SiFli Technologies (shanghai) Inc.", + 2637: "Lockn Technologies Private Limited", + 2638: "Toytec Corporation", + 2639: "VANMOOF Global Holding B.V.", + 2640: "Nextscape Inc.", + 2641: "CSIRO", + 2642: "Follow Sense Europe B.V.", + 2643: "KKM COMPANY LIMITED", + 2644: "SQL Technologies Corp.", + 2645: "Inugo Systems Limited", + 2646: "ambie", + 2647: "Meizhou Guo Wei Electronics Co., Ltd", + 2648: "Indigo Diabetes", + 2649: "TourBuilt, LLC", + 2650: "Sontheim Industrie Elektronik GmbH", + 2651: "LEGIC Identsystems AG", + 2652: "Innovative Design Labs Inc.", + 2653: "MG Energy Systems B.V.", + 2654: "LaceClips llc", + 2655: "stryker", + 2656: "DATANG SEMICONDUCTOR TECHNOLOGY CO.,LTD", + 2657: "Smart Parks B.V.", + 2658: "MOKO TECHNOLOGY Ltd", + 2659: "Gremsy JSC", + 2660: "Geopal system A/S", + 2661: "Lytx, INC.", + 2662: "JUSTMORPH PTE. LTD.", + 2663: "Beijing SuperHexa Century Technology CO. Ltd", + 2664: "Focus Ingenieria SRL", + 2665: "HAPPIEST BABY, INC.", + 2666: "Scribble Design Inc.", + 2667: "Olympic Ophthalmics, Inc.", + 2668: "Pokkels", + 2669: "KUUKANJYOKIN Co.,Ltd.", + 2670: "Pac Sane Limited", + 2671: "Warner Bros.", + 2672: "Ooma", + 2673: "Senquip Pty Ltd", + 2674: "Jumo GmbH & Co. KG", + 2675: "Innohome Oy", + 2676: "MICROSON S.A.", + 2677: "Delta Cycle Corporation", + 2678: "Synaptics Incorporated", + 2679: "AXTRO PTE. LTD.", + 2680: "Shenzhen Sunricher Technology Limited", + 2681: "Webasto SE", + 2682: "Emlid Limited", + 2683: "UniqAir Oy", + 2684: "WAFERLOCK", + 2685: "Freedman Electronics Pty Ltd", + 2686: "KEBA Handover Automation GmbH", + 2687: "Intuity Medical", + 2688: "Cleer Limited", + 2689: "Universal Biosensors Pty Ltd", + 2690: "Corsair", + 2691: "Rivata, Inc.", + 2692: "Greennote Inc,", + 2693: "Snowball Technology Co., Ltd.", + 2694: "ALIZENT International", + 2695: "Shanghai Smart System Technology Co., Ltd", + 2696: "PSA Peugeot Citroen", + 2697: "SES-Imagotag", + 2698: "HAINBUCH GMBH SPANNENDE TECHNIK", + 2699: "SANlight GmbH", + 2700: "DelpSys, s.r.o.", + 2701: "JCM TECHNOLOGIES S.A.", + 2702: "Perfect Company", + 2703: "TOTO LTD.", + 2704: "Shenzhen Grandsun Electronic Co.,Ltd.", + 2705: "Monarch International Inc.", + 2706: "Carestream Dental LLC", + 2707: "GiPStech S.r.l.", + 2708: "OOBIK Inc.", + 2709: "Pamex Inc.", + 2710: "Lightricity Ltd", + 2711: "SensTek", + 2712: "Foil, Inc.", + 2713: "Shanghai high-flying electronics technology Co.,Ltd", + 2714: "TEMKIN ASSOCIATES, LLC", + 2715: "Eello LLC", + 2716: "Xi'an Fengyu Information Technology Co., Ltd.", + 2717: "Canon Finetech Nisca Inc.", + 2718: "LifePlus, Inc.", + 2719: "ista International GmbH", + 2720: "Loy Tec electronics GmbH", + 2721: "LINCOGN TECHNOLOGY CO. LIMITED", + 2722: "Care Bloom, LLC", + 2723: "DIC Corporation", + 2724: "FAZEPRO LLC", + 2725: "Shenzhen Uascent Technology Co., Ltd", + 2726: "Realityworks, inc.", + 2727: "Urbanista AB", + 2728: "Zencontrol Pty Ltd", + 2729: "Mrinq Technologies LLC", + 2730: "Computime International Ltd", + 2731: "Anhui Listenai Co", + 2732: "OSM HK Limited", + 2733: "Adevo Consulting AB", + 2734: "PS Engineering, Inc.", + 2735: "AIAIAI ApS", + 2736: "Visiontronic s.r.o.", + 2737: "InVue Security Products Inc", + 2738: "TouchTronics, Inc.", + 2739: "INNER RANGE PTY. LTD.", + 2740: "Ellenby Technologies, Inc.", + 2741: "Elstat Electronics Ltd.", + 2742: "Xenter, Inc.", + 2743: "LogTag North America Inc.", + 2744: "Sens.ai Incorporated", + 2745: "STL", + 2746: "Open Bionics Ltd.", + 2747: "R-DAS, s.r.o.", + 2748: "KCCS Mobile Engineering Co., Ltd.", + 2749: "Inventas AS", + 2750: "Robkoo Information & Technologies Co., Ltd.", + 2751: "PAUL HARTMANN AG", + 2752: "Omni-ID USA, INC.", + 2753: "Shenzhen Jingxun Technology Co., Ltd.", + 2754: "RealMega Microelectronics technology (Shanghai) Co. Ltd.", + 2755: "Kenzen, Inc.", + 2756: "CODIUM", + 2757: "Flexoptix GmbH", + 2758: "Barnes Group Inc.", + 2759: "Chengdu Aich Technology Co.,Ltd", + 2760: "Keepin Co., Ltd.", + 2761: "Swedlock AB", + 2762: "Shenzhen CoolKit Technology Co., Ltd", + 2763: "ise Individuelle Software und Elektronik GmbH", + 2764: "Nuvoton", + 2765: "Visuallex Sport International Limited", + 2766: "KOBATA GAUGE MFG. CO., LTD.", + 2767: "CACI Technologies", + 2768: "Nordic Strong ApS", + 2769: "EAGLE KINGDOM TECHNOLOGIES LIMITED", + 2770: "Lautsprecher Teufel GmbH", + 2771: "SSV Software Systems GmbH", + 2772: "Zhuhai Pantum Electronisc Co., Ltd", + 2773: "Streamit B.V.", + 2774: "nymea GmbH", + 2775: "AL-KO Geraete GmbH", + 2776: "Franz Kaldewei GmbH&Co KG", + 2777: "Shenzhen Aimore. Co.,Ltd", + 2778: "Codefabrik GmbH", + 2779: "Reelables, Inc.", + 2780: "Duravit AG", + 2781: "Boss Audio", + 2782: "Vocera Communications, Inc.", + 2783: "Douglas Dynamics L.L.C.", + 2784: "Viceroy Devices Corporation", + 2785: "ChengDu ForThink Technology Co., Ltd.", + 2786: "IMATRIX SYSTEMS, INC.", + 2787: "GlobalMed", + 2788: "DALI Alliance", + 2789: "unu GmbH", + 2790: "Hexology", + 2791: "Sunplus Technology Co., Ltd.", + 2792: "LEVEL, s.r.o.", + 2793: "FLIR Systems AB", + 2794: "Borda Technology", + 2795: "Square, Inc.", + 2796: "FUTEK ADVANCED SENSOR TECHNOLOGY, INC", + 2797: "Saxonar GmbH", + 2798: "Velentium, LLC", + 2799: "GLP German Light Products GmbH", + 2800: "Leupold & Stevens, Inc.", + 2801: "CRADERS,CO.,LTD", + 2802: "Shanghai All Link Microelectronics Co.,Ltd", + 2803: "701x Inc.", + 2804: "Radioworks Microelectronics PTY LTD", + 2805: "Unitech Electronic Inc.", + 2806: "AMETEK, Inc.", + 2807: "Irdeto", + 2808: "First Design System Inc.", + 2809: "Unisto AG", + 2810: "Chengdu Ambit Technology Co., Ltd.", + 2811: "SMT ELEKTRONIK GmbH", + 2812: "Cerebrum Sensor Technologies Inc.", + 2813: "Weber Sensors, LLC", + 2814: "Earda Technologies Co.,Ltd", + 2815: "FUSEAWARE LIMITED", + 2816: "Flaircomm Microelectronics Inc.", + 2817: "RESIDEO TECHNOLOGIES, INC.", + 2818: "IORA Technology Development Ltd. Sti.", + 2819: "Precision Triathlon Systems Limited", + 2820: "I-PERCUT", + 2821: "Marquardt GmbH", + 2822: "FAZUA GmbH", + 2823: "Workaround Gmbh", + 2824: "Shenzhen Qianfenyi Intelligent Technology Co., LTD", + 2825: "soonisys", + 2826: "Belun Technology Company Limited", + 2827: "Sanistaal A/S", + 2828: "BluPeak", + 2829: "SANYO DENKO Co.,Ltd.", + 2830: "Honda Lock Mfg. Co.,Ltd.", + 2831: "B.E.A. S.A.", + 2832: "Alfa Laval Corporate AB", + 2833: "ThermoWorks, Inc.", + 2834: "ToughBuilt Industries LLC", + 2835: "IOTOOLS", + 2836: "Olumee", + 2837: "NAOS JAPAN K.K.", + 2838: "Guard RFID Solutions Inc.", + 2839: "SIG SAUER, INC.", + 2840: "DECATHLON SE", + 2841: "WBS PROJECT H PTY LTD", + 2842: "Roca Sanitario, S.A.", + 2843: "Enerpac Tool Group Corp.", + 2844: "Nanoleq AG", + 2845: "Accelerated Systems", + 2846: "PB INC.", + 2847: "Beijing ESWIN Computing Technology Co., Ltd.", + 2848: "TKH Security B.V.", + 2849: "ams AG", + 2850: "Hygiene IQ, LLC.", + 2851: "iRhythm Technologies, Inc.", + 2852: "BeiJing ZiJie TiaoDong KeJi Co.,Ltd.", + 2853: "NIBROTECH LTD", + 2854: "Baracoda Daily Healthtech.", + 2855: "Lumi United Technology Co., Ltd", + 2856: "CHACON", + 2857: "Tech-Venom Entertainment Private Limited", + 2858: "ACL Airshop B.V.", + 2859: "MAINBOT", + 2860: "ILLUMAGEAR, Inc.", + 2861: "REDARC ELECTRONICS PTY LTD", + 2862: "MOCA System Inc.", + 2863: "Duke Manufacturing Co", + 2864: "ART SPA", + 2865: "Silver Wolf Vehicles Inc.", + 2866: "Hala Systems, Inc.", + 2867: "ARMATURA LLC", + 2868: "CONZUMEX INDUSTRIES PRIVATE LIMITED", + 2869: "BH SENS", + 2870: "SINTEF", + 2871: "Omnivoltaic Energy Solutions Limited Company", + 2872: "WISYCOM S.R.L.", + 2873: "Red 100 Lighting Co., ltd.", + 2874: "Impact Biosystems, Inc.", + 2875: "AIC semiconductor (Shanghai) Co., Ltd.", + 2876: "Dodge Industrial, Inc.", + 2877: "REALTIMEID AS", + 2878: "ISEO Serrature S.p.a.", + 2879: "MindRhythm, Inc.", + 2880: "Havells India Limited", + 2881: "Sentrax GmbH", + 2882: "TSI", + 2883: "INCITAT ENVIRONNEMENT", + 2884: "nFore Technology Co., Ltd.", + 2885: "Electronic Sensors, Inc.", + 2886: "Bird Rides, Inc.", + 2887: "Gentex Corporation", + 2888: "NIO USA, Inc.", + 2889: "SkyHawke Technologies", + 2890: "Nomono AS", + 2891: "EMS Integrators, LLC", + 2892: "BiosBob.Biz", + 2893: "Adam Hall GmbH", + 2894: "ICP Systems B.V.", + 2895: "Breezi.io, Inc.", + 2896: "Mesh Systems LLC", + 2897: "FUN FACTORY GmbH", + 2898: "ZIIP Inc", + 2899: "SHENZHEN KAADAS INTELLIGENT TECHNOLOGY CO.,Ltd", + 2900: "Emotion Fitness GmbH & Co. KG", + 2901: "H G M Automotive Electronics, Inc.", + 2902: "BORA - Vertriebs GmbH & Co KG", + 2903: "CONVERTRONIX TECHNOLOGIES AND SERVICES LLP", + 2904: "TOKAI-DENSHI INC", + 2905: "Versa Group B.V.", + 2906: "H.P. Shelby Manufacturing, LLC.", + 2907: "Shenzhen ImagineVision Technology Limited", + 2908: "Exponential Power, Inc.", + 2909: "Fujian Newland Auto-ID Tech. Co., Ltd.", + 2910: "CELLCONTROL, INC.", + 2911: "Rivieh, Inc.", + 2912: "RATOC Systems, Inc.", + 2913: "Sentek Pty Ltd", + 2914: "NOVEA ENERGIES", + 2915: "Innolux Corporation", + 2916: "NingBo klite Electric Manufacture Co.,LTD", + 2917: "The Apache Software Foundation", + 2918: "MITSUBISHI ELECTRIC AUTOMATION (THAILAND) COMPANY LIMITED", + 2919: "CleanSpace Technology Pty Ltd", + 2920: "Quha oy", + 2921: "Addaday", + 2922: "Dymo", + 2923: "Samsara Networks, Inc", + 2924: "Sensitech, Inc.", + 2925: "SOLUM CO., LTD", + 2926: "React Mobile", + 2927: "Shenzhen Malide Technology Co.,Ltd", + 2928: "JDRF Electromag Engineering Inc", + 2929: "lilbit ODM AS", + 2930: "Geeknet, Inc.", + 2931: "HARADA INDUSTRY CO., LTD.", + 2932: "BQN", + 2933: "Triple W Japan Inc.", + 2934: "MAX-co., ltd", + 2935: "Aixlink(Chengdu) Co., Ltd.", + 2936: "FIELD DESIGN INC.", + 2937: "Sankyo Air Tech Co.,Ltd.", + 2938: "Shenzhen KTC Technology Co.,Ltd.", + 2939: "Hardcoder Oy", + 2940: "Scangrip A/S", + 2941: "FoundersLane GmbH", + 2942: "Offcode Oy", + 2943: "ICU tech GmbH", + 2944: "AXELIFE", + 2945: "SCM Group", + 2946: "Mammut Sports Group AG", + 2947: "Taiga Motors Inc.", + 2948: "Presidio Medical, Inc.", + 2949: "VIMANA TECH PTY LTD", + 2950: "Trek Bicycle", + 2951: "Ampetronic Ltd", + 2952: "Muguang (Guangdong) Intelligent Lighting Technology Co., Ltd", + 2953: "Rotronic AG", + 2954: "Seiko Instruments Inc.", + 2955: "American Technology Components, Incorporated", + 2956: "MOTREX", + 2957: "Pertech Industries Inc", + 2958: "Gentle Energy Corp.", + 2959: "Senscomm Semiconductor Co., Ltd.", + 2960: "Ineos Automotive Limited", + 2961: "Alfen ICU B.V.", + 2962: "Citisend Solutions, SL", + 2963: "Hangzhou BroadLink Technology Co., Ltd.", + 2964: "Dreem SAS", + 2965: "Netwake GmbH", + 2966: "Telecom Design", + 2967: "SILVER TREE LABS, INC.", + 2968: "Gymstory B.V.", + 2969: "The Goodyear Tire & Rubber Company", + 2970: "Beijing Wisepool Infinite Intelligence Technology Co.,Ltd", + 2971: "GISMAN", + 2972: "Komatsu Ltd.", + 2973: "Sensoria Holdings LTD", + 2974: "Audio Partnership Plc", + 2975: "Group Lotus Limited", + 2976: "Data Sciences International", + 2977: "Bunn-O-Matic Corporation", + 2978: "TireCheck GmbH", + 2979: "Sonova Consumer Hearing GmbH", + 2980: "Vervent Audio Group", + 2981: "SONICOS ENTERPRISES, LLC", + 2982: "Nissan Motor Co., Ltd.", + 2983: "hearX Group (Pty) Ltd", + 2984: "GLOWFORGE INC.", + 2985: "Allterco Robotics ltd", + 2986: "Infinitegra, Inc.", + 2987: "Grandex International Corporation", + 2988: "Machfu Inc.", + 2989: "Roambotics, Inc.", + 2990: "Soma Labs LLC", + 2991: "NITTO KOGYO CORPORATION", + 2992: "Ecolab Inc.", + 2993: "Beijing ranxin intelligence technology Co.,LTD", + 2994: "Fjorden Electra AS", + 2995: "Flender GmbH", + 2996: "New Cosmos USA, Inc.", + 2997: "Xirgo Technologies, LLC", + 2998: "Build With Robots Inc.", + 2999: "IONA Tech LLC", + 3000: "INNOVAG PTY. LTD.", + 3001: "SaluStim Group Oy", + 3002: "Huso, INC", + 3003: "SWISSINNO SOLUTIONS AG", + 3004: "T2REALITY SOLUTIONS PRIVATE LIMITED", + 3005: "ETHEORY PTY LTD", + 3006: "SAAB Aktiebolag", + 3007: "HIMSA II K/S", + 3008: "READY FOR SKY LLP", + 3009: "Miele & Cie. KG", + 3010: "EntWick Co.", + 3011: "MCOT INC.", + 3012: "TECHTICS ENGINEERING B.V.", + 3013: "Aperia Technologies, Inc.", + 3014: "TCL COMMUNICATION EQUIPMENT CO.,LTD.", + 3015: "Signtle Inc.", + 3016: "OTF Distribution, LLC", + 3017: "Neuvatek Inc.", + 3018: "Perimeter Technologies, Inc.", + 3019: "Divesoft s.r.o.", + 3020: "Sylvac sa", + 3021: "Amiko srl", + 3022: "Neurosity, Inc.", + 3023: "LL Tec Group LLC", + 3024: "Durag GmbH", + 3025: "Hubei Yuan Times Technology Co., Ltd.", + 3026: "IDEC", + 3027: "Procon Analytics, LLC", + 3028: "ndd Medizintechnik AG", + 3029: "Super B Lithium Power B.V.", + 3030: "Shenzhen Injoinic Technology Co., Ltd.", + 3031: "VINFAST TRADING AND PRODUCTION JOINT STOCK COMPANY", + 3032: "PURA SCENTS, INC.", + 3033: "Elics Basis Ltd.", + 3034: "Aardex Ltd.", + 3035: "CHAR-BROIL, LLC", + 3036: "Ledworks S.r.l.", + 3037: "Coroflo Limited", + 3038: "Yale", + 3039: "WINKEY ENTERPRISE (HONG KONG) LIMITED", + 3040: "Koizumi Lighting Technology corp.", + 3041: "Back40 Precision", + 3042: "OTC engineering", + 3043: "Comtel Systems Ltd.", + 3044: "Deepfield Connect GmbH", + 3045: "ZWILLING J.A. Henckels Aktiengesellschaft", + 3046: "Puratap Pty Ltd", + 3047: "Fresnel Technologies, Inc.", + 3048: "Sensormate AG", + 3049: "Shindengen Electric Manufacturing Co., Ltd.", + 3050: "Twenty Five Seven, prodaja in storitve, d.o.o.", + 3051: "Luna Health, Inc.", + 3052: "Miracle-Ear, Inc.", + 3053: "CORAL-TAIYI Co. Ltd.", + 3054: "LINKSYS USA, INC.", + 3055: "Safetytest GmbH", + 3056: "KIDO SPORTS CO., LTD.", + 3057: "Site IQ LLC", + 3058: "Angel Medical Systems, Inc.", + 3059: "PONE BIOMETRICS AS", + 3060: "ER Lab LLC", + 3061: "T5 tek, Inc.", + 3062: "greenTEG AG", + 3063: "Wacker Neuson SE", + 3064: "Innovacionnye Resheniya", + 3065: "Alio, Inc", + 3066: "CleanBands Systems Ltd.", + 3067: "Dodam Enersys Co., Ltd", + 3068: "T+A elektroakustik GmbH & Co.KG", + 3069: "Esm\u00e9 Solutions", + 3070: "Media-Cartec GmbH", + 3071: "Ratio Electric BV", + 3072: "MQA Limited", + 3073: "NEOWRK SISTEMAS INTELIGENTES S.A.", + 3074: "Loomanet, Inc.", + 3075: "Puff Corp", + 3076: "Happy Health, Inc.", + 3077: "Montage Connect, Inc.", + 3078: "LED Smart Inc.", + 3079: "CONSTRUKTS, INC.", + 3080: "limited liability company \"Red\"", + 3081: "Senic Inc.", + 3082: "Automated Pet Care Products, LLC", + 3083: "aconno GmbH", + 3084: "Mendeltron, Inc.", + 3085: "Mereltron bv", + 3086: "ALEX DENKO CO.,LTD.", + 3087: "AETERLINK", + 3088: "Cosmed s.r.l.", + 3089: "Gordon Murray Design Limited", + 3090: "IoSA", + 3091: "Scandinavian Health Limited", + 3092: "Fasetto, Inc.", + 3093: "Geva Sol B.V.", + 3094: "TYKEE PTY. LTD.", + 3095: "SomnoMed Limited", + 3096: "CORROHM", + 3097: "Arlo Technologies, Inc.", + 3098: "Catapult Group International Ltd", + 3099: "Rockchip Electronics Co., Ltd.", + 3100: "GEMU", + 3101: "OFF Line Japan Co., Ltd.", + 3102: "EC sense co., Ltd", + 3103: "LVI Co.", + 3104: "COMELIT GROUP S.P.A.", + 3105: "Foshan Viomi Electrical Technology Co., Ltd", + 3106: "Glamo Inc.", + 3107: "KEYTEC,Inc.", + 3108: "SMARTD TECHNOLOGIES INC.", + 3109: "JURA Elektroapparate AG", + 3110: "Performance Electronics, Ltd.", + 3111: "Pal Electronics", + 3112: "Embecta Corp.", + 3113: "DENSO AIRCOOL CORPORATION", + 3114: "Caresix Inc.", + 3115: "GigaDevice Semiconductor Inc.", + 3116: "Zeku Technology (Shanghai) Corp., Ltd.", + 3117: "OTF Product Sourcing, LLC", + 3118: "Easee AS", + 3119: "BEEHERO, INC.", + 3120: "McIntosh Group Inc", + 3121: "KINDOO LLP", + 3122: "Xian Yisuobao Electronic Technology Co., Ltd.", + 3123: "Exeger Operations AB", + 3124: "BYD Company Limited", + 3125: "Thermokon-Sensortechnik GmbH", + 3126: "Cosmicnode BV", + 3127: "SignalQuest, LLC", + 3128: "Noritz Corporation.", + 3129: "TIGER CORPORATION", + 3130: "Equinosis, LLC", + 3131: "ORB Innovations Ltd", + 3132: "Classified Cycling", + 3133: "Wrmth Corp.", + 3134: "BELLDESIGN Inc.", + 3135: "Stinger Equipment, Inc.", + 3136: "HORIBA, Ltd.", + 3137: "Control Solutions LLC", + 3138: "Heath Consultants Inc.", + 3139: "Berlinger & Co. AG", + 3140: "ONCELABS LLC", + 3141: "Brose Verwaltung SE, Bamberg", + 3142: "Granwin IoT Technology (Guangzhou) Co.,Ltd", + 3143: "Epsilon Electronics,lnc", + 3144: "VALEO MANAGEMENT SERVICES", + 3145: "twopounds gmbh", + 3146: "atSpiro ApS", + 3147: "ADTRAN, Inc.", + 3148: "Orpyx Medical Technologies Inc.", + 3149: "Seekwave Technology Co.,ltd.", + 3150: "Tactile Engineering, Inc.", + 3151: "SharkNinja Operating LLC", + 3152: "Imostar Technologies Inc.", + 3153: "INNOVA S.R.L.", + 3154: "ESCEA LIMITED", + 3155: "Taco, Inc.", + 3156: "HiViz Lighting, Inc.", + 3157: "Zintouch B.V.", + 3158: "Rheem Sales Company, Inc.", + 3159: "UNEEG medical A/S", + 3160: "Hykso Inc.", + 3161: "CYBERDYNE Inc.", + 3162: "Lockswitch Sdn Bhd", + 3163: "Alban Giacomo S.P.A.", + 3164: "MGM WIRELESSS HOLDINGS PTY LTD", + 3165: "StepUp Solutions ApS", + 3166: "BlueID GmbH", + 3167: "Nanjing Linkpower Microelectronics Co.,Ltd", + 3168: "KEBA Energy Automation GmbH", + 3169: "NNOXX, Inc", + 3170: "Phiaton Corporation", + 3171: "phg Peter Hengstler GmbH + Co. KG", + 3172: "dormakaba Holding AG", + 3173: "WAKO CO,.LTD", + 3174: "DEN Smart Home B.V.", + 3175: "TRACKTING S.R.L.", + 3176: "Emerja Corporation", + 3177: "BLITZ electric motors. LTD", + 3178: "CONSORCIO TRUST CONTROL - NETTEL", + 3179: "GILSON SAS", + 3180: "SNIFF LOGIC LTD", + 3181: "Fidure Corp.", + 3182: "Sensa LLC", + 3183: "Parakey AB", + 3184: "SCARAB SOLUTIONS LTD", + 3185: "BitGreen Technolabz (OPC) Private Limited", + 3186: "StreetCar ORV, LLC", + 3187: "Truma Ger\u00c3\u00a4tetechnik GmbH & Co. KG", + 3188: "yupiteru", + 3189: "Embedded Engineering Solutions LLC", + 3190: "Shenzhen Gwell Times Technology Co. , Ltd", + 3191: "TEAC Corporation", + 3192: "CHARGTRON IOT PRIVATE LIMITED", + 3193: "Zhuhai Smartlink Technology Co., Ltd", + 3194: "Triductor Technology (Suzhou), Inc.", + 3195: "PT SADAMAYA GRAHA TEKNOLOGI", + 3196: "Mopeka Products LLC", + 3197: "3ALogics, Inc.", + 3198: "BOOMING OF THINGS", + 3199: "Rochester Sensors, LLC", + 3200: "CARDIOID - TECHNOLOGIES, LDA", + 3201: "Carrier Corporation", + 3202: "NACON", + 3203: "Watchdog Systems LLC", + 3204: "MAXON INDUSTRIES, INC.", + 3205: "Amlogic, Inc.", + 3206: "Qingdao Eastsoft Communication Technology Co.,Ltd", + 3207: "Weltek Technologies Company Limited", + 3208: "Nextivity Inc.", + 3209: "AGZZX OPTOELECTRONICS TECHNOLOGY CO., LTD", + 3210: "ARTISTIC&CO.GLOBAL Ltd.", + 3211: "Heavys Inc", + 3212: "T-Mobile USA", + 3213: "tonies GmbH", + 3214: "Technocon Engineering Ltd.", + 3215: "Radar Automobile Sales(Shandong)Co.,Ltd.", + 3216: "WESCO AG", + 3217: "Yashu Systems", + 3218: "Kesseb\u00f6hmer Ergonomietechnik GmbH", + 3219: "Movesense Oy", + 3220: "Baxter Healthcare Corporation", + 3221: "Gemstone Lights Canada Ltd.", + 3222: "H+B Hightech GmbH", + 3223: "Deako", + 3224: "MiX Telematics International (PTY) LTD", + 3225: "Vire Health Oy", + 3226: "ALF Inc.", + 3227: "NTT sonority, Inc.", + 3228: "Sunstone-RTLS Ipari Szolgaltato Korlatolt Felelossegu Tarsasag", + 3229: "Ribbiot, INC.", + 3230: "ECCEL CORPORATION SAS", + 3231: "Dragonfly Energy Corp.", + 3232: "BIGBEN", + 3233: "YAMAHA MOTOR CO.,LTD.", + 3234: "XSENSE LTD", + 3235: "MAQUET GmbH", + 3236: "MITSUBISHI ELECTRIC LIGHTING CO, LTD", + 3237: "Princess Cruise Lines, Ltd.", + 3238: "Megger Ltd", + 3239: "Verve InfoTec Pty Ltd", + 3240: "Sonas, Inc.", + 3241: "Mievo Technologies Private Limited", + 3242: "Shenzhen Poseidon Network Technology Co., Ltd", + 3243: "HERUTU ELECTRONICS CORPORATION", + 3244: "Shenzhen Shokz Co.,Ltd.", + 3245: "Shenzhen Openhearing Tech CO., LTD .", + 3246: "Evident Corporation", + 3247: "NEURINNOV", + 3248: "SwipeSense, Inc.", + 3249: "RF Creations", + 3250: "SHINKAWA Sensor Technology, Inc.", + 3251: "janova GmbH", + 3252: "Eberspaecher Climate Control Systems GmbH", + 3253: "Racketry, d. o. o.", + 3254: "THE EELECTRIC MACARON LLC", + 3255: "Cucumber Lighting Controls Limited", + 3256: "Shanghai Proxy Network Technology Co., Ltd.", + 3257: "seca GmbH & Co. KG", + 3258: "Ameso Tech (OPC) Private Limited", + 3259: "Emlid Tech Kft.", + 3260: "TROX GmbH", + 3261: "Pricer AB", + 3262: "Missing Company ID from Bluetooth SIG Assigned Numbers", + 3263: "Forward Thinking Systems LLC.", + 3264: "Garnet Instruments Ltd.", + 3265: "CLEIO Inc.", + 3266: "Anker Innovations Limited", + 3267: "HMD Global Oy", + 3268: "ABUS August Bremicker Soehne Kommanditgesellschaft", + 3269: "Open Road Solutions, Inc.", + 3270: "Serial Technology Corporation", + 3271: "SB C&S Corp.", + 3272: "TrikThom", + 3273: "Innocent Technology Co., Ltd.", + 3274: "Cyclops Marine Ltd", + 3275: "NOTHING TECHNOLOGY LIMITED", + 3276: "Kord Defence Pty Ltd", + 3277: "YanFeng Visteon(Chongqing) Automotive Electronic Co.,Ltd", + 3278: "SENOSPACE LLC", + 3279: "Shenzhen CESI Information Technology Co., Ltd.", + 3280: "MooreSilicon Semiconductor Technology (Shanghai) Co., LTD.", + 3281: "Imagine Marketing Limited", + 3282: "EQOM SSC B.V.", + 3283: "TechSwipe", + 3284: "Shenzhen Zhiduotun IoT Technology Co., Ltd", + 3285: "Numa Products, LLC", + 3286: "HHO (Hangzhou) Digital Technology Co., Ltd.", + 3287: "Maztech Industries, LLC", + 3288: "SIA Mesh Group", + 3289: "Minami acoustics Limited", + 3290: "Wolf Steel ltd", + 3291: "Circus World Displays Limited", + 3292: "Ypsomed AG", + 3293: "Alif Semiconductor, Inc.", + 3294: "RESPONSE TECHNOLOGIES, LTD.", + 3295: "SHENZHEN CHENYUN ELECTRONICS CO., LTD", + 3296: "VODALOGIC PTY LTD", + 3297: "Regal Beloit America, Inc.", + 3298: "CORVENT MEDICAL, INC.", + 3299: "Taiwan Fuhsing", + 3300: "Off-Highway Powertrain Services Germany GmbH", + 3301: "Amina Distribution AS", + 3302: "McWong International, Inc.", + 3303: "TAG HEUER SA", + 3304: "Dongguan Yougo Electronics Co.,Ltd.", + 3305: "PEAG, LLC dba JLab Audio", + 3306: "HAYWARD INDUSTRIES, INC", + 3307: "Shenzhen Tingting Technology Co. LTD", + 3308: "Pacific Coast Fishery Services (2003) Inc.", + 3309: "CV. NURI TEKNIK", + 3310: "MadgeTech, Inc", + 3311: "POGS B.V.", + 3312: "THOTAKA TEKHNOLOGIES INDIA PRIVATE LIMITED", + 3313: "Midmark", + 3314: "BestSens AG", + 3315: "Radio Sound", + 3316: "SOLUX PTY LTD", + 3317: "BOS Balance of Storage Systems AG", + 3318: "OJ Electronics A/S", + 3319: "TVS Motor Company Ltd.", + 3320: "core sensing GmbH", + 3321: "Tamblue Oy", + 3322: "Protect Animals With Satellites LLC", + 3323: "Tyromotion GmbH", + 3324: "ElectronX design", + 3325: "Wuhan Woncan Construction Technologies Co., Ltd.", + 3326: "Thule Group AB", + 3327: "Ergodriven Inc", + 3328: "Sparkpark AS", + 3329: "KEEPEN", + 3330: "Rocky Mountain ATV/MC Jake Wilson", + 3331: "MakuSafe Corp", + 3332: "Bartec Auto Id Ltd", + 3333: "Energy Technology and Control Limited", + 3334: "doubleO Co., Ltd.", + 3335: "Datalogic S.r.l.", + 3336: "Datalogic USA, Inc.", + 3337: "Leica Geosystems AG", + 3338: "CATEYE Co., Ltd.", + 3339: "Research Products Corporation", + 3340: "Planmeca Oy", + 3341: "C.Ed. Schulte GmbH Zylinderschlossfabrik", + 3342: "PetVoice Co., Ltd.", + 3343: "Timebirds Australia Pty Ltd", + 3344: "JVC KENWOOD Corporation", + 3345: "Great Dane LLC", + 3346: "Spartek Systems Inc.", + 3347: "MERRY ELECTRONICS CO., LTD.", + 3348: "Merry Electronics (S) Pte Ltd", + 3349: "Spark", + 3350: "Nations Technologies Inc.", + 3351: "Akix S.r.l.", + 3352: "Bioliberty Ltd", + 3353: "C.G. Air Systemes Inc.", + 3354: "Maturix ApS", + 3355: "RACHIO, INC.", + 3356: "LIMBOID LLC", + 3357: "Electronics4All Inc.", + 3358: "FESTINA LOTUS SA", + 3359: "Synkopi, Inc.", + 3360: "SCIENTERRA LIMITED", + 3361: "Cennox Group Limited", + 3362: "Cedarware, Corp.", + 3363: "GREE Electric Appliances, Inc. of Zhuhai", + 3364: "Japan Display Inc.", + 3365: "System Elite Holdings Group Limited", + 3366: "Burkert Werke GmbH & Co. KG", + 3367: "velocitux", + 3368: "FUJITSU COMPONENT LIMITED", + 3369: "MIYAKAWA ELECTRIC WORKS LTD", + 3370: "PhysioLogic Devices, Inc.", + 3371: "Sensoryx AG", + 3372: "SIL System Integration Laboratory GmbH", + 3373: "Cooler Pro, LLC", + 3374: "Advanced Electronic Applications, Inc", + 3375: "Delta Development Team, Inc", + 3376: "Laxmi Therapeutic Devices, Inc.", + 3377: "SYNCHRON, INC.", + 3378: "Badger Meter", + 3379: "Micropower Group AB", + 3380: "ZILLIOT TECHNOLOGIES PRIVATE LIMITED", + 3381: "Universidad Politecnica de Madrid", + 3382: "XIHAO INTELLIGENGT TECHNOLOGY CO., LTD", + 3383: "Zerene Inc.", + 3384: "CycLock", + 3385: "Systemic Games, LLC", + 3386: "Frost Solutions, LLC", + 3387: "Lone Star Marine Pty Ltd", + 3388: "SIRONA Dental Systems GmbH", + 3389: "bHaptics Inc.", + 3390: "LUMINOAH, INC.", + 3391: "Vogels Products B.V.", + 3392: "SignalFire Telemetry, Inc.", + 3393: "CPAC Systems AB", + 3394: "TEKTRO TECHNOLOGY CORPORATION", + 3395: "Gosuncn Technology Group Co., Ltd.", + 3396: "Ex Makhina Inc.", + 3397: "Odeon, Inc.", + 3398: "Thales Simulation & Training AG", + 3399: "Shenzhen DOKE Electronic Co., Ltd", + 3400: "Vemcon GmbH", + 3401: "Refrigerated Transport Electronics, Inc.", + 3402: "Rockpile Solutions, LLC", + 3403: "Soundwave Hearing, LLC", + 3404: "IotGizmo Corporation", + 3405: "Optec, LLC", + 3406: "NIKAT SOLUTIONS PRIVATE LIMITED", + 3407: "Movano Inc.", + 3408: "Ningbo Fotile Marketing Co.,Ltd.", + 3409: "Genetus inc.", + 3410: "DIVAN TRADING CO., LTD.", + 3411: "Luxottica Group S.p.A", + 65535: "Bluetooth SIG Specification Reserved Default Vendor ID for Remote Devices Without Device ID Service Record.", +} \ No newline at end of file diff --git a/network/ble_device.go b/network/ble_device.go index c3e16c96..f13f15b5 100644 --- a/network/ble_device.go +++ b/network/ble_device.go @@ -1,39 +1,68 @@ +//go:build !windows // +build !windows package network import ( "encoding/json" + "fmt" + "reflect" + "sync" "time" - "github.com/bettercap/gatt" + "github.com/evilsocket/islazy/str" + "tinygo.org/x/bluetooth" ) type BLECharacteristic struct { UUID string `json:"uuid"` Name string `json:"name"` - Handle uint16 `json:"handle"` + MTU uint16 `json:"mtu"` Properties []string `json:"properties"` Data interface{} `json:"data"` } +func NewBLECharacteristic(UUID string) BLECharacteristic { + char := BLECharacteristic{ + UUID: UUID, + Properties: make([]string, 0), + } + if name, found := BLE_Characteristics[char.UUID]; found { + char.Name = name + } + return char +} + type BLEService struct { UUID string `json:"uuid"` Name string `json:"name"` - Handle uint16 `json:"handle"` - EndHandle uint16 `json:"end_handle"` Characteristics []BLECharacteristic `json:"characteristics"` } +func NewBLEService(UUID string) BLEService { + service := BLEService{ + UUID: UUID, + Characteristics: make([]BLECharacteristic, 0), + } + if name, found := BLE_Services[service.UUID]; found { + service.Name = name + } + return service +} + type BLEDevice struct { - Alias string - LastSeen time.Time - DeviceName string - Vendor string - RSSI int - Device gatt.Peripheral - Advertisement *gatt.Advertisement - Services []BLEService + sync.RWMutex + + Alias string + LastSeen time.Time + Address string + Name string + Vendor string + RSSI int16 + Advertisement []byte + ManufacturerData []bluetooth.ManufacturerDataElement + ServiceData []bluetooth.ServiceDataElement + Services []BLEService } type bleDeviceJSON struct { @@ -42,51 +71,129 @@ type bleDeviceJSON struct { MAC string `json:"mac"` Alias string `json:"alias"` Vendor string `json:"vendor"` - RSSI int `json:"rssi"` + RSSI int16 `json:"rssi"` Connectable bool `json:"connectable"` Flags string `json:"flags"` Services []BLEService `json:"services"` } -func NewBLEDevice(p gatt.Peripheral, a *gatt.Advertisement, rssi int) *BLEDevice { - vendor := ManufLookup(NormalizeMac(p.ID())) - if vendor == "" && a != nil { - vendor = a.Company - } +func NewBLEDevice(scanResult bluetooth.ScanResult) *BLEDevice { + devAddress := scanResult.Address.String() + devName := scanResult.LocalName() + devAdv := scanResult.Bytes() return &BLEDevice{ - LastSeen: time.Now(), - Device: p, - Vendor: vendor, - Advertisement: a, - RSSI: rssi, - Services: make([]BLEService, 0), + LastSeen: time.Now(), + Address: devAddress, + Name: devName, + RSSI: scanResult.RSSI, + Advertisement: devAdv, + Vendor: ManufLookup(devAddress), + ManufacturerData: make([]bluetooth.ManufacturerDataElement, 0), + ServiceData: make([]bluetooth.ServiceDataElement, 0), + Services: make([]BLEService, 0), } } -func (d *BLEDevice) Name() string { - // get the name if it's being set during services enumeration via 'Device Name' - name := d.DeviceName - if name == "" { - // get the name from the device - name = d.Device.Name() - if name == "" && d.Advertisement != nil { - // get the name from the advertisement data - name = d.Advertisement.LocalName +func sliceContains(slice []interface{}, elem interface{}) bool { + for _, item := range slice { + if item == elem { + return true + } + } + return false +} + +func (dev *BLEDevice) hasManu(manu bluetooth.ManufacturerDataElement) bool { + for _, item := range dev.ManufacturerData { + if reflect.DeepEqual(item, manu) { + return true + } + } + return false +} + +func (dev *BLEDevice) hasSvc(svc bluetooth.ServiceDataElement) bool { + for _, item := range dev.ServiceData { + if reflect.DeepEqual(item, svc) { + return true + } + } + return false +} + +func (dev *BLEDevice) ResetServices() { + dev.Lock() + defer dev.Unlock() + dev.Services = make([]BLEService, 0) +} + +func (dev *BLEDevice) AddService(svc BLEService) { + dev.Lock() + defer dev.Unlock() + dev.Services = append(dev.Services, svc) +} + +func (dev *BLEDevice) Update(scanResult bluetooth.ScanResult, alias string) { + dev.Lock() + defer dev.Unlock() + + devName := str.Trim(scanResult.LocalName()) + devAdv := scanResult.Bytes() + devManu := scanResult.ManufacturerData() + devService := scanResult.ServiceData() + + dev.LastSeen = time.Now() + dev.RSSI = scanResult.RSSI + + if alias != "" { + dev.Alias = alias + } + + if devName != "" { + dev.Name = devName + } + + if devAdv != nil && !reflect.DeepEqual(devAdv, dev.Advertisement) { + dev.Advertisement = devAdv + } + + for _, manu := range devManu { + if !dev.hasManu(manu) { + dev.ManufacturerData = append(dev.ManufacturerData, manu) + } + } + + for _, svc := range devService { + if !dev.hasSvc(svc) { + dev.ServiceData = append(dev.ServiceData, svc) + } + } + + if dev.Vendor == "" || dev.Vendor[0] == '<' { + for _, manu := range dev.ManufacturerData { + if company, found := BLE_Companies[manu.CompanyID]; found { + dev.Vendor = company + break + } else { + dev.Vendor = fmt.Sprintf("<0x%x>", manu.CompanyID) + } } } - return name } func (d *BLEDevice) MarshalJSON() ([]byte, error) { + d.RLock() + defer d.RUnlock() + doc := bleDeviceJSON{ LastSeen: d.LastSeen, - Name: d.Name(), - MAC: d.Device.ID(), + Name: d.Name, + MAC: d.Address, Alias: d.Alias, Vendor: d.Vendor, RSSI: d.RSSI, - Connectable: d.Advertisement.Connectable, - Flags: d.Advertisement.Flags.String(), + Connectable: true, + Flags: "", Services: d.Services, } return json.Marshal(doc) diff --git a/network/ble_services.go b/network/ble_services.go new file mode 100644 index 00000000..2f5cc1d9 --- /dev/null +++ b/network/ble_services.go @@ -0,0 +1,121 @@ +package network + +var BLE_Services = map[string]string{ + "00001800-0000-1000-8000-00805f9b34fb": "Generic Access", + "00001811-0000-1000-8000-00805f9b34fb": "Alert Notification Service", + "00001815-0000-1000-8000-00805f9b34fb": "Automation IO", + "0000180f-0000-1000-8000-00805f9b34fb": "Battery Service", + "00001810-0000-1000-8000-00805f9b34fb": "Blood Pressure", + "0000181b-0000-1000-8000-00805f9b34fb": "Body Composition", + "0000181e-0000-1000-8000-00805f9b34fb": "Bond Management Service", + "0000181f-0000-1000-8000-00805f9b34fb": "Continuous Glucose Monitoring", + "00001805-0000-1000-8000-00805f9b34fb": "Current Time Service", + "00001818-0000-1000-8000-00805f9b34fb": "Cycling Power", + "00001816-0000-1000-8000-00805f9b34fb": "Cycling Speed and Cadence", + "0000180a-0000-1000-8000-00805f9b34fb": "Device Information", + "0000181a-0000-1000-8000-00805f9b34fb": "Environmental Sensing", + "00001826-0000-1000-8000-00805f9b34fb": "Fitness Machine", + "00001801-0000-1000-8000-00805f9b34fb": "Generic Attribute", + "00001808-0000-1000-8000-00805f9b34fb": "Glucose", + "00001809-0000-1000-8000-00805f9b34fb": "Health Thermometer", + "0000180d-0000-1000-8000-00805f9b34fb": "Heart Rate", + "00001823-0000-1000-8000-00805f9b34fb": "HTTP Proxy", + "00001812-0000-1000-8000-00805f9b34fb": "Human Interface Device", + "00001802-0000-1000-8000-00805f9b34fb": "Immediate Alert", + "00001821-0000-1000-8000-00805f9b34fb": "Indoor Positioning", + "0000183a-0000-1000-8000-00805f9b34fb": "Insulin Delivery", + "00001820-0000-1000-8000-00805f9b34fb": "Internet Protocol Support Service", + "00001803-0000-1000-8000-00805f9b34fb": "Link Loss", + "00001819-0000-1000-8000-00805f9b34fb": "Location and Navigation", + "00001827-0000-1000-8000-00805f9b34fb": "Mesh Provisioning Service", + "00001828-0000-1000-8000-00805f9b34fb": "Mesh Proxy Service", + "00001807-0000-1000-8000-00805f9b34fb": "Next DST Change Service", + "00001825-0000-1000-8000-00805f9b34fb": "Object Transfer Service", + "0000180e-0000-1000-8000-00805f9b34fb": "Phone Alert Status Service", + "00001822-0000-1000-8000-00805f9b34fb": "Pulse Oximeter Service", + "00001829-0000-1000-8000-00805f9b34fb": "Reconnection Configuration", + "00001806-0000-1000-8000-00805f9b34fb": "Reference Time Update Service", + "00001814-0000-1000-8000-00805f9b34fb": "Running Speed and Cadence", + "00001813-0000-1000-8000-00805f9b34fb": "Scan Parameters", + "00001824-0000-1000-8000-00805f9b34fb": "Transport Discovery", + "00001804-0000-1000-8000-00805f9b34fb": "Tx Power", + "0000181c-0000-1000-8000-00805f9b34fb": "User Data", + "0000181d-0000-1000-8000-00805f9b34fb": "Weight Scale", + "0000183b-0000-1000-8000-00805f9b34fb": "Binary Sensor", + "0000183c-0000-1000-8000-00805f9b34fb": "Emergency Configuration", + "0000183e-0000-1000-8000-00805f9b34fb": "Physical Activity Monitor", + "00001843-0000-1000-8000-00805f9b34fb": "Audio Input Control", + "00001844-0000-1000-8000-00805f9b34fb": "Volume Control", + "00001845-0000-1000-8000-00805f9b34fb": "Volume Offset Control", + "00001846-0000-1000-8000-00805f9b34fb": "Coordinated Set Identification", + "00001847-0000-1000-8000-00805f9b34fb": "Device Time", + "00001848-0000-1000-8000-00805f9b34fb": "Media Control", + "00001849-0000-1000-8000-00805f9b34fb": "Generic Media Control", + "0000184a-0000-1000-8000-00805f9b34fb": "Constant Tone Extension", + "0000184b-0000-1000-8000-00805f9b34fb": "Telephone Bearer", + "0000184c-0000-1000-8000-00805f9b34fb": "Generic Telephone Bearer", + "0000184d-0000-1000-8000-00805f9b34fb": "Microphone Control", + "0000184e-0000-1000-8000-00805f9b34fb": "Audio Stream Control", + "0000184f-0000-1000-8000-00805f9b34fb": "Broadcast Audio Scan", + "00001850-0000-1000-8000-00805f9b34fb": "Published Audio Capabilities", + "00001851-0000-1000-8000-00805f9b34fb": "Basic Audio Announcement", + "00001852-0000-1000-8000-00805f9b34fb": "Broadcast Audio Announcement", + "00001853-0000-1000-8000-00805f9b34fb": "Common Audio", + "00001854-0000-1000-8000-00805f9b34fb": "Hearing Access", + "00001855-0000-1000-8000-00805f9b34fb": "TMAS", + "0000fe0f-0000-1000-8000-00805f9b34fb": "Signify Netherlands B.V. (formerly Philips Lighting) Service", + "932c32bd-0000-47a2-835a-a8d455b859dd": "Philips Hue Light Control Service", + "b8843add-0000-4aa1-8794-c3f462030bda": "Philips Hue Light Update Service", + "7905f431-b5ce-4e99-a40f-4b1e122d00d0": "Apple Notification Center Service", + "89d3502b-0f36-433a-8ef4-c502ad55f8dc": "Apple Media Service", + "7dfc6000-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Service", + "7dfc7000-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Service", + "7dfc8000-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Service", + "7dfc9000-7d1c-4951-86aa-8d9728f8d66c": "Apple Reserved Service", + "e95d0753-251d-470a-a062-fa1922dfa9a8": "micro:bit Accelerometer Service", + "e95df2d8-251d-470a-a062-fa1922dfa9a8": "micro:bit Magnetometer Service", + "e95d9882-251d-470a-a062-fa1922dfa9a8": "micro:bit Button Service", + "e95d127b-251d-470a-a062-fa1922dfa9a8": "micro:bit IO Pin Service", + "e95dd91d-251d-470a-a062-fa1922dfa9a8": "micro:bit LED Service", + "e95d93af-251d-470a-a062-fa1922dfa9a8": "micro:bit Event Service", + "e95d93b0-251d-470a-a062-fa1922dfa9a8": "micro:bit DFU Control Service", + "e95d6100-251d-470a-a062-fa1922dfa9a8": "micro:bit Temperature Service", + "ef680100-9b35-4933-9b10-52ffa9740042": "Thingy Configuration Service", + "ef680200-9b35-4933-9b10-52ffa9740042": "Thingy Weather Station Service", + "ef680300-9b35-4933-9b10-52ffa9740042": "Thingy UI Service", + "ef680400-9b35-4933-9b10-52ffa9740042": "Thingy Motion Service", + "ef680500-9b35-4933-9b10-52ffa9740042": "Thingy Sound Service", + "00001523-1212-efde-1523-785feabcd123": "Nordic LED and Button Service", + "6e400001-b5a3-f393-e0a9-e50e24dcca9e": "Nordic UART Service", + "57a70000-9350-11ed-a1eb-0242ac120002": "Nordic Status Message Service", + "0000feaa-0000-1000-8000-00805f9b34fb": "Eddystone", + "a3c87500-8ed3-4bdf-8a39-a01bebede295": "Eddystone Configuration Service", + "0000fe2c-0000-1000-8000-00805f9b34fb": "Fast Pair Service", + "00001530-1212-efde-1523-785feabcd123": "Legacy DFU Service", + "0000fe59-0000-1000-8000-00805f9b34fb": "Secure DFU Service", + "8e400001-f315-4f60-9fb8-838830daea50": "Experimental Buttonless DFU Service", + "e2a00001-ec31-4ec3-a97a-1c34d87e9878": "Edge Impulse Remote Management Service", + "0000fd6f-0000-1000-8000-00805f9b34fb": "Exposure Notification Service", + "8d53dc1d-1db7-4cd3-868b-8a527460aa84": "SMP Service", + "00001623-1212-efde-1623-785feabcd123": "LEGO\u00ae Wireless Protocol v3 Hub Service", + "00001625-1212-efde-1623-785feabcd123": "LEGO\u00ae Wireless Protocol v3 Bootloader Service", + "0000febb-0000-1000-8000-00805f9b34fb": "File Transfer Service by Adafruit", + "adaf0100-c332-42a8-93bd-25e905756cb8": "Adafruit Temperature Service", + "adaf0200-c332-42a8-93bd-25e905756cb8": "Adafruit Accelerometer Service", + "adaf0300-c332-42a8-93bd-25e905756cb8": "Adafruit Light Service", + "adaf0400-c332-42a8-93bd-25e905756cb8": "Adafruit Gyroscope Service", + "adaf0500-c332-42a8-93bd-25e905756cb8": "Adafruit Magnetometer Service", + "adaf0600-c332-42a8-93bd-25e905756cb8": "Adafruit Button Service", + "adaf0700-c332-42a8-93bd-25e905756cb8": "Adafruit Humidity Service", + "adaf0800-c332-42a8-93bd-25e905756cb8": "Adafruit Barometric Service", + "adaf0900-c332-42a8-93bd-25e905756cb8": "Adafruit Addressable Service", + "adaf0a00-c332-42a8-93bd-25e905756cb8": "Adafruit Color Service", + "adaf0b00-c332-42a8-93bd-25e905756cb8": "Adafruit Sound Service", + "adaf0c00-c332-42a8-93bd-25e905756cb8": "Adafruit Tone Service", + "adaf0d00-c332-42a8-93bd-25e905756cb8": "Adafruit Quaternion Service", + "adaf0e00-c332-42a8-93bd-25e905756cb8": "Adafruit Proximity Service", + "f000ffc0-0451-4000-b000-000000000000": "Texas Instruments Over-the-Air Download (OAD) Service", + "0fda92b2-44a2-4af2-84f5-fa682baa2b8d": "Helium Hotspot Custom Service", + "54220000-f6a5-4007-a371-722f4ebd8436": "Memfault Diagnostic Service", + "0000fd0d-0000-1000-8000-00805f9b34fb": "Blecon Advertising Service", +} \ No newline at end of file diff --git a/network/make_ble.py b/network/make_ble.py new file mode 100755 index 00000000..f4aa2253 --- /dev/null +++ b/network/make_ble.py @@ -0,0 +1,73 @@ +#!/usr/bin/env /usr/bin/python3 +import os +import json + +# https://github.com/NordicSemiconductor/bluetooth-numbers-database + +companies_source = "bluetooth-numbers-database/v1/company_ids.json" +companies_file = "network/ble_companies.go" +companies_template = """package network + +var BLE_Companies = map[uint16]string{ + MAPPING +}""" + +with open(companies_source, 'rt') as fp: + companies = json.load(fp) + +mapping = "" + +for comp in companies: + mapping += " %d: %s,\n" % (comp['code'], json.dumps(comp['name'])) + +with open(companies_file, "w+t") as fp: + fp.write(companies_template.replace("MAPPING", mapping.strip())) + + +def make_uuid(src): + if '-' in src: + return src + else: + # https://stackoverflow.com/questions/36212020/how-can-i-convert-a-bluetooth-16-bit-service-uuid-into-a-128-bit-uuid + return '0000%s-0000-1000-8000-00805f9b34fb' % src + + +services_source = "bluetooth-numbers-database/v1/service_uuids.json" +services_file = "network/ble_services.go" +services_template = """package network + +var BLE_Services = map[string]string{ + MAPPING +}""" + +with open(services_source, 'rt') as fp: + services = json.load(fp) + +mapping = "" + +for service in services: + uuid = make_uuid(service['uuid'].lower()) + mapping += " \"%s\": %s,\n" % (uuid, json.dumps(service['name'])) + +with open(services_file, "w+t") as fp: + fp.write(services_template.replace("MAPPING", mapping.strip())) + +chars_source = "bluetooth-numbers-database/v1/characteristic_uuids.json" +chars_file = "network/ble_characteristics.go" +chars_template = """package network + +var BLE_Characteristics = map[string]string{ + MAPPING +}""" + +with open(chars_source, 'rt') as fp: + chars = json.load(fp) + +mapping = "" + +for char in chars: + uuid = make_uuid(char['uuid'].lower()) + mapping += " \"%s\": %s,\n" % (uuid, json.dumps(char['name'])) + +with open(chars_file, "w+t") as fp: + fp.write(chars_template.replace("MAPPING", mapping.strip()))