Переглянути джерело

Merge remote-tracking branch 'origin/master'

WH01243 2 роки тому
батько
коміт
e20a163a0f

+ 6 - 6
common/src/qfw/util/dataexport/dataexport.go

@@ -530,7 +530,7 @@ func GetDataExportSearchCountBySieveCondition(scd *SieveCondition, elasticAddres
 			}
 			if searchTextSize > 0 {
 				if secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress); secondKWS != "" {
-					scd.Keyword[0].Keyword = secondKWS
+					scd.Keyword[0].Keyword = jy.KeywordsProcessing(secondKWS, " ")
 				}
 			}
 			// 附加词分词
@@ -541,7 +541,7 @@ func GetDataExportSearchCountBySieveCondition(scd *SieveCondition, elasticAddres
 				}
 				if appendTextSize > 0 {
 					if secondKWS := jy.HttpEs(scd.Keyword[0].Appended[i], "ik_smart", elasticAddress); secondKWS != "" {
-						scd.Keyword[0].Appended[i] = secondKWS
+						scd.Keyword[0].Appended[i] = jy.KeywordsProcessing(secondKWS, " ")
 					}
 				}
 			}
@@ -768,7 +768,7 @@ func GetDataExportIds(elasticAddress string, scd *SieveCondition, checkCount int
 			}
 			if searchTextSize > 0 {
 				if secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress); secondKWS != "" {
-					scd.Keyword[0].Keyword = secondKWS
+					scd.Keyword[0].Keyword = jy.KeywordsProcessing(secondKWS, " ")
 				}
 			}
 			// 附加词分词
@@ -779,7 +779,7 @@ func GetDataExportIds(elasticAddress string, scd *SieveCondition, checkCount int
 				}
 				if appendTextSize > 0 {
 					if secondKWS := jy.HttpEs(scd.Keyword[0].Appended[i], "ik_smart", elasticAddress); secondKWS != "" {
-						scd.Keyword[0].Appended[i] = secondKWS
+						scd.Keyword[0].Appended[i] = jy.KeywordsProcessing(secondKWS, " ")
 					}
 				}
 			}
@@ -838,7 +838,7 @@ func GetDataExportSearchResult(bid mg.MongodbSim, bidMgoDBName, elasticAddress s
 			}
 			if searchTextSize > 0 {
 				if secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress); secondKWS != "" {
-					scd.Keyword[0].Keyword = secondKWS
+					scd.Keyword[0].Keyword = jy.KeywordsProcessing(secondKWS, " ")
 				}
 			}
 			// 附加词分词
@@ -849,7 +849,7 @@ func GetDataExportSearchResult(bid mg.MongodbSim, bidMgoDBName, elasticAddress s
 				}
 				if appendTextSize > 0 {
 					if secondKWS := jy.HttpEs(scd.Keyword[0].Appended[i], "ik_smart", elasticAddress); secondKWS != "" {
-						scd.Keyword[0].Appended[i] = secondKWS
+						scd.Keyword[0].Appended[i] = jy.KeywordsProcessing(secondKWS, " ")
 					}
 				}
 			}

+ 65 - 32
common/src/qfw/util/jy/jy.go

