code: func ShadowUDPListener(addr string, cipher *url.Userinfo, ttl time.Duration) (Listener, error) {
  	laddr, err := net.ResolveUDPAddr("udp", addr)
  	if err != nil {
  		return nil, err
  	}
  	ln, err := net.ListenUDP("udp", laddr)
  	if err != nil {
  		return nil, err
  	}
  
  	var method, password string
  	if cipher != nil {
  		method = cipher.Username()
  		password, _ = cipher.Password()
  	}
  	cp, err := ss.NewCipher(method, password)
  	if err != nil {
  		ln.Close()
  		return nil, err
  	}
  	l := &shadowUDPListener{
  		ln:       ss.NewSecurePacketConn(ln, cp, false),
  		conns:    make(map[string]*udpServerConn),
  		connChan: make(chan net.Conn, 1024),
  		errChan:  make(chan error, 1),
  		ttl:      ttl,
  	}
  	go l.listenLoop()
  	return l, nil
  }
docs: // ShadowUDPListener creates a Listener for shadowsocks UDP relay server.