mirror of
https://github.com/tailscale/tailscale.git
synced 2025-03-14 01:11:01 +00:00

This updates the syspolicy package to support multiple policy sources in the three policy scopes: user, profile, and device, and provides a merged resultant policy. A policy source is a syspolicy/source.Store that has a name and provides access to policy settings for a given scope. It can be registered with syspolicy/rsop.RegisterStore. Policy sources and policy stores can be either platform-specific or platform-agnostic. On Windows, we have the Registry-based, platform-specific policy store implemented as syspolicy/source.PlatformPolicyStore. This store provides access to the Group Policy and MDM policy settings stored in the Registry. On other platforms, we currently provide a wrapper that converts a syspolicy.Handler into a syspolicy/source.Store. However, we should update them in follow-up PRs. An example of a platform-agnostic policy store would be a policy deployed from the control, a local policy config file, or even environment variables. We maintain the current, most recent version of the resultant policy for each scope in an rsop.Policy. This is done by reading and merging the policy settings from the registered stores the first time the resultant policy is requested, then re-reading and re-merging them if a store implements the source.Changeable interface and reports a policy change. Policy change notifications are debounced to avoid re-reading policy settings multiple times if there are several changes within a short period. The rsop.Policy can notify clients if the resultant policy has changed. However, we do not currently expose this via the syspolicy package and plan to do so differently along with a struct-based policy hierarchy in the next PR. To facilitate this, all policy settings should be registered with the setting.Register function. The syspolicy package does this automatically for all policy settings defined in policy_keys.go. The new functionality is available through the existing syspolicy.Read* set of functions. However, we plan to expose it via a struct-based policy hierarchy, along with policy change notifications that other subsystems can use, in the next PR. We also plan to send the resultant policy back from tailscaled to the clients via the LocalAPI. This is primarily a foundational PR to facilitate future changes, but the immediate observable changes on Windows include: - The service will use the current policy setting values instead of those read at OS boot time. - The GUI has access to policy settings configured on a per-user basis. On Android: - We now report policy setting usage via clientmetrics. Updates #12687 Signed-off-by: Nick Khyl <nickk@tailscale.com>
310 lines
30 KiB
Plaintext
310 lines
30 KiB
Plaintext
tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depaware)
|
|
|
|
filippo.io/edwards25519 from github.com/hdevalence/ed25519consensus
|
|
filippo.io/edwards25519/field from filippo.io/edwards25519
|
|
W 💣 github.com/alexbrainman/sspi from github.com/alexbrainman/sspi/internal/common+
|
|
W github.com/alexbrainman/sspi/internal/common from github.com/alexbrainman/sspi/negotiate
|
|
W 💣 github.com/alexbrainman/sspi/negotiate from tailscale.com/net/tshttpproxy
|
|
github.com/beorn7/perks/quantile from github.com/prometheus/client_golang/prometheus
|
|
💣 github.com/cespare/xxhash/v2 from github.com/prometheus/client_golang/prometheus
|
|
L github.com/coreos/go-iptables/iptables from tailscale.com/util/linuxfw
|
|
W 💣 github.com/dblohm7/wingoes from tailscale.com/util/winutil
|
|
github.com/fxamacker/cbor/v2 from tailscale.com/tka
|
|
github.com/go-json-experiment/json from tailscale.com/types/opt+
|
|
github.com/go-json-experiment/json/internal from github.com/go-json-experiment/json+
|
|
github.com/go-json-experiment/json/internal/jsonflags from github.com/go-json-experiment/json+
|
|
github.com/go-json-experiment/json/internal/jsonopts from github.com/go-json-experiment/json+
|
|
github.com/go-json-experiment/json/internal/jsonwire from github.com/go-json-experiment/json+
|
|
github.com/go-json-experiment/json/jsontext from github.com/go-json-experiment/json+
|
|
github.com/golang/groupcache/lru from tailscale.com/net/dnscache
|
|
L github.com/google/nftables from tailscale.com/util/linuxfw
|
|
L 💣 github.com/google/nftables/alignedbuff from github.com/google/nftables/xt
|
|
L 💣 github.com/google/nftables/binaryutil from github.com/google/nftables+
|
|
L github.com/google/nftables/expr from github.com/google/nftables+
|
|
L github.com/google/nftables/internal/parseexprfunc from github.com/google/nftables+
|
|
L github.com/google/nftables/xt from github.com/google/nftables/expr+
|
|
github.com/google/uuid from tailscale.com/util/fastuuid
|
|
github.com/hdevalence/ed25519consensus from tailscale.com/tka
|
|
L github.com/josharian/native from github.com/mdlayher/netlink+
|
|
L 💣 github.com/jsimonetti/rtnetlink from tailscale.com/net/netmon
|
|
L github.com/jsimonetti/rtnetlink/internal/unix from github.com/jsimonetti/rtnetlink
|
|
L 💣 github.com/mdlayher/netlink from github.com/google/nftables+
|
|
L 💣 github.com/mdlayher/netlink/nlenc from github.com/jsimonetti/rtnetlink+
|
|
L github.com/mdlayher/netlink/nltest from github.com/google/nftables
|
|
L 💣 github.com/mdlayher/socket from github.com/mdlayher/netlink
|
|
💣 github.com/mitchellh/go-ps from tailscale.com/safesocket
|
|
💣 github.com/prometheus/client_golang/prometheus from tailscale.com/tsweb/promvarz
|
|
github.com/prometheus/client_golang/prometheus/internal from github.com/prometheus/client_golang/prometheus
|
|
github.com/prometheus/client_model/go from github.com/prometheus/client_golang/prometheus+
|
|
github.com/prometheus/common/expfmt from github.com/prometheus/client_golang/prometheus+
|
|
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg from github.com/prometheus/common/expfmt
|
|
github.com/prometheus/common/model from github.com/prometheus/client_golang/prometheus+
|
|
LD github.com/prometheus/procfs from github.com/prometheus/client_golang/prometheus
|
|
LD github.com/prometheus/procfs/internal/fs from github.com/prometheus/procfs
|
|
LD github.com/prometheus/procfs/internal/util from github.com/prometheus/procfs
|
|
W 💣 github.com/tailscale/go-winio from tailscale.com/safesocket
|
|
W 💣 github.com/tailscale/go-winio/internal/fs from github.com/tailscale/go-winio
|
|
W 💣 github.com/tailscale/go-winio/internal/socket from github.com/tailscale/go-winio
|
|
W github.com/tailscale/go-winio/internal/stringbuffer from github.com/tailscale/go-winio/internal/fs
|
|
W github.com/tailscale/go-winio/pkg/guid from github.com/tailscale/go-winio+
|
|
L 💣 github.com/tailscale/netlink from tailscale.com/util/linuxfw
|
|
L 💣 github.com/vishvananda/netlink/nl from github.com/tailscale/netlink
|
|
L github.com/vishvananda/netns from github.com/tailscale/netlink+
|
|
github.com/x448/float16 from github.com/fxamacker/cbor/v2
|
|
💣 go4.org/mem from tailscale.com/client/tailscale+
|
|
go4.org/netipx from tailscale.com/net/tsaddr
|
|
W 💣 golang.zx2c4.com/wireguard/windows/tunnel/winipcfg from tailscale.com/net/netmon+
|
|
google.golang.org/protobuf/encoding/protodelim from github.com/prometheus/common/expfmt
|
|
google.golang.org/protobuf/encoding/prototext from github.com/prometheus/common/expfmt+
|
|
google.golang.org/protobuf/encoding/protowire from google.golang.org/protobuf/encoding/protodelim+
|
|
google.golang.org/protobuf/internal/descfmt from google.golang.org/protobuf/internal/filedesc
|
|
google.golang.org/protobuf/internal/descopts from google.golang.org/protobuf/internal/filedesc+
|
|
google.golang.org/protobuf/internal/detrand from google.golang.org/protobuf/internal/descfmt+
|
|
google.golang.org/protobuf/internal/editiondefaults from google.golang.org/protobuf/internal/filedesc
|
|
google.golang.org/protobuf/internal/encoding/defval from google.golang.org/protobuf/internal/encoding/tag+
|
|
google.golang.org/protobuf/internal/encoding/messageset from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/encoding/tag from google.golang.org/protobuf/internal/impl
|
|
google.golang.org/protobuf/internal/encoding/text from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/errors from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/filedesc from google.golang.org/protobuf/internal/encoding/tag+
|
|
google.golang.org/protobuf/internal/filetype from google.golang.org/protobuf/runtime/protoimpl
|
|
google.golang.org/protobuf/internal/flags from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/genid from google.golang.org/protobuf/encoding/prototext+
|
|
💣 google.golang.org/protobuf/internal/impl from google.golang.org/protobuf/internal/filetype+
|
|
google.golang.org/protobuf/internal/order from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/pragma from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/set from google.golang.org/protobuf/encoding/prototext
|
|
💣 google.golang.org/protobuf/internal/strs from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/internal/version from google.golang.org/protobuf/runtime/protoimpl
|
|
google.golang.org/protobuf/proto from github.com/prometheus/client_golang/prometheus+
|
|
💣 google.golang.org/protobuf/reflect/protoreflect from github.com/prometheus/client_model/go+
|
|
google.golang.org/protobuf/reflect/protoregistry from google.golang.org/protobuf/encoding/prototext+
|
|
google.golang.org/protobuf/runtime/protoiface from google.golang.org/protobuf/internal/impl+
|
|
google.golang.org/protobuf/runtime/protoimpl from github.com/prometheus/client_model/go+
|
|
google.golang.org/protobuf/types/known/timestamppb from github.com/prometheus/client_golang/prometheus+
|
|
nhooyr.io/websocket from tailscale.com/cmd/derper+
|
|
nhooyr.io/websocket/internal/errd from nhooyr.io/websocket
|
|
nhooyr.io/websocket/internal/util from nhooyr.io/websocket
|
|
nhooyr.io/websocket/internal/xsync from nhooyr.io/websocket
|
|
tailscale.com from tailscale.com/version
|
|
tailscale.com/atomicfile from tailscale.com/cmd/derper+
|
|
tailscale.com/client/tailscale from tailscale.com/derp
|
|
tailscale.com/client/tailscale/apitype from tailscale.com/client/tailscale
|
|
tailscale.com/derp from tailscale.com/cmd/derper+
|
|
tailscale.com/derp/derphttp from tailscale.com/cmd/derper
|
|
tailscale.com/disco from tailscale.com/derp
|
|
tailscale.com/drive from tailscale.com/client/tailscale+
|
|
tailscale.com/envknob from tailscale.com/client/tailscale+
|
|
tailscale.com/health from tailscale.com/net/tlsdial+
|
|
tailscale.com/hostinfo from tailscale.com/net/netmon+
|
|
tailscale.com/ipn from tailscale.com/client/tailscale
|
|
tailscale.com/ipn/ipnstate from tailscale.com/client/tailscale+
|
|
tailscale.com/metrics from tailscale.com/cmd/derper+
|
|
tailscale.com/net/dnscache from tailscale.com/derp/derphttp
|
|
tailscale.com/net/ktimeout from tailscale.com/cmd/derper
|
|
tailscale.com/net/netaddr from tailscale.com/ipn+
|
|
tailscale.com/net/netknob from tailscale.com/net/netns
|
|
💣 tailscale.com/net/netmon from tailscale.com/derp/derphttp+
|
|
💣 tailscale.com/net/netns from tailscale.com/derp/derphttp
|
|
tailscale.com/net/netutil from tailscale.com/client/tailscale
|
|
tailscale.com/net/sockstats from tailscale.com/derp/derphttp
|
|
tailscale.com/net/stun from tailscale.com/net/stunserver
|
|
tailscale.com/net/stunserver from tailscale.com/cmd/derper
|
|
L tailscale.com/net/tcpinfo from tailscale.com/derp
|
|
tailscale.com/net/tlsdial from tailscale.com/derp/derphttp
|
|
tailscale.com/net/tsaddr from tailscale.com/ipn+
|
|
💣 tailscale.com/net/tshttpproxy from tailscale.com/derp/derphttp+
|
|
tailscale.com/net/wsconn from tailscale.com/cmd/derper+
|
|
tailscale.com/paths from tailscale.com/client/tailscale
|
|
💣 tailscale.com/safesocket from tailscale.com/client/tailscale
|
|
tailscale.com/syncs from tailscale.com/cmd/derper+
|
|
tailscale.com/tailcfg from tailscale.com/client/tailscale+
|
|
tailscale.com/tka from tailscale.com/client/tailscale+
|
|
W tailscale.com/tsconst from tailscale.com/net/netmon+
|
|
tailscale.com/tstime from tailscale.com/derp+
|
|
tailscale.com/tstime/mono from tailscale.com/tstime/rate
|
|
tailscale.com/tstime/rate from tailscale.com/derp
|
|
tailscale.com/tsweb from tailscale.com/cmd/derper
|
|
tailscale.com/tsweb/promvarz from tailscale.com/tsweb
|
|
tailscale.com/tsweb/varz from tailscale.com/tsweb+
|
|
tailscale.com/types/dnstype from tailscale.com/tailcfg
|
|
tailscale.com/types/empty from tailscale.com/ipn
|
|
tailscale.com/types/ipproto from tailscale.com/tailcfg+
|
|
tailscale.com/types/key from tailscale.com/client/tailscale+
|
|
tailscale.com/types/lazy from tailscale.com/version+
|
|
tailscale.com/types/logger from tailscale.com/cmd/derper+
|
|
tailscale.com/types/netmap from tailscale.com/ipn
|
|
tailscale.com/types/opt from tailscale.com/client/tailscale+
|
|
tailscale.com/types/persist from tailscale.com/ipn
|
|
tailscale.com/types/preftype from tailscale.com/ipn
|
|
tailscale.com/types/ptr from tailscale.com/hostinfo+
|
|
tailscale.com/types/structs from tailscale.com/ipn+
|
|
tailscale.com/types/tkatype from tailscale.com/client/tailscale+
|
|
tailscale.com/types/views from tailscale.com/ipn+
|
|
tailscale.com/util/cibuild from tailscale.com/health
|
|
tailscale.com/util/clientmetric from tailscale.com/net/netmon+
|
|
tailscale.com/util/cloudenv from tailscale.com/hostinfo+
|
|
W tailscale.com/util/cmpver from tailscale.com/net/tshttpproxy
|
|
tailscale.com/util/ctxkey from tailscale.com/tsweb+
|
|
💣 tailscale.com/util/deephash from tailscale.com/util/syspolicy/setting
|
|
L 💣 tailscale.com/util/dirwalk from tailscale.com/metrics
|
|
tailscale.com/util/dnsname from tailscale.com/hostinfo+
|
|
tailscale.com/util/fastuuid from tailscale.com/tsweb
|
|
💣 tailscale.com/util/hashx from tailscale.com/util/deephash
|
|
tailscale.com/util/httpm from tailscale.com/client/tailscale
|
|
tailscale.com/util/lineread from tailscale.com/hostinfo+
|
|
L tailscale.com/util/linuxfw from tailscale.com/net/netns
|
|
tailscale.com/util/mak from tailscale.com/health+
|
|
tailscale.com/util/multierr from tailscale.com/health+
|
|
tailscale.com/util/nocasemaps from tailscale.com/types/ipproto
|
|
tailscale.com/util/set from tailscale.com/derp+
|
|
tailscale.com/util/singleflight from tailscale.com/net/dnscache
|
|
tailscale.com/util/slicesx from tailscale.com/cmd/derper+
|
|
tailscale.com/util/syspolicy from tailscale.com/ipn
|
|
tailscale.com/util/syspolicy/internal from tailscale.com/util/syspolicy+
|
|
tailscale.com/util/syspolicy/internal/lazyinit from tailscale.com/util/syspolicy+
|
|
tailscale.com/util/syspolicy/internal/loggerx from tailscale.com/util/syspolicy/internal/metrics+
|
|
tailscale.com/util/syspolicy/internal/metrics from tailscale.com/util/syspolicy/source
|
|
tailscale.com/util/syspolicy/rsop from tailscale.com/util/syspolicy
|
|
tailscale.com/util/syspolicy/setting from tailscale.com/util/syspolicy+
|
|
tailscale.com/util/syspolicy/source from tailscale.com/util/syspolicy+
|
|
tailscale.com/util/testenv from tailscale.com/util/syspolicy+
|
|
tailscale.com/util/vizerror from tailscale.com/tailcfg+
|
|
W 💣 tailscale.com/util/winutil from tailscale.com/hostinfo+
|
|
W 💣 tailscale.com/util/winutil/gp from tailscale.com/util/syspolicy/source
|
|
W 💣 tailscale.com/util/winutil/winenv from tailscale.com/hostinfo+
|
|
tailscale.com/version from tailscale.com/derp+
|
|
tailscale.com/version/distro from tailscale.com/envknob+
|
|
tailscale.com/wgengine/filter/filtertype from tailscale.com/types/netmap
|
|
golang.org/x/crypto/acme from golang.org/x/crypto/acme/autocert
|
|
golang.org/x/crypto/acme/autocert from tailscale.com/cmd/derper
|
|
golang.org/x/crypto/argon2 from tailscale.com/tka
|
|
golang.org/x/crypto/blake2b from golang.org/x/crypto/argon2+
|
|
golang.org/x/crypto/blake2s from tailscale.com/tka
|
|
golang.org/x/crypto/chacha20 from golang.org/x/crypto/chacha20poly1305
|
|
golang.org/x/crypto/chacha20poly1305 from crypto/tls
|
|
golang.org/x/crypto/cryptobyte from crypto/ecdsa+
|
|
golang.org/x/crypto/cryptobyte/asn1 from crypto/ecdsa+
|
|
golang.org/x/crypto/curve25519 from golang.org/x/crypto/nacl/box+
|
|
golang.org/x/crypto/hkdf from crypto/tls
|
|
golang.org/x/crypto/nacl/box from tailscale.com/types/key
|
|
golang.org/x/crypto/nacl/secretbox from golang.org/x/crypto/nacl/box
|
|
golang.org/x/crypto/salsa20/salsa from golang.org/x/crypto/nacl/box+
|
|
W golang.org/x/exp/constraints from tailscale.com/util/winutil
|
|
golang.org/x/exp/maps from tailscale.com/util/syspolicy/internal/metrics+
|
|
L golang.org/x/net/bpf from github.com/mdlayher/netlink+
|
|
golang.org/x/net/dns/dnsmessage from net+
|
|
golang.org/x/net/http/httpguts from net/http
|
|
golang.org/x/net/http/httpproxy from net/http+
|
|
golang.org/x/net/http2/hpack from net/http
|
|
golang.org/x/net/idna from golang.org/x/crypto/acme/autocert+
|
|
golang.org/x/net/proxy from tailscale.com/net/netns
|
|
D golang.org/x/net/route from net+
|
|
golang.org/x/sync/errgroup from github.com/mdlayher/socket+
|
|
golang.org/x/sys/cpu from github.com/josharian/native+
|
|
LD golang.org/x/sys/unix from github.com/google/nftables+
|
|
W golang.org/x/sys/windows from github.com/dblohm7/wingoes+
|
|
W golang.org/x/sys/windows/registry from github.com/dblohm7/wingoes+
|
|
W golang.org/x/sys/windows/svc from golang.org/x/sys/windows/svc/mgr+
|
|
W golang.org/x/sys/windows/svc/mgr from tailscale.com/util/winutil
|
|
golang.org/x/text/secure/bidirule from golang.org/x/net/idna
|
|
golang.org/x/text/transform from golang.org/x/text/secure/bidirule+
|
|
golang.org/x/text/unicode/bidi from golang.org/x/net/idna+
|
|
golang.org/x/text/unicode/norm from golang.org/x/net/idna
|
|
golang.org/x/time/rate from tailscale.com/cmd/derper+
|
|
bufio from compress/flate+
|
|
bytes from bufio+
|
|
cmp from slices+
|
|
compress/flate from compress/gzip+
|
|
compress/gzip from google.golang.org/protobuf/internal/impl+
|
|
container/list from crypto/tls+
|
|
context from crypto/tls+
|
|
crypto from crypto/ecdh+
|
|
crypto/aes from crypto/ecdsa+
|
|
crypto/cipher from crypto/aes+
|
|
crypto/des from crypto/tls+
|
|
crypto/dsa from crypto/x509
|
|
crypto/ecdh from crypto/ecdsa+
|
|
crypto/ecdsa from crypto/tls+
|
|
crypto/ed25519 from crypto/tls+
|
|
crypto/elliptic from crypto/ecdsa+
|
|
crypto/hmac from crypto/tls+
|
|
crypto/md5 from crypto/tls+
|
|
crypto/rand from crypto/ed25519+
|
|
crypto/rc4 from crypto/tls
|
|
crypto/rsa from crypto/tls+
|
|
crypto/sha1 from crypto/tls+
|
|
crypto/sha256 from crypto/tls+
|
|
crypto/sha512 from crypto/ecdsa+
|
|
crypto/subtle from crypto/aes+
|
|
crypto/tls from golang.org/x/crypto/acme+
|
|
crypto/x509 from crypto/tls+
|
|
crypto/x509/pkix from crypto/x509+
|
|
database/sql/driver from github.com/google/uuid
|
|
embed from crypto/internal/nistec+
|
|
encoding from encoding/json+
|
|
encoding/asn1 from crypto/x509+
|
|
encoding/base32 from github.com/fxamacker/cbor/v2+
|
|
encoding/base64 from encoding/json+
|
|
encoding/binary from compress/gzip+
|
|
encoding/hex from crypto/x509+
|
|
encoding/json from expvar+
|
|
encoding/pem from crypto/tls+
|
|
errors from bufio+
|
|
expvar from github.com/prometheus/client_golang/prometheus+
|
|
flag from tailscale.com/cmd/derper+
|
|
fmt from compress/flate+
|
|
go/token from google.golang.org/protobuf/internal/strs
|
|
hash from crypto+
|
|
hash/crc32 from compress/gzip+
|
|
hash/fnv from google.golang.org/protobuf/internal/detrand
|
|
hash/maphash from go4.org/mem
|
|
html from net/http/pprof+
|
|
io from bufio+
|
|
io/fs from crypto/x509+
|
|
io/ioutil from github.com/mitchellh/go-ps+
|
|
log from expvar+
|
|
log/internal from log
|
|
maps from tailscale.com/ipn+
|
|
math from compress/flate+
|
|
math/big from crypto/dsa+
|
|
math/bits from compress/flate+
|
|
math/rand from github.com/mdlayher/netlink+
|
|
math/rand/v2 from tailscale.com/util/fastuuid+
|
|
mime from github.com/prometheus/common/expfmt+
|
|
mime/multipart from net/http
|
|
mime/quotedprintable from mime/multipart
|
|
net from crypto/tls+
|
|
net/http from expvar+
|
|
net/http/httptrace from net/http+
|
|
net/http/internal from net/http
|
|
net/http/pprof from tailscale.com/tsweb+
|
|
net/netip from go4.org/netipx+
|
|
net/textproto from golang.org/x/net/http/httpguts+
|
|
net/url from crypto/x509+
|
|
os from crypto/rand+
|
|
os/exec from github.com/coreos/go-iptables/iptables+
|
|
os/signal from tailscale.com/cmd/derper
|
|
W os/user from tailscale.com/util/winutil+
|
|
path from github.com/prometheus/client_golang/prometheus/internal+
|
|
path/filepath from crypto/x509+
|
|
reflect from crypto/x509+
|
|
regexp from github.com/coreos/go-iptables/iptables+
|
|
regexp/syntax from regexp
|
|
runtime/debug from github.com/prometheus/client_golang/prometheus+
|
|
runtime/metrics from github.com/prometheus/client_golang/prometheus+
|
|
runtime/pprof from net/http/pprof
|
|
runtime/trace from net/http/pprof
|
|
slices from tailscale.com/ipn/ipnstate+
|
|
sort from compress/flate+
|
|
strconv from compress/flate+
|
|
strings from bufio+
|
|
sync from compress/flate+
|
|
sync/atomic from context+
|
|
syscall from crypto/rand+
|
|
text/tabwriter from runtime/pprof
|
|
time from compress/gzip+
|
|
unicode from bytes+
|
|
unicode/utf16 from crypto/x509+
|
|
unicode/utf8 from bufio+
|