@@ -1,14 +1,6 @@
 package jy
 
 import (
-	"encoding/json"
-	"fmt"
-	"log"
-	"regexp"
-	"sort"
-	"strings"
-	"time"
-
 	util "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/es"
@@ -20,9 +12,16 @@ import (
 	"app.yhyue.com/moapp/jybase/sms"
 	. "app.yhyue.com/moapp/jypkg/middleground"
 	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	"encoding/json"
+	"fmt"
+	"log"
+	"regexp"
+	"sort"
+	"strings"
+	"time"
 )
 
-//获取用户合并以前,合并以后的openid
+// 获取用户合并以前,合并以后的openid
 func GetOldOpenid(s_m_openid, a_m_openid, s_phone string, mergeorder interface{}) string {
 	a_mergeorder, _ := mergeorder.([]interface{})
 	openid := ""
@@ -55,19 +54,20 @@ var filterReg_1 = regexp.MustCompile("^([0-9]{1,3}|[零一二三四五六七八
 var filterReg = regexp.MustCompile("^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$")
 var PhoneReg = regexp.MustCompile("^[1][3-9][0-9]{9}$")
 var EmailPattern = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
+var filterReg_4 = regexp.MustCompile("([)>》】\\]\\}}〕。,,;;::'\"“”。\\.\\??、/\\+=\\\\_—\\*&……\\^%$¥@!!`~·(\\(<《【\\[\\{{〔])")
 
-//P279删除通用过滤词,例如“公告”
+// P279删除通用过滤词,例如“公告”
 func FilteKey(k string) string {
 	k = strings.TrimSpace(k)
 	// k = filterReg_3.ReplaceAllString(k, "")
-	k = filterReg_2.ReplaceAllString(k, "")
+	k = filterReg_4.ReplaceAllString(k, " ")
 	// k = filterReg_1.ReplaceAllString(k, "")
 	// k = filterReg.ReplaceAllString(k, "")
 	return k
 }
 
 // InterceptSearchKW 超过20个字,截断
-//返回截取后的字符串和截取掉中的前3个字
+// 返回截取后的字符串和截取掉中的前3个字
 func InterceptSearchKW(word string, keywordsLimit int, isFilter bool) (b_word, a_word, s_word string) {
 	if word == "" {
 		return
@@ -97,7 +97,7 @@ func HttpEs(ques, analyzer, esAddress string) string {
 	return es.Analyze(ques, "bidding", analyzer)
 }
 
-//发送邮箱验证码
+// 发送邮箱验证码
 func SendMailIdentCode(to, code string, auth []*mail.GmailAuth) bool {
 	html := fmt.Sprintf(`<div>
 		<div>
@@ -133,13 +133,12 @@ func SendMailIdentCode(to, code string, auth []*mail.GmailAuth) bool {
 	return false
 }
 
-//
 func SendSMS(address, mobile string, params ...string) {
 	sms.SendSms(address, "01", mobile, params...)
 }
 
-//发送验证码
-//增加sessionKey字段 更换手机号防止绕过身份校验
+// 发送验证码
+// 增加sessionKey字段 更换手机号防止绕过身份校验
 func SendPhoneIdentCode(address, phone string, session *httpsession.Session, sessionKey ...string) bool {
 	sessionKeyFlag := defaultPhoneFlag
 	if len(sessionKey) > 0 && sessionKey[0] != "" {
@@ -164,7 +163,7 @@ func SendPhoneIdentCode(address, phone string, session *httpsession.Session, ses
 
 const defaultPhoneFlag = "identCode"
 
-//短信验证码校验
+// 短信验证码校验
 func CheckPhoneIdent(session *httpsession.Session, code string, sessionKey ...string) string {
 	sessionKeyFlag := defaultPhoneFlag
 	if len(sessionKey) > 0 && sessionKey[0] != "" {
@@ -179,7 +178,7 @@ func CheckPhoneIdent(session *httpsession.Session, code string, sessionKey ...st
 	return ""
 }
 
-//删除短信验证码有关的session
+// 删除短信验证码有关的session
 func ClearPhoneIdentSession(session *httpsession.Session, sessionKey ...string) {
 	sessionKeyFlag := defaultPhoneFlag
 	if len(sessionKey) > 0 && sessionKey[0] != "" {
@@ -190,17 +189,17 @@ func ClearPhoneIdentSession(session *httpsession.Session, sessionKey ...string)
 	session.Del(fmt.Sprintf("%sTime", sessionKeyFlag))
 }
 
-//邮箱校验
+// 邮箱校验
 func IsEmail(value string) bool {
 	return EmailPattern.MatchString(value)
 }
 
-//手机号校验
+// 手机号校验
 func IsPhone(phone string) bool {
 	return PhoneReg.MatchString(phone)
 }
 
-//获取信息行业
+// 获取信息行业
 func Getindustrys(industryname string, mongodb MongodbSim) (industry map[string][]string, sortArray []string) {
 	industry = map[string][]string{}
 	sortArray = []string{}
@@ -243,8 +242,7 @@ func Getindustrys(industryname string, mongodb MongodbSim) (industry map[string]
 	return industry, sortArray
 }
 
-//对应月份
-//
+// 对应月份
 func GetMonth(mon string) int {
 	month := map[string]int{
 		"January":   1,
@@ -263,12 +261,12 @@ func GetMonth(mon string) int {
 	return month[mon]
 }
 
-//value unlimited 并发限制登陆用户
+// value unlimited 并发限制登陆用户
 func LoginRedisKey(userid string) string {
 	return fmt.Sprintf("unlimited_%s", userid)
 }
 
-//获取loginSess
+// 获取loginSess
 func GetLoginSess(userid string) []string {
 	key := LoginRedisKey(userid)
 	if data, ok := redis.Get("other", key).([]interface{}); ok {
@@ -277,7 +275,7 @@ func GetLoginSess(userid string) []string {
 	return []string{}
 }
 
-//判断是否在内
+// 判断是否在内
 func IsInLoginSess(key string, arr []string) bool {
 	for _, v := range arr {
 		if key == v {
@@ -298,7 +296,7 @@ type AppLoginPush struct {
 	PhoneType   string `json:"phoneType"`
 }
 
-//更新存储用户sessionid的队列 【sessionid ttl小于三天的清除】  key:sessionid
+// 更新存储用户sessionid的队列 【sessionid ttl小于三天的清除】  key:sessionid
 func PutLoginSess(mongodb MongodbSim, apppushRpc, key, userid string, limit, max int) bool {
 	value := GetLoginSess(userid)
 	if !IsInLoginSess(key, value) {
@@ -344,7 +342,7 @@ func PutLoginSess(mongodb MongodbSim, apppushRpc, key, userid string, limit, max
 	return redis.Put("other", LoginRedisKey(userid), value, -1)
 }
 
-//清除数组中的s
+// 清除数组中的s
 func removeArr(arr []string, s string) []string {
 	result := []string{}
 	for _, v := range arr {
@@ -356,7 +354,6 @@ func removeArr(arr []string, s string) []string {
 	return result
 }
 
-//
 func LoginOutPush(mongodb MongodbSim, userid, sessid, apppushRpc string) {
 	rediskey := fmt.Sprintf("app_%s", sessid)
 	r := redis.Get("other", rediskey)
@@ -393,7 +390,7 @@ func LoginOutPush(mongodb MongodbSim, userid, sessid, apppushRpc string) {
 	log.Println("ok:", ok)
 }
 
-//session数组清除某个value[针对多账号同时在线的方法、退出登录时调用]
+// session数组清除某个value[针对多账号同时在线的方法、退出登录时调用]
 func DelUnlimitSessionId(sessid, userid string) []string {
 	sessArr := GetLoginSess(userid)
 	newArr := []string{}
@@ -406,7 +403,7 @@ func DelUnlimitSessionId(sessid, userid string) []string {
 	return newArr
 }
 
-//获取当天结束时间 单位秒
+// 获取当天结束时间 单位秒
 func GetExpire() int {
 	t, _ := time.ParseInLocation(Date_Short_Layout, time.Now().AddDate(0, 0, 1).Format(Date_Short_Layout), time.Local)
 	t2, _ := time.ParseInLocation(Date_Full_Layout, time.Now().Format(Date_Full_Layout), time.Local)
@@ -420,10 +417,46 @@ func TimeProcessing(hour interface{}, duration int) time.Time {
 	return t
 }
 
-//清除用户权益缓存、菜单缓存
+// 清除用户权益缓存、菜单缓存
 func ClearUserCache(middleground *Middleground, positionId int64) {
 	middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
 		PositionId: fmt.Sprint(positionId),
 	})
 	middleground.PowerCheckCenter.DelCheckRedis("10000", positionId)
 }
+
+// 关键词分词处理
+func KeywordsProcessing(keywords, sep string) string {
+	keywords = MatchSpace.ReplaceAllString(keywords, " ")
+	if keywords == "" || len(strings.Split(keywords, sep)) == 1 {
+		return keywords
+	}
+	var newWords = make([]string, 0, 0)
+	if keywords != "" && len(strings.Split(keywords, sep)) > 1 {
+		var words = strings.Split(keywords, sep)
+		for k := 0; k < len(words); k++ {
+			v := words[k]
+			//连续性空格
+			if len([]rune(v)) == 0 {
+				continue
+			}
+			if len([]rune(v)) == 1 {
+				//compare
+				if k == 0 { //first
+					words[k+1] = v + words[k+1]
+				} else if k == len(words)-1 { //last
+					newWords[len(newWords)-1] += v
+				} else {
+					if len(newWords[len(newWords)-1]) < len(words[k+1]) {
+						newWords[len(newWords)-1] += v
+					} else {
+						words[k+1] = v + words[k+1]
+					}
+				}
+			} else {
+				newWords = append(newWords, v)
+			}
+		}
+	}
+	return strings.Join(newWords, sep)
+}

+ 105 - 0
common/src/qfw/util/jy/jySession.go

@@ -0,0 +1,105 @@
+package jy
+
+import (
+	qutil "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/identity"
+	"app.yhyue.com/moapp/jypkg/middleground"
+	"fmt"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"net/http"
+	"strings"
+	"time"
+)
+
+// JyAppCreateSession app登陆创建session公共方法
+// copy from app program
+func JyAppCreateSession(mdb mongodb.MongodbSim, s *httpsession.Session, loginId string, loginType int, rw http.ResponseWriter, isSwitchToBestIdentity bool, mgd *middleground.Middleground, appPushServiceRpc string, criticality int) bool {
+	if loginId == "" {
+		return false
+	}
+	query := map[string]interface{}{
+		"i_appid": 2,
+	}
+	switch loginType {
+	case 0: //_id登录
+		query["_id"], _ = primitive.ObjectIDFromHex(loginId)
+		break
+	case 1: //s_phone登录
+		query["s_phone"] = loginId
+		break
+	case 2: //a_m_openid登录
+		query["a_m_openid"] = loginId
+		break
+	case 3: //base_user_id登录
+		query["base_user_id"] = qutil.Int64All(loginId)
+		break
+	default:
+		return false
+	}
+	data, ok := mdb.FindOneByField("user", query, `{"s_m_openid":1,"s_phone":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"s_headimageurl":1,"s_phone":1,"s_nickname":1,"s_appversion":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1}`)
+	if !ok || data == nil || len(*data) == 0 {
+		return false
+	}
+	person := *data
+	sessVal := map[string]interface{}{}
+	sessVal["userId"] = mongodb.BsonIdToSId(person["_id"])
+	sessVal["mgoUserId"] = sessVal["userId"]
+	sessVal["s_jpushid"] = person["s_jpushid"]
+	sessVal["s_m_openid"] = person["s_m_openid"]
+	sessVal["s_opushid"] = person["s_opushid"]
+	sessVal["s_appponetype"] = person["s_appponetype"]
+	sessVal["s_appversion"] = person["s_appversion"]
+	sessVal["s_headimageurl"] = strings.Replace(qutil.ObjToString(person["s_headimageurl"]), "http://", "https://", 1)
+	sessVal["i_unlimited"] = qutil.IntAll(person["i_unlimited"])
+	sessVal["base_user_id"] = qutil.IntAll(person["base_user_id"])
+	if qutil.ObjToString(person["s_phone"]) != "" {
+		phone := person["s_phone"].(string)
+		sessVal["s_phone"] = phone
+		phone = string(phone[0:3]) + "****" + string(phone[len(phone)-4:])
+		sessVal["s_nickname"] = phone
+	}
+	if qutil.ObjToString(person["s_m_phone"]) != "" {
+		s_m_phone := person["s_m_phone"].(string)
+		sessVal["s_m_phone"] = s_m_phone
+	}
+	if qutil.ObjToString(person["s_nickname"]) != "" {
+		sessVal["app_name"] = person["s_nickname"]
+	}
+	// 剑鱼昵称
+	if qutil.ObjToString(person["s_jyname"]) != "" {
+		sessVal["s_jyname"] = person["s_jyname"]
+	}
+	s.SetMultiple(sessVal)
+	if isSwitchToBestIdentity && mgd != nil {
+		identity.SwitchToBest(qutil.Int64All(sessVal["base_user_id"]), s, mgd, &mdb, true)
+	}
+	//cookie
+	maxAge := int(time.Hour * 72 / time.Second) //3天,单位秒
+	expires := time.Now().Add(72 * time.Hour)
+	simpleuid := encrypt.SE.EncodeString(mongodb.BsonIdToSId(person["_id"]))
+	c := &http.Cookie{
+		Name:     "ud_safe",
+		Value:    simpleuid,
+		Path:     "/",
+		HttpOnly: false,
+		MaxAge:   maxAge,
+		Expires:  expires,
+	}
+	http.SetCookie(rw, c)
+	//多账号登陆用户
+	i_unlimited := qutil.IntAll(person["i_unlimited"])
+	if i_unlimited > 0 && appPushServiceRpc != "" {
+		uid := mongodb.BsonIdToSId(person["_id"])
+		PutLoginSess(mdb, appPushServiceRpc, fmt.Sprint(s.Id()), uid, criticality, i_unlimited)
+		redis.Put("other", fmt.Sprintf("app_%s", fmt.Sprint(s.Id())), &AppLoginPush{
+			JgPushId:    qutil.ObjToString(person["s_jpushid"]),
+			OtherPushId: qutil.ObjToString(person["s_opushid"]),
+			PhoneType:   qutil.ObjToString(person["s_appponetype"]),
+		}, 86400*30)
+	}
+	return true
+}

+ 159 - 0
common/src/qfw/util/jy/publicRegister.go

@@ -0,0 +1,159 @@
+package jy
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jypkg/middleground"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	"log"
+	"sync"
+	"time"
+)
+
+type RegisterStruct struct {
+	Mgo          *mongodb.MongodbSim
+	BaseService  *mysql.Mysql
+	MainMysql    *mysql.Mysql
+	Middleground *middleground.Middleground
+}
+
+type RegStruct struct {
+	MapR map[string]int64
+	Lock sync.Mutex
+}
+
+var (
+	RegLock = sync.Mutex{}
+	RegMap  = map[string]*RegStruct{}
+)
+
+func NewRegister(mgo *mongodb.MongodbSim, baseService, mainMysql *mysql.Mysql, middleground *middleground.Middleground) *RegisterStruct {
+	if middleground.UserCenter == nil {
+		log.Fatalln("NewRegister的时候,Middleground没有注册用户中台!")
+	}
+	return &RegisterStruct{
+		Mgo:          mgo,
+		BaseService:  baseService,
+		MainMysql:    mainMysql,
+		Middleground: middleground,
+	}
+}
+
+func (t *RegisterStruct) PublicRegister(phone, email, regsource string, data map[string]interface{}, afterFunc func(string)) (string, string) {
+	var (
+		saveSuccess bool
+		saveid      string
+	)
+	RegLock.Lock()
+	reg := RegMap[phone]
+	if reg == nil {
+		reg = &RegStruct{}
+		reg.Lock = sync.Mutex{}
+		reg.MapR = make(map[string]int64)
+		reg.MapR[phone] = time.Now().Unix()
+		RegMap[phone] = reg
+	}
+	RegLock.Unlock()
+	reg.Lock.Lock()
+	defer reg.Lock.Unlock()
+	if userId := t.userIsExists(phone); userId != "" { //用户已存在
+		return userId, "userExists"
+	}
+	//保存用户之前,先清理rid
+	//clearRidByRid(rid)
+
+	//注册邮箱
+	//email := l.GetString("email")
+	if IsEmail(email) {
+		data["s_email"] = email
+	}
+	//是否存在微信账户
+	if wxuid := t.findWxExistsId(phone); wxuid != nil {
+		saveSuccess = t.Mgo.Update("user", map[string]interface{}{"s_m_phone": phone}, map[string]interface{}{
+			"$set":   data,
+			"$unset": map[string]interface{}{"s_m_phone": ""},
+		}, false, false)
+		data["_id"] = wxuid
+		//用户中台同步
+		func(userid string) {
+			// ck, _ := l.GetCookie("SESSIONID")
+			// usercenter.UpdateBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), userid, ck)
+			if uinfo := GetInfoForBaseUser(*t.Mgo, userid); uinfo != nil {
+				UpdateUser(*t.Mgo, userid, *uinfo, *t.Middleground)
+			}
+		}(util.ObjToString(wxuid))
+	} else {
+		data["i_appid"] = 2
+		data["l_registedate"] = time.Now().Unix()
+		data["i_ts_guide"] = 2
+		data["o_jy"] = map[string]interface{}{
+			"i_apppush":    1,
+			"i_ratemode":   2,
+			"l_modifydate": time.Now().Unix(),
+		}
+		data["s_regsource"] = regsource //
+		data["s_platform"] = "app"
+		saveid = t.Mgo.Save("user", data)
+		saveSuccess = saveid != ""
+	}
+	if saveSuccess {
+		if saveid != "" {
+			//用户中台同步
+			func(userid string) {
+				// formdata := map[string]interface{}{
+				// 	"appid":    "10000",
+				// 	"phone":    phone,
+				// 	"password": qutil.GetMd5String(password),
+				// 	"company":  s_entname,
+				// }
+				// ck, _ := l.GetCookie("SESSIONID")
+				// usercenter.AddBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), userid, formdata, ck)
+				if ok := AddUser(*t.Mgo, userid, pb.UserAddReq{
+					Appid:    "10000",
+					Phone:    phone,
+					Password: "",
+					Company:  util.InterfaceToStr(data["s_company"]),
+				}, *t.Middleground); !ok {
+					log.Println("usercenter add error", userid, phone)
+				}
+			}(saveid)
+			baseId, ok := t.Mgo.FindById("user", saveid, `{"base_user_id":1}`)
+			if ok && baseId != nil && len(*baseId) > 0 {
+				data["base_user_id"] = (*baseId)["base_user_id"]
+			}
+			if afterFunc != nil {
+				afterFunc(saveid)
+			}
+		}
+		return saveid, "y"
+	} else {
+		return saveid, "saveError"
+	}
+}
+
+// 手机号用户是否存在
+func (t *RegisterStruct) userIsExists(phone string) string {
+	query := map[string]interface{}{
+		"s_phone": phone,
+		"i_appid": 2,
+	}
+	user, ok := t.Mgo.FindOne("user", query)
+	if ok && user != nil && len(*user) > 0 {
+		return util.InterfaceToStr((*user)["_id"])
+	}
+	return ""
+}
+
+// 是否存在微信手机号账户
+func (t *RegisterStruct) findWxExistsId(phoneNum string) interface{} {
+	query := map[string]interface{}{
+		"s_m_phone": phoneNum,
+		"i_appid":   2,
+	}
+	res, _ := t.Mgo.FindOneByField("user", query, `{"_id":1}`)
+	if res != nil && len(*res) > 0 {
+		return (*res)["_id"]
+	}
+	return nil
+}

+ 20 - 20
go.mod

@@ -21,7 +21,7 @@ require (
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
-	github.com/cenkalti/backoff/v4 v4.1.3 // indirect
+	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
@@ -31,7 +31,7 @@ require (
 	github.com/fatih/color v1.13.0 // indirect
 	github.com/felixge/fgprof v0.9.3 // indirect
 	github.com/garyburd/redigo v1.6.2 // indirect
-	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
@@ -50,7 +50,7 @@ require (
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/klauspost/compress v1.15.11 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-colorable v0.1.9 // indirect
 	github.com/mattn/go-isatty v0.0.14 // indirect
@@ -60,7 +60,7 @@ require (
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
-	github.com/openzipkin/zipkin-go v0.4.0 // indirect
+	github.com/openzipkin/zipkin-go v0.4.1 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.13.0 // indirect
@@ -76,32 +76,32 @@ require (
 	go.etcd.io/etcd/api/v3 v3.5.5 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.5 // indirect
-	go.opentelemetry.io/otel v1.11.0 // indirect
-	go.opentelemetry.io/otel/exporters/jaeger v1.11.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.10.0 // indirect
-	go.opentelemetry.io/otel/exporters/zipkin v1.11.0 // indirect
-	go.opentelemetry.io/otel/sdk v1.11.0 // indirect
-	go.opentelemetry.io/otel/trace v1.11.0 // indirect
+	go.opentelemetry.io/otel v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
+	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
+	go.opentelemetry.io/otel/trace v1.15.1 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
 	go.uber.org/atomic v1.9.0 // indirect
 	go.uber.org/automaxprocs v1.5.1 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
-	golang.org/x/net v0.5.0 // indirect
+	golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect
+	golang.org/x/net v0.8.0 // indirect
 	golang.org/x/oauth2 v0.4.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.4.0 // indirect
-	golang.org/x/term v0.4.0 // indirect
-	golang.org/x/text v0.6.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
+	golang.org/x/term v0.6.0 // indirect
+	golang.org/x/text v0.8.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
-	google.golang.org/grpc v1.53.0 // indirect
-	google.golang.org/protobuf v1.28.1 // indirect
+	google.golang.org/grpc v1.54.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect

+ 42 - 35
go.sum

@@ -437,8 +437,9 @@ github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P
 github.com/bos-hieu/mongostore v0.0.2/go.mod h1:8AbbVmDEb0yqJsBrWxZIAZOxIfv/tsP8CDtdHduZHGg=
 github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
 github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
-github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
 github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -547,8 +548,9 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
@@ -848,8 +850,9 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c=
+github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -959,8 +962,9 @@ github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
+github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
 github.com/paulmach/orb v0.5.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
@@ -1079,8 +1083,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 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 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
 github.com/tal-tech/go-zero v1.1.5/go.mod h1:LbN0C7/rbl2+LUWTSUYx5leXmgedeMWjt1jc3/8/zFA=
 github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
 github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
@@ -1160,40 +1164,41 @@ go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVj
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
 go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
 go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
-go.opentelemetry.io/otel v1.11.0 h1:kfToEGMDq6TrVrJ9Vht84Y8y9enykSZzDDZglV0kIEk=
-go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk=
+go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8=
+go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
 go.opentelemetry.io/otel/exporters/jaeger v1.10.0/go.mod h1:n9IGyx0fgyXXZ/i0foLHNxtET9CzXHzZeKCucvRBFgA=
-go.opentelemetry.io/otel/exporters/jaeger v1.11.0 h1:Sv2valcFfMlfu6g8USSS+ZUN5vwbuGj1aY/CFtMG33w=
-go.opentelemetry.io/otel/exporters/jaeger v1.11.0/go.mod h1:nRgyJbgJ0hmaUdHwyDpTTfBYz61cTTeeGhVzfQc+FsI=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.0 h1:0dly5et1i/6Th3WHn0M6kYiJfFNzhhxanrJ0bOfnjEo=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.0/go.mod h1:+Lq4/WkdCkjbGcBMVHHg2apTbv8oMBf29QCnyCCJjNQ=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.0 h1:eyJ6njZmH16h9dOKCi7lMswAnGsSOwgTqWzfxqcuNr8=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.0/go.mod h1:FnDp7XemjN3oZ3xGunnfOUTVwd2XcvLbtRAuOSU3oc8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 h1:tyoeaUh8REKay72DVYsSEBYV18+fGONe+YYPaOxgLoE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.0 h1:j2RFV0Qdt38XQ2Jvi4WIsQ56w8T7eSirYbMw19VXRDg=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.0/go.mod h1:pILgiTEtrqvZpoiuGdblDgS5dbIaTgDrkIuKfEFkt+A=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.10.0 h1:S8DedULB3gp93Rh+9Z+7NTEv+6Id/KYS7LDyipZ9iCE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.10.0/go.mod h1:5WV40MLWwvWlGP7Xm8g3pMcg0pKOUY609qxJn8y7LmM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 h1:pnJfHmVcCEBcH5lkM+npJF8cTAjV/d+9cXVNCs5P/ao=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1/go.mod h1:cC3Eu2V56zXY09YlijmqDhOUnL2jVL6KKJg4PGh++dU=
 go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
 go.opentelemetry.io/otel/exporters/zipkin v1.10.0/go.mod h1:HdfvgwcOoCB0+zzrTHycW6btjK0zNpkz2oTGO815SCI=
-go.opentelemetry.io/otel/exporters/zipkin v1.11.0 h1:v/Abo5REOWrCj4zcEIUHFZtXpsCVjrwZj28iyX2rHXE=
-go.opentelemetry.io/otel/exporters/zipkin v1.11.0/go.mod h1:unWnsLCMYfINP8ue0aXVrB/GYHoXNn/lbTnupvLekGQ=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1 h1:B6s/o48bx00ayJu7F+jIMJfhPTyxW+S8vthjTZMNBj0=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ=
 go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
 go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
 go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
-go.opentelemetry.io/otel/sdk v1.11.0 h1:ZnKIL9V9Ztaq+ME43IUi/eo22mNsb6a7tGfzaOWB5fo=
-go.opentelemetry.io/otel/sdk v1.11.0/go.mod h1:REusa8RsyKaq0OlyangWXaw97t2VogoO4SSEeKkSTAk=
+go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
+go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
 go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
 go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
 go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
-go.opentelemetry.io/otel/trace v1.11.0 h1:20U/Vj42SX+mASlXLmSGBg6jpI1jQtv682lZtTAOVFI=
-go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U=
+go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY=
+go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
 go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
@@ -1209,8 +1214,8 @@ go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk=
 go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
 go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
@@ -1244,8 +1249,9 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 h1:x8vtB3zMecnlqZIwJNUUpwYKYSqCz5jXbiyv0ZJJZeI=
+golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1345,8 +1351,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
 golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1488,14 +1494,14 @@ golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220624220833-87e55d714810/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-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
-golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
+golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1508,8 +1514,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1806,8 +1812,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
 google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
 google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
-google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
+google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag=
+google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -1823,8 +1829,9 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=