diff --git a/etc/registration-service.yaml b/etc/registration-service.yaml
index c3e4297bd52bb15ba5da10167cc64c6768a0d072..abd62b382b7870b2ecd688a70983921bc707109d 100644
--- a/etc/registration-service.yaml
+++ b/etc/registration-service.yaml
@@ -34,10 +34,10 @@ DevServer:
 
 # grpc 閫氫俊鏈嶅姟绔瘉涔︾閽�
 GrpcServerConf:
-  CertFile: ./cert/registration-service/server.pem
-  KeyFile: ./cert/registration-service/server.key
-#  CertFile:
-#  KeyFile:
+#  CertFile: ./cert/registration-service/server.pem
+#  KeyFile: ./cert/registration-service/server.key
+  CertFile:
+  KeyFile:
 
   # 鎺ユ敹銆佸彂閫佹秷鎭ぇ灏忚缃负 20 mb锛屾牴鎹湇鍔″疄闄呭満鏅皟鏁�
   MaxRecvMsgSize: 20971520
diff --git a/etc/registration.yaml b/etc/registration.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5e2d872a99777d9bc66191fdf80d05ce14182feb
--- /dev/null
+++ b/etc/registration.yaml
@@ -0,0 +1,6 @@
+Name: registration.rpc
+ListenOn: 0.0.0.0:8080
+Etcd:
+  Hosts:
+  - 127.0.0.1:2379
+  Key: registration.rpc
diff --git a/internal/code/respCode.go b/internal/code/respCode.go
index b267d3267a1f1d4ea935573217f6d6f46be87325..48c3be293e718d2547bedf3ab7d1d74838ce0822 100644
--- a/internal/code/respCode.go
+++ b/internal/code/respCode.go
@@ -25,6 +25,11 @@ const (
 	// ErrParams 銆愪笟鍔″眰閿欒鐮侊細21000 - 21999銆�
 	ErrParams RespCode = iota + 20000
 	ErrInvalidDBConnType
+	ErrInvalidMethod
+	ErrInvalidHeader
+	ErrInvalidParams
+	ErrHTTPRequest
+	ErrHTTPStatusCode
 	ErrEmptyCreator
 	ErrEmptyDBConnId
 	ErrDBConnectFailed
@@ -60,6 +65,9 @@ const (
 	ErrAssetNotOnChain
 	ErrCallRPC
 	ErrCallContractResp
+	ErrAPIExist
+	ErrDataSetExist
+	ErrDataSetColumnExist
 
 	// ErrDB 銆愭暟鎹簱灞傞敊璇爜鑼冨洿锛�22000 - 22999銆�
 	ErrDB RespCode = iota + 10000
@@ -72,6 +80,11 @@ var errMsg = map[RespCode]string{
 
 	ErrParams:                 "params error",
 	ErrInvalidDBConnType:      "invalid db connection type",
+	ErrInvalidMethod:          "invalid http method",
+	ErrInvalidHeader:          "invalid http header",
+	ErrInvalidParams:          "invalid http params",
+	ErrHTTPRequest:            "http request error",
+	ErrHTTPStatusCode:         "http response status code error",
 	ErrEmptyCreator:           "creator is empty",
 	ErrEmptyDBConnId:          "db conn id is empty",
 	ErrDBConnectFailed:        "db connect failed",
@@ -107,6 +120,9 @@ var errMsg = map[RespCode]string{
 	ErrAssetNotOnChain:        "asset is not on chain",
 	ErrCallRPC:                "call rpc error",
 	ErrCallContractResp:       "call contract response error",
+	ErrAPIExist:               "asset api already exist",
+	ErrDataSetExist:           "asset data set already exist",
+	ErrDataSetColumnExist:     "asset data set column already exist",
 
 	ErrDB:             "db error",
 	ErrRecordNotFound: "record not found",
diff --git a/internal/event/asset_create_event.go b/internal/event/asset_create_event.go
index de254b22d9487f6254060a92c2bac5ba15b590b6..add528e92b64828ca36b79a79215b496791fbe27 100644
--- a/internal/event/asset_create_event.go
+++ b/internal/event/asset_create_event.go
@@ -1,15 +1,16 @@
 package event
 
 import (
+	"context"
+	"time"
+
 	"chainmaker.org/chainmaker/common/v2/json"
 	_const "chainmaker.org/chainmaker/ida/contract-ida/const"
 	"chainmaker.org/chainmaker/ida/contract-ida/types"
 	"chainmaker.org/chainmaker/ida/registration-service/internal/model"
 	"chainmaker.org/chainmaker/ida/registration-service/internal/utils"
 	"chainmaker.org/chainmaker/pb-go/v2/common"
-	"context"
 	"gorm.io/gorm"
-	"time"
 )
 
 // AssetCreateEventHandler 鍒涘缓璧勪骇浜嬩欢澶勭悊鍣�
@@ -34,7 +35,7 @@ func (h *AssetCreateEventHandler) handleEvent(e *common.ContractEventInfo) error
 		// 閬嶅巻澶勭悊姣忎竴涓祫浜�
 		for _, ida := range idas {
 			// 鍒涘缓璧勪骇
-			asset, err := h.prepareAssetInfo(tx, ida)
+			asset, err := h.prepareAssetInfo(tx, ida, 0)
 			if err != nil {
 				tx.Rollback()
 				return err
@@ -81,7 +82,20 @@ func (h *AssetCreateEventHandler) handleEvent(e *common.ContractEventInfo) error
 	return nil
 }
 
-func (h *AssetCreateEventHandler) prepareAssetInfo(tx *gorm.DB, ida *types.IDAInfo) (*model.Asset, error) {
+// prepareAssetInfo 鍑嗗璧勪骇淇℃伅
+// 1. 鍑嗗璧勪骇鎵╁睍琛ㄤ俊鎭紝骞跺叆搴撳鐞�
+// 2. 鍑嗗璧勪骇涓昏〃淇℃伅
+func (h *AssetCreateEventHandler) prepareAssetInfo(tx *gorm.DB, ida *types.IDAInfo, currentAssetId int32) (*model.Asset, error) {
+	// 鏇存柊鐨勬椂鍊欙紝闇€瑕佸厛娓呴櫎鍘熷鐨勬墿灞曡〃淇℃伅
+	if currentAssetId > 0 {
+		if err := tx.Where("asset_id = ?", currentAssetId).Delete(&model.UpdateCycle{}).Error; err != nil {
+			return nil, err
+		}
+		if err := tx.Where("asset_id = ?", currentAssetId).Delete(&model.DataScale{}).Error; err != nil {
+			return nil, err
+		}
+	}
+
 	cycle := model.UpdateCycle{
 		UpdateType: int32(ida.Source.UpdateCycle.UpdateCycleType),
 		Cycle:      int32(ida.Source.UpdateCycle.Cycle),
@@ -100,10 +114,13 @@ func (h *AssetCreateEventHandler) prepareAssetInfo(tx *gorm.DB, ida *types.IDAIn
 		return nil, err
 	}
 
-	// 澶勭悊鏁版嵁婧愯繛鎺�
-	dbConn := h.prepareDBConn(ida)
-	if err := tx.Create(dbConn).Error; err != nil {
-		return nil, err
+	// 鍒涘缓鏂拌祫浜х殑鏃跺€欙紝澶勭悊鏁版嵁婧愯繛鎺�
+	// 鏇存柊璧勪骇鐨勬椂鍊欙紝鍥犱负鏁版嵁婧愯繛鎺ヤ笉鍙慨鏀癸紝鍥犳涓嶉渶瑕佹洿鏂�
+	if currentAssetId == 0 {
+		dbConn := h.prepareDBConn(ida)
+		if err := tx.Create(dbConn).Error; err != nil {
+			return nil, err
+		}
 	}
 
 	return &model.Asset{
diff --git a/internal/event/asset_update_event.go b/internal/event/asset_update_event.go
index 31c6e6717cb3c2d91faecd608fc324bf9adc3a89..bf4e119ac96e75f85c2ffa1785d5b102f60638fa 100644
--- a/internal/event/asset_update_event.go
+++ b/internal/event/asset_update_event.go
@@ -40,7 +40,7 @@ func (h *AssetUpdateEventHandler) handleEvent(e *common.ContractEventInfo) error
 
 	// 淇濆瓨鏇存柊璧勪骇
 	assetCreator := &AssetCreateEventHandler{}
-	asset, err := assetCreator.prepareAssetInfo(tx, ida)
+	asset, err := assetCreator.prepareAssetInfo(tx, ida, int32(currentAsset.Id))
 	if err != nil {
 		tx.Rollback()
 		return err
diff --git a/internal/event/event.go b/internal/event/event.go
index 086f27b1cce67d3e884f9e264a209a5148e63e5c..59d41cd758785d077e899a859381b38ac5f88ac8 100644
--- a/internal/event/event.go
+++ b/internal/event/event.go
@@ -1,18 +1,19 @@
 package event
 
 import (
-	"chainmaker.org/chainmaker/ida/common/event"
-	"chainmaker.org/chainmaker/ida/registration-service/internal/svc"
-	"chainmaker.org/chainmaker/pb-go/v2/common"
 	"context"
 	"errors"
 	"fmt"
+
+	"chainmaker.org/chainmaker/ida/common/event"
+	"chainmaker.org/chainmaker/ida/registration-service/internal/svc"
+	"chainmaker.org/chainmaker/pb-go/v2/common"
 	"github.com/zeromicro/go-zero/core/logx"
 )
 
 const (
-	chainId   = "chain1"       // 閾緄d
-	groupName = "registration" // 娉ㄥ唽涓績
+	chainId   = "chainmaker_testnet_pk" // 閾緄d
+	groupName = "registration"          // 娉ㄥ唽涓績
 )
 
 var (
diff --git a/internal/logic/apitestlogic.go b/internal/logic/apitestlogic.go
new file mode 100644
index 0000000000000000000000000000000000000000..59f8180aaae3529208484afd48565accc13ad3aa
--- /dev/null
+++ b/internal/logic/apitestlogic.go
@@ -0,0 +1,131 @@
+package logic
+
+import (
+	"context"
+	"crypto/tls"
+	"net/http"
+	"strings"
+
+	"chainmaker.org/chainmaker/common/v2/json"
+	"chainmaker.org/chainmaker/ida/registration-service/internal/code"
+	"chainmaker.org/chainmaker/ida/registration-service/registration"
+
+	"chainmaker.org/chainmaker/ida/registration-service/internal/svc"
+	"chainmaker.org/chainmaker/ida/registration-service/pb/registrationpb"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type APITestLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewAPITestLogic(ctx context.Context, svcCtx *svc.ServiceContext) *APITestLogic {
+	return &APITestLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// HeaderItem 澶翠俊鎭粨鏋�
+type HeaderItem struct {
+	Key   string
+	Value string
+}
+
+type ParamItem struct {
+	Key  string
+	Type string
+	Desc string
+}
+
+// APITest
+// 15. API杩炴帴娴嬭瘯
+func (l *APITestLogic) APITest(in *registrationpb.APITestReq) (*registrationpb.APITestResp, error) {
+	// 1. 妫€鏌ュ弬鏁�
+	if in.Url == "" || in.Method == "" {
+		// 璁板綍鏃ュ織
+		l.Logger.Errorf("requestId: [%s], invalid params error", in.RequestId)
+		return &registration.APITestResp{
+			Code: int32(code.ErrParams),
+			Msg:  code.ErrParams.String(),
+		}, nil
+	}
+
+	method := strings.ToTitle(in.Method)
+	if method != "GET" && method != "POST" {
+		// 璁板綍鏃ュ織
+		l.Logger.Errorf("requestId: [%s], invalid http method error", in.RequestId)
+		return &registration.APITestResp{
+			Code: int32(code.ErrInvalidMethod),
+			Msg:  code.ErrInvalidMethod.String(),
+		}, nil
+	}
+
+	// 鍒涘缓璇锋眰瀵硅薄
+	req, err := http.NewRequest(method, in.Url, nil)
+	if err != nil {
+		l.Logger.Errorf("requestId: [%s], http new request error", in.RequestId)
+		return &registration.APITestResp{
+			Code: int32(code.ErrHTTPRequest),
+			Msg:  code.ErrHTTPRequest.String(),
+		}, nil
+	}
+
+	// 璁剧疆璇锋眰澶�
+	req.Header.Set("Content-Type", "application/json")
+
+	// 閰嶇疆http client, 骞惰缃� TLS 杩炴帴
+	client := &http.Client{}
+	if strings.HasPrefix(in.Url, "https") {
+		tlsConfig := &tls.Config{
+			InsecureSkipVerify: true,
+		}
+		client.Transport = &http.Transport{
+			TLSClientConfig: tlsConfig,
+		}
+	}
+
+	// 璁剧疆璇锋眰澶撮儴淇℃伅
+	if in.Header != "" {
+		headers := make([]HeaderItem, 0)
+		if err = json.Unmarshal([]byte(in.Header), &headers); err != nil {
+			// 璁板綍鏃ュ織
+			l.Logger.Errorf("requestId: [%s], unmarshal header error", in.RequestId)
+			return &registration.APITestResp{
+				Code: int32(code.ErrInvalidHeader),
+				Msg:  code.ErrInvalidHeader.String(),
+			}, nil
+		}
+		for _, item := range headers {
+			req.Header.Set(item.Key, item.Value)
+		}
+	}
+
+	// 鍙戣捣璇锋眰
+	response, err := client.Do(req)
+	if err != nil {
+		l.Logger.Errorf("requestId: [%s], http request error: %s", in.RequestId, err.Error())
+		return &registration.APITestResp{
+			Code: int32(code.ErrHTTPRequest),
+			Msg:  code.ErrHTTPRequest.String(),
+		}, nil
+	}
+	defer response.Body.Close()
+
+	// 璇诲彇鍝嶅簲鍐呭
+	if response.StatusCode != 200 {
+		l.Logger.Errorf("requestId: [%s], http response status code error", in.RequestId)
+		return &registration.APITestResp{
+			Code: int32(code.ErrHTTPStatusCode),
+			Msg:  code.ErrHTTPStatusCode.String(),
+		}, nil
+	}
+
+	return &registrationpb.APITestResp{
+		Code: int32(code.Success),
+	}, nil
+}
diff --git a/internal/logic/assetinfologic.go b/internal/logic/assetinfologic.go
index 7ebf4a62978068d590914c4f9bbaf82a7fbc0171..cc2a982eca197459db6b2697aea132954fa75a7c 100644
--- a/internal/logic/assetinfologic.go
+++ b/internal/logic/assetinfologic.go
@@ -49,7 +49,7 @@ func (l *AssetInfoLogic) AssetInfo(in *registration.AssetInfoReq) (*registration
 	asset := &model.Asset{}
 	if err := DB.Where("id = ? and platform = ?", in.AssetId, model.PlatformLocal).First(asset).Error; err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error())
 		return &registration.AssetInfoResp{
 			Code: int32(code.ErrInvalidAssetId),
 			Msg:  code.ErrInvalidAssetId.String(),
@@ -60,7 +60,7 @@ func (l *AssetInfoLogic) AssetInfo(in *registration.AssetInfoReq) (*registration
 	productInfo, err := l.prepareProductInfo(asset, DB)
 	if err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error())
 		return &registration.AssetInfoResp{
 			Code: int32(code.ErrDB),
 			Msg:  code.ErrDB.String(),
diff --git a/internal/logic/getprivateassetinfobyennamelogic.go b/internal/logic/getprivateassetinfobyennamelogic.go
index 201248d1786f357cbea1f698e24b92e50655a99d..ff272db497a673ffcf6b2b7772c75b42e019a67d 100644
--- a/internal/logic/getprivateassetinfobyennamelogic.go
+++ b/internal/logic/getprivateassetinfobyennamelogic.go
@@ -38,8 +38,8 @@ func (l *GetPrivateAssetInfoByEnNameLogic) GetPrivateAssetInfoByEnName(in *regis
 		// 璁板綍鏃ュ織
 		l.Logger.Errorf("requestId: [%s], invalid asset en name, error", in.RequestId)
 		return &registration.GetPrivateAssetInfoByEnNameResp{
-			Code: int32(code.ErrInvalidAssetNumber),
-			Msg:  code.ErrInvalidAssetNumber.String(),
+			Code: int32(code.ErrInvalidAssetEnName),
+			Msg:  code.ErrInvalidAssetEnName.String(),
 		}, nil
 	}
 
@@ -50,10 +50,10 @@ func (l *GetPrivateAssetInfoByEnNameLogic) GetPrivateAssetInfoByEnName(in *regis
 	asset := &model.Asset{}
 	if err := DB.Where("asset_en_name = ? ", in.AssetEnName).First(asset).Error; err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], check asset exist error: %s", in.RequestId, err.Error())
 		return &registration.GetPrivateAssetInfoByEnNameResp{
-			Code: int32(code.ErrInvalidAssetNumber),
-			Msg:  code.ErrInvalidAssetNumber.String(),
+			Code: int32(code.ErrInvalidAssetEnName),
+			Msg:  code.ErrInvalidAssetEnName.String(),
 		}, nil
 	}
 
@@ -62,7 +62,7 @@ func (l *GetPrivateAssetInfoByEnNameLogic) GetPrivateAssetInfoByEnName(in *regis
 	productInfo, err := assetLogic.prepareProductInfo(asset, DB)
 	if err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error())
 		return &registration.GetPrivateAssetInfoByEnNameResp{
 			Code: int32(code.ErrDB),
 			Msg:  code.ErrDB.String(),
diff --git a/internal/logic/getprivateassetinfologic.go b/internal/logic/getprivateassetinfologic.go
index 97baf060b6f19294eb00d0631d3db5f0766591cb..183c3bc89cc915fbbb83c11b3df12acfe783d8fd 100644
--- a/internal/logic/getprivateassetinfologic.go
+++ b/internal/logic/getprivateassetinfologic.go
@@ -48,7 +48,7 @@ func (l *GetPrivateAssetInfoLogic) GetPrivateAssetInfo(in *registration.GetPriva
 	asset := &model.Asset{}
 	if err := DB.Where("id = ? ", in.AssetId).First(asset).Error; err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error())
 		return &registration.GetPrivateAssetInfoResp{
 			Code: int32(code.ErrInvalidAssetId),
 			Msg:  code.ErrInvalidAssetId.String(),
@@ -60,7 +60,7 @@ func (l *GetPrivateAssetInfoLogic) GetPrivateAssetInfo(in *registration.GetPriva
 	productInfo, err := assetLogic.prepareProductInfo(asset, DB)
 	if err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], prepare product info error: %s", in.RequestId, err.Error())
 		return &registration.GetPrivateAssetInfoResp{
 			Code: int32(code.ErrDB),
 			Msg:  code.ErrDB.String(),
diff --git a/internal/logic/saveapilogic.go b/internal/logic/saveapilogic.go
index b82862b23c634354855d7fef22673003bbf7ce88..77b968356a48faf78885e10cf17a51b59249c3df 100644
--- a/internal/logic/saveapilogic.go
+++ b/internal/logic/saveapilogic.go
@@ -1,11 +1,12 @@
 package logic
 
 import (
+	"context"
+	"time"
+
 	"chainmaker.org/chainmaker/ida/registration-service/internal/code"
 	"chainmaker.org/chainmaker/ida/registration-service/internal/model"
 	"chainmaker.org/chainmaker/ida/registration-service/registration"
-	"context"
-	"time"
 
 	"chainmaker.org/chainmaker/ida/registration-service/internal/svc"
 	"github.com/zeromicro/go-zero/core/logx"
@@ -47,13 +48,23 @@ func (l *SaveAPILogic) SaveAPI(in *registration.SaveAPIReq) (*registration.SaveA
 	asset := &model.Asset{}
 	if err := DB.Where("id = ? ", in.AssetId).First(asset).Error; err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], check params error: %s", in.RequestId, err.Error())
 		return &registration.SaveAPIResp{
 			Code: int32(code.ErrInvalidAssetId),
 			Msg:  code.ErrInvalidAssetId.String(),
 		}, nil
 	}
 
+	// 4. 妫€鏌PI鏄惁瀛樺湪
+	if err := DB.Where("asset_id = ? ", in.AssetId).First(&model.AssetApi{}).Error; err == nil {
+		// 璁板綍鏃ュ織
+		l.Logger.Errorf("requestId: [%s], asset api exist error: %s", in.RequestId, err.Error())
+		return &registration.SaveAPIResp{
+			Code: int32(code.ErrDataSetExist),
+			Msg:  code.ErrDataSetExist.String(),
+		}, nil
+	}
+
 	assetApi := &model.AssetApi{
 		AssetId:   in.AssetId,
 		Url:       in.Url,
@@ -65,7 +76,7 @@ func (l *SaveAPILogic) SaveAPI(in *registration.SaveAPIReq) (*registration.SaveA
 	}
 	if err := DB.Create(assetApi).Error; err != nil {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], create asset api error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], create asset api error: %s", in.RequestId, err.Error())
 		return &registration.SaveAPIResp{
 			Code: int32(code.ErrDB),
 			Msg:  code.ErrDB.String(),
diff --git a/internal/logic/savetablecolumnslogic.go b/internal/logic/savetablecolumnslogic.go
index ecc1b89951224170ed79cf27a46a1badf09603bd..52f4f3283310a7a735ad3ba45b6d8c2b09b40b08 100644
--- a/internal/logic/savetablecolumnslogic.go
+++ b/internal/logic/savetablecolumnslogic.go
@@ -1,14 +1,13 @@
 package logic
 
 import (
+	"context"
+	"time"
+
 	"chainmaker.org/chainmaker/ida/registration-service/internal/code"
 	"chainmaker.org/chainmaker/ida/registration-service/internal/model"
 	"chainmaker.org/chainmaker/ida/registration-service/internal/svc"
 	"chainmaker.org/chainmaker/ida/registration-service/registration"
-	"context"
-	"gorm.io/gorm"
-	"time"
-
 	"github.com/zeromicro/go-zero/core/logx"
 )
 
@@ -78,12 +77,19 @@ func (l *SaveTableColumnsLogic) SaveTableColumns(in *registration.SaveTableColum
 
 	// 6. 鏌ヨ鏁版嵁闆嗘槸鍚﹀瓨鍦�
 	var dataSetInfo = &model.AssetDataSet{}
-	if err := tx.Where("asset_id = ?", in.AssetId).First(dataSetInfo).Error; err == nil || err != gorm.ErrRecordNotFound {
-		dataSet.Id = dataSetInfo.Id
+	if err := tx.Where("asset_id = ?", in.AssetId).First(dataSetInfo).Error; err == nil {
+		// 浜嬪姟鍥炴粴
+		tx.Rollback()
+		// 璁板綍鏃ュ織
+		l.Logger.Errorf("requestId: [%s], data set exist error: %s", in.RequestId, err)
+		return &registration.SaveTableColumnsResp{
+			Code: int32(code.ErrDataSetExist),
+			Msg:  code.ErrDataSetExist.String(),
+		}, nil
 	}
 
 	// 7. 淇濆瓨鏁版嵁闆�, dataSet.Id 涓嶅瓨鍦ㄦ椂鏂板锛屽瓨鍦ㄦ椂鍒欐洿鏂�
-	if err := tx.Save(dataSet).Error; err != nil {
+	if err := tx.Create(dataSet).Error; err != nil {
 		// 浜嬪姟鍥炴粴
 		tx.Rollback()
 		// 璁板綍鏃ュ織
@@ -94,7 +100,20 @@ func (l *SaveTableColumnsLogic) SaveTableColumns(in *registration.SaveTableColum
 		}, nil
 	}
 
-	// 8. 淇濆瓨鏁版嵁闆嗗瓧娈典俊鎭�
+	// 8. 妫€鏌ユ暟鎹泦瀛楁淇℃伅鏄惁瀛樺湪
+	if err := tx.Where("asset_id = ?", in.AssetId).First(&model.Asset{}).Error; err == nil {
+		dataSet.Id = dataSetInfo.Id
+		// 浜嬪姟鍥炴粴
+		tx.Rollback()
+		// 璁板綍鏃ュ織
+		l.Logger.Errorf("requestId: [%s], data set column exist error: %s", in.RequestId, err)
+		return &registration.SaveTableColumnsResp{
+			Code: int32(code.ErrDataSetColumnExist),
+			Msg:  code.ErrDataSetColumnExist.String(),
+		}, nil
+	}
+
+	// 9. 淇濆瓨鏁版嵁闆嗗瓧娈典俊鎭�
 	for _, column := range in.List {
 		dataSetColumn := &model.AssetDataSetColumn{
 			DataSetId:     int32(dataSet.Id),
@@ -124,7 +143,7 @@ func (l *SaveTableColumnsLogic) SaveTableColumns(in *registration.SaveTableColum
 		}
 	}
 
-	// 9. 浜嬪姟鎻愪氦
+	// 10. 浜嬪姟鎻愪氦
 	if err := tx.Commit().Error; err != nil {
 		// 璁板綍鏃ュ織
 		l.Logger.Errorf("requestId: [%s], tx commit  error: %s", in.RequestId, err)
diff --git a/internal/logic/updateapilogic.go b/internal/logic/updateapilogic.go
index 8b02775dcbf19870d107107e584f6255969e7f35..ab0d9f89f421029e108e237b7fc7c6671f6e26ab 100644
--- a/internal/logic/updateapilogic.go
+++ b/internal/logic/updateapilogic.go
@@ -66,7 +66,7 @@ func (l *UpdateAPILogic) UpdateAPI(in *registration.UpdateAPIReq) (*registration
 
 		if err = DB.Where("asset_id = ?", in.AssetId).Save(assetAPI).Error; err != nil {
 			// 璁板綍鏃ュ織
-			l.Logger.Errorf("requestId: [%s], update asset api error: %s", in.RequestId, err.Error)
+			l.Logger.Errorf("requestId: [%s], update asset api error: %s", in.RequestId, err.Error())
 			return &registration.UpdateAPIResp{
 				Code: int32(code.ErrDB),
 				Msg:  code.ErrDB.String(),
@@ -74,7 +74,7 @@ func (l *UpdateAPILogic) UpdateAPI(in *registration.UpdateAPIReq) (*registration
 		}
 	} else {
 		// 璁板綍鏃ュ織
-		l.Logger.Errorf("requestId: [%s], query api info error: %s", in.RequestId, err.Error)
+		l.Logger.Errorf("requestId: [%s], query api info error: %s", in.RequestId, err.Error())
 		return &registration.UpdateAPIResp{
 			Code: int32(code.ErrInvalidAssetId),
 			Msg:  code.ErrInvalidAssetId.String(),
diff --git a/internal/server/registrationserver.go b/internal/server/registrationserver.go
index 8d23110bf9a2da96f73e8344db270dac64aeb642..b1808ac21a9888872afacd0906469944c0303eee 100644
--- a/internal/server/registrationserver.go
+++ b/internal/server/registrationserver.go
@@ -178,6 +178,12 @@ func (s *RegistrationServer) UpdateAsset(ctx context.Context, in *registrationpb
 	return l.UpdateAsset(in)
 }
 
+// 15. API杩炴帴娴嬭瘯
+func (s *RegistrationServer) APITest(ctx context.Context, in *registrationpb.APITestReq) (*registrationpb.APITestResp, error) {
+	l := logic.NewAPITestLogic(ctx, s.svcCtx)
+	return l.APITest(in)
+}
+
 // 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 func (s *RegistrationServer) GetPrivateDBConnInfo(ctx context.Context, in *registrationpb.GetPrivateDBConnInfoReq) (*registrationpb.GetPrivateDBConnInfoResp, error) {
 	l := logic.NewGetPrivateDBConnInfoLogic(ctx, s.svcCtx)
diff --git a/internal/utils/generator.go b/internal/utils/generator.go
index 1df7675408e46d36d39601205f23e37416b4c738..fadac096078936951d0d28088d183db1b82eb3b7 100644
--- a/internal/utils/generator.go
+++ b/internal/utils/generator.go
@@ -38,6 +38,11 @@ func (g *AssetNumberGenerator) GenerateAssetNumber(platformId string) string {
 	indexStr := fmt.Sprintf("%05d", index)
 	randChar := strconv.Itoa(rand.Intn(9000) + 1000)
 
-	identifier := platformId + date + indexStr + randChar
+	prefix := "TEST"
+	if platformId != "" {
+		prefix = platformId
+	}
+
+	identifier := prefix + date + indexStr + randChar
 	return identifier
 }
diff --git a/pb/registrationpb/registration.pb.go b/pb/registrationpb/registration.pb.go
index b092ce81feba382080aa4fa32520928ecb5a6e02..33fc4181867cbcbb8a0fd0a0dcd82c95387ccfdf 100644
--- a/pb/registrationpb/registration.pb.go
+++ b/pb/registrationpb/registration.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.28.1
-// 	protoc        v3.21.12
+// 	protoc        v4.25.3
 // source: proto/registration.proto
 
 // 琛ㄧず褰撳墠 proto 鏂囦欢灞炰簬 protobuf 鍖咃紝瀹冧笉鏄� go 鏂囦欢鐨� package
@@ -2580,14 +2580,14 @@ type AssetDataInfo struct {
 	SourceTypeName     string `protobuf:"bytes,2,opt,name=source_type_name,json=sourceTypeName,proto3" json:"source_type_name,omitempty"`           // 鍙栧緱鏂瑰紡鍚嶇О
 	SourceWay          string `protobuf:"bytes,3,opt,name=source_way,json=sourceWay,proto3" json:"source_way,omitempty"`                            // 鏉ユ簮娓犻亾
 	DesensitizationWay string `protobuf:"bytes,4,opt,name=desensitization_way,json=desensitizationWay,proto3" json:"desensitization_way,omitempty"` // 鑴辨晱鏂瑰紡
-	ScaleType          int32  `protobuf:"varint,5,opt,name=scale_type,json=scaleType,proto3" json:"scale_type,omitempty"`                           // 鏁版嵁瑙勬ā绫诲瀷
+	ScaleType          int32  `protobuf:"varint,5,opt,name=scale_type,json=scaleType,proto3" json:"scale_type,omitempty"`                           // 鏁版嵁瑙勬ā绫诲瀷:1鏉★紝2M锛�3G
 	ScaleTypeName      string `protobuf:"bytes,6,opt,name=scale_type_name,json=scaleTypeName,proto3" json:"scale_type_name,omitempty"`              // 鏁版嵁瑙勬ā绫诲瀷鍚嶇О
 	Scale              int32  `protobuf:"varint,7,opt,name=scale,proto3" json:"scale,omitempty"`                                                    // 鏁版嵁瑙勬ā
 	DataFormat         int32  `protobuf:"varint,8,opt,name=data_format,json=dataFormat,proto3" json:"data_format,omitempty"`                        // 瀛樺偍鏍煎紡
 	DataFormatName     string `protobuf:"bytes,9,opt,name=data_format_name,json=dataFormatName,proto3" json:"data_format_name,omitempty"`           // 瀛樺偍鏍煎紡鍚嶇О
 	UpdateType         int32  `protobuf:"varint,10,opt,name=update_type,json=updateType,proto3" json:"update_type,omitempty"`                       // 鏇存柊鍛ㄦ湡绫诲瀷锛�1闈欐€侊紝2瀹炴椂锛�3鍛ㄦ湡
 	Cycle              int32  `protobuf:"varint,12,opt,name=cycle,proto3" json:"cycle,omitempty"`                                                   // 鏇存柊鍛ㄦ湡
-	Unit               int32  `protobuf:"varint,13,opt,name=unit,proto3" json:"unit,omitempty"`                                                     // 鏇存柊鍛ㄦ湡鍗曚綅
+	Unit               int32  `protobuf:"varint,13,opt,name=unit,proto3" json:"unit,omitempty"`                                                     // 鏇存柊鍛ㄦ湡鍗曚綅: 1鍒嗭紝2鏃讹紝3澶�
 	UnitName           string `protobuf:"bytes,14,opt,name=unit_name,json=unitName,proto3" json:"unit_name,omitempty"`                              // 鏇存柊鍛ㄦ湡鍗曚綅鍚嶇О
 	TimeSpan           string `protobuf:"bytes,15,opt,name=time_span,json=timeSpan,proto3" json:"time_span,omitempty"`                              // 鏃堕棿璺ㄥ害
 	DataSample         string `protobuf:"bytes,16,opt,name=data_sample,json=dataSample,proto3" json:"data_sample,omitempty"`                        // 鏁版嵁浜у搧绀轰緥
@@ -6066,6 +6066,141 @@ func (x *UpdateAssetResp) GetData() string {
 	return ""
 }
 
+// 15. API杩炴帴娴嬭瘯
+type APITestReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
+	Header    string `protobuf:"bytes,3,opt,name=header,proto3" json:"header,omitempty"` // header
+	Url       string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"`       // API鍦板潃
+	Method    string `protobuf:"bytes,5,opt,name=method,proto3" json:"method,omitempty"` // 璇锋眰鏂瑰紡锛� GET銆丳OST绛�
+}
+
+func (x *APITestReq) Reset() {
+	*x = APITestReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_registration_proto_msgTypes[83]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *APITestReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*APITestReq) ProtoMessage() {}
+
+func (x *APITestReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_registration_proto_msgTypes[83]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use APITestReq.ProtoReflect.Descriptor instead.
+func (*APITestReq) Descriptor() ([]byte, []int) {
+	return file_proto_registration_proto_rawDescGZIP(), []int{83}
+}
+
+func (x *APITestReq) GetRequestId() string {
+	if x != nil {
+		return x.RequestId
+	}
+	return ""
+}
+
+func (x *APITestReq) GetHeader() string {
+	if x != nil {
+		return x.Header
+	}
+	return ""
+}
+
+func (x *APITestReq) GetUrl() string {
+	if x != nil {
+		return x.Url
+	}
+	return ""
+}
+
+func (x *APITestReq) GetMethod() string {
+	if x != nil {
+		return x.Method
+	}
+	return ""
+}
+
+type APITestResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Code int32  `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
+	Msg  string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"`
+	Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *APITestResp) Reset() {
+	*x = APITestResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_registration_proto_msgTypes[84]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *APITestResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*APITestResp) ProtoMessage() {}
+
+func (x *APITestResp) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_registration_proto_msgTypes[84]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use APITestResp.ProtoReflect.Descriptor instead.
+func (*APITestResp) Descriptor() ([]byte, []int) {
+	return file_proto_registration_proto_rawDescGZIP(), []int{84}
+}
+
+func (x *APITestResp) GetCode() int32 {
+	if x != nil {
+		return x.Code
+	}
+	return 0
+}
+
+func (x *APITestResp) GetMsg() string {
+	if x != nil {
+		return x.Msg
+	}
+	return ""
+}
+
+func (x *APITestResp) GetData() string {
+	if x != nil {
+		return x.Data
+	}
+	return ""
+}
+
 // 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 type GetPrivateDBConnInfoReq struct {
 	state         protoimpl.MessageState
@@ -6079,7 +6214,7 @@ type GetPrivateDBConnInfoReq struct {
 func (x *GetPrivateDBConnInfoReq) Reset() {
 	*x = GetPrivateDBConnInfoReq{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[83]
+		mi := &file_proto_registration_proto_msgTypes[85]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6092,7 +6227,7 @@ func (x *GetPrivateDBConnInfoReq) String() string {
 func (*GetPrivateDBConnInfoReq) ProtoMessage() {}
 
 func (x *GetPrivateDBConnInfoReq) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[83]
+	mi := &file_proto_registration_proto_msgTypes[85]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6105,7 +6240,7 @@ func (x *GetPrivateDBConnInfoReq) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateDBConnInfoReq.ProtoReflect.Descriptor instead.
 func (*GetPrivateDBConnInfoReq) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{83}
+	return file_proto_registration_proto_rawDescGZIP(), []int{85}
 }
 
 func (x *GetPrivateDBConnInfoReq) GetRequestId() string {
@@ -6135,7 +6270,7 @@ type GetPrivateDBConnInfoResp struct {
 func (x *GetPrivateDBConnInfoResp) Reset() {
 	*x = GetPrivateDBConnInfoResp{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[84]
+		mi := &file_proto_registration_proto_msgTypes[86]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6148,7 +6283,7 @@ func (x *GetPrivateDBConnInfoResp) String() string {
 func (*GetPrivateDBConnInfoResp) ProtoMessage() {}
 
 func (x *GetPrivateDBConnInfoResp) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[84]
+	mi := &file_proto_registration_proto_msgTypes[86]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6161,7 +6296,7 @@ func (x *GetPrivateDBConnInfoResp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateDBConnInfoResp.ProtoReflect.Descriptor instead.
 func (*GetPrivateDBConnInfoResp) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{84}
+	return file_proto_registration_proto_rawDescGZIP(), []int{86}
 }
 
 func (x *GetPrivateDBConnInfoResp) GetCode() int32 {
@@ -6205,7 +6340,7 @@ type PrivateDBConnInfo struct {
 func (x *PrivateDBConnInfo) Reset() {
 	*x = PrivateDBConnInfo{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[85]
+		mi := &file_proto_registration_proto_msgTypes[87]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6218,7 +6353,7 @@ func (x *PrivateDBConnInfo) String() string {
 func (*PrivateDBConnInfo) ProtoMessage() {}
 
 func (x *PrivateDBConnInfo) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[85]
+	mi := &file_proto_registration_proto_msgTypes[87]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6231,7 +6366,7 @@ func (x *PrivateDBConnInfo) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PrivateDBConnInfo.ProtoReflect.Descriptor instead.
 func (*PrivateDBConnInfo) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{85}
+	return file_proto_registration_proto_rawDescGZIP(), []int{87}
 }
 
 func (x *PrivateDBConnInfo) GetDbConnId() int32 {
@@ -6319,7 +6454,7 @@ type GetPrivateAssetListReq struct {
 func (x *GetPrivateAssetListReq) Reset() {
 	*x = GetPrivateAssetListReq{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[86]
+		mi := &file_proto_registration_proto_msgTypes[88]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6332,7 +6467,7 @@ func (x *GetPrivateAssetListReq) String() string {
 func (*GetPrivateAssetListReq) ProtoMessage() {}
 
 func (x *GetPrivateAssetListReq) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[86]
+	mi := &file_proto_registration_proto_msgTypes[88]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6345,7 +6480,7 @@ func (x *GetPrivateAssetListReq) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetListReq.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetListReq) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{86}
+	return file_proto_registration_proto_rawDescGZIP(), []int{88}
 }
 
 func (x *GetPrivateAssetListReq) GetRequestId() string {
@@ -6389,7 +6524,7 @@ type GetPrivateAssetListResp struct {
 func (x *GetPrivateAssetListResp) Reset() {
 	*x = GetPrivateAssetListResp{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[87]
+		mi := &file_proto_registration_proto_msgTypes[89]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6402,7 +6537,7 @@ func (x *GetPrivateAssetListResp) String() string {
 func (*GetPrivateAssetListResp) ProtoMessage() {}
 
 func (x *GetPrivateAssetListResp) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[87]
+	mi := &file_proto_registration_proto_msgTypes[89]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6415,7 +6550,7 @@ func (x *GetPrivateAssetListResp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetListResp.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetListResp) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{87}
+	return file_proto_registration_proto_rawDescGZIP(), []int{89}
 }
 
 func (x *GetPrivateAssetListResp) GetCode() int32 {
@@ -6452,7 +6587,7 @@ type GetPrivateAssetInfoReq struct {
 func (x *GetPrivateAssetInfoReq) Reset() {
 	*x = GetPrivateAssetInfoReq{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[88]
+		mi := &file_proto_registration_proto_msgTypes[90]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6465,7 +6600,7 @@ func (x *GetPrivateAssetInfoReq) String() string {
 func (*GetPrivateAssetInfoReq) ProtoMessage() {}
 
 func (x *GetPrivateAssetInfoReq) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[88]
+	mi := &file_proto_registration_proto_msgTypes[90]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6478,7 +6613,7 @@ func (x *GetPrivateAssetInfoReq) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetInfoReq.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetInfoReq) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{88}
+	return file_proto_registration_proto_rawDescGZIP(), []int{90}
 }
 
 func (x *GetPrivateAssetInfoReq) GetRequestId() string {
@@ -6508,7 +6643,7 @@ type GetPrivateAssetInfoResp struct {
 func (x *GetPrivateAssetInfoResp) Reset() {
 	*x = GetPrivateAssetInfoResp{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[89]
+		mi := &file_proto_registration_proto_msgTypes[91]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6521,7 +6656,7 @@ func (x *GetPrivateAssetInfoResp) String() string {
 func (*GetPrivateAssetInfoResp) ProtoMessage() {}
 
 func (x *GetPrivateAssetInfoResp) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[89]
+	mi := &file_proto_registration_proto_msgTypes[91]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6534,7 +6669,7 @@ func (x *GetPrivateAssetInfoResp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetInfoResp.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetInfoResp) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{89}
+	return file_proto_registration_proto_rawDescGZIP(), []int{91}
 }
 
 func (x *GetPrivateAssetInfoResp) GetCode() int32 {
@@ -6571,7 +6706,7 @@ type GetPrivateAssetInfoByEnNameReq struct {
 func (x *GetPrivateAssetInfoByEnNameReq) Reset() {
 	*x = GetPrivateAssetInfoByEnNameReq{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[90]
+		mi := &file_proto_registration_proto_msgTypes[92]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6584,7 +6719,7 @@ func (x *GetPrivateAssetInfoByEnNameReq) String() string {
 func (*GetPrivateAssetInfoByEnNameReq) ProtoMessage() {}
 
 func (x *GetPrivateAssetInfoByEnNameReq) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[90]
+	mi := &file_proto_registration_proto_msgTypes[92]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6597,7 +6732,7 @@ func (x *GetPrivateAssetInfoByEnNameReq) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetInfoByEnNameReq.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetInfoByEnNameReq) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{90}
+	return file_proto_registration_proto_rawDescGZIP(), []int{92}
 }
 
 func (x *GetPrivateAssetInfoByEnNameReq) GetRequestId() string {
@@ -6627,7 +6762,7 @@ type GetPrivateAssetInfoByEnNameResp struct {
 func (x *GetPrivateAssetInfoByEnNameResp) Reset() {
 	*x = GetPrivateAssetInfoByEnNameResp{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[91]
+		mi := &file_proto_registration_proto_msgTypes[93]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6640,7 +6775,7 @@ func (x *GetPrivateAssetInfoByEnNameResp) String() string {
 func (*GetPrivateAssetInfoByEnNameResp) ProtoMessage() {}
 
 func (x *GetPrivateAssetInfoByEnNameResp) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[91]
+	mi := &file_proto_registration_proto_msgTypes[93]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6653,7 +6788,7 @@ func (x *GetPrivateAssetInfoByEnNameResp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateAssetInfoByEnNameResp.ProtoReflect.Descriptor instead.
 func (*GetPrivateAssetInfoByEnNameResp) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{91}
+	return file_proto_registration_proto_rawDescGZIP(), []int{93}
 }
 
 func (x *GetPrivateAssetInfoByEnNameResp) GetCode() int32 {
@@ -6689,7 +6824,7 @@ type GetPrivateEnterpriseAssetReq struct {
 func (x *GetPrivateEnterpriseAssetReq) Reset() {
 	*x = GetPrivateEnterpriseAssetReq{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[92]
+		mi := &file_proto_registration_proto_msgTypes[94]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6702,7 +6837,7 @@ func (x *GetPrivateEnterpriseAssetReq) String() string {
 func (*GetPrivateEnterpriseAssetReq) ProtoMessage() {}
 
 func (x *GetPrivateEnterpriseAssetReq) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[92]
+	mi := &file_proto_registration_proto_msgTypes[94]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6715,7 +6850,7 @@ func (x *GetPrivateEnterpriseAssetReq) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateEnterpriseAssetReq.ProtoReflect.Descriptor instead.
 func (*GetPrivateEnterpriseAssetReq) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{92}
+	return file_proto_registration_proto_rawDescGZIP(), []int{94}
 }
 
 func (x *GetPrivateEnterpriseAssetReq) GetAssetName() string {
@@ -6738,7 +6873,7 @@ type GetPrivateEnterpriseAssetResp struct {
 func (x *GetPrivateEnterpriseAssetResp) Reset() {
 	*x = GetPrivateEnterpriseAssetResp{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[93]
+		mi := &file_proto_registration_proto_msgTypes[95]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6751,7 +6886,7 @@ func (x *GetPrivateEnterpriseAssetResp) String() string {
 func (*GetPrivateEnterpriseAssetResp) ProtoMessage() {}
 
 func (x *GetPrivateEnterpriseAssetResp) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[93]
+	mi := &file_proto_registration_proto_msgTypes[95]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6764,7 +6899,7 @@ func (x *GetPrivateEnterpriseAssetResp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPrivateEnterpriseAssetResp.ProtoReflect.Descriptor instead.
 func (*GetPrivateEnterpriseAssetResp) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{93}
+	return file_proto_registration_proto_rawDescGZIP(), []int{95}
 }
 
 func (x *GetPrivateEnterpriseAssetResp) GetCode() int32 {
@@ -6800,7 +6935,7 @@ type PrivateEnterprise struct {
 func (x *PrivateEnterprise) Reset() {
 	*x = PrivateEnterprise{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[94]
+		mi := &file_proto_registration_proto_msgTypes[96]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6813,7 +6948,7 @@ func (x *PrivateEnterprise) String() string {
 func (*PrivateEnterprise) ProtoMessage() {}
 
 func (x *PrivateEnterprise) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[94]
+	mi := &file_proto_registration_proto_msgTypes[96]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6826,7 +6961,7 @@ func (x *PrivateEnterprise) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PrivateEnterprise.ProtoReflect.Descriptor instead.
 func (*PrivateEnterprise) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{94}
+	return file_proto_registration_proto_rawDescGZIP(), []int{96}
 }
 
 func (x *PrivateEnterprise) GetEnterpriseName() string {
@@ -6857,7 +6992,7 @@ type EnterpriseAsset struct {
 func (x *EnterpriseAsset) Reset() {
 	*x = EnterpriseAsset{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_proto_registration_proto_msgTypes[95]
+		mi := &file_proto_registration_proto_msgTypes[97]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -6870,7 +7005,7 @@ func (x *EnterpriseAsset) String() string {
 func (*EnterpriseAsset) ProtoMessage() {}
 
 func (x *EnterpriseAsset) ProtoReflect() protoreflect.Message {
-	mi := &file_proto_registration_proto_msgTypes[95]
+	mi := &file_proto_registration_proto_msgTypes[97]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -6883,7 +7018,7 @@ func (x *EnterpriseAsset) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use EnterpriseAsset.ProtoReflect.Descriptor instead.
 func (*EnterpriseAsset) Descriptor() ([]byte, []int) {
-	return file_proto_registration_proto_rawDescGZIP(), []int{95}
+	return file_proto_registration_proto_rawDescGZIP(), []int{97}
 }
 
 func (x *EnterpriseAsset) GetAssetId() int32 {
@@ -7691,252 +7826,267 @@ var file_proto_registration_proto_rawDesc = []byte{
 	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10,
 	0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67,
 	0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x64, 0x61, 0x74, 0x61, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
-	0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12,
-	0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1c,
-	0x0a, 0x0a, 0x64, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x08, 0x64, 0x62, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x64, 0x22, 0x6e, 0x0a, 0x18,
+	0x64, 0x61, 0x74, 0x61, 0x22, 0x6d, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x54, 0x65, 0x73, 0x74, 0x52,
+	0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d,
+	0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74,
+	0x68, 0x6f, 0x64, 0x22, 0x47, 0x0a, 0x0b, 0x41, 0x50, 0x49, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x56, 0x0a, 0x17,
 	0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e,
-	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03,
-	0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x2c,
-	0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f,
-	0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x95, 0x02, 0x0a,
-	0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e,
-	0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x0a, 0x64, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x62, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x64,
-	0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a,
-	0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73,
-	0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52,
-	0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65,
-	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65,
-	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
-	0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
-	0x64, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c,
-	0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c,
-	0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
-	0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x64, 0x41, 0x74, 0x22, 0x9e, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76,
-	0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12,
-	0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f,
-	0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12,
-	0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x27, 0x0a, 0x07,
-	0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69,
-	0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x65, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76,
-	0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x64, 0x62, 0x5f, 0x63, 0x6f, 0x6e,
+	0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x62, 0x43, 0x6f,
+	0x6e, 0x6e, 0x49, 0x64, 0x22, 0x6e, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70,
 	0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,
 	0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73,
-	0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x52, 0x0a, 0x16,
-	0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69,
-	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64,
-	0x22, 0x65, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73,
-	0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63,
-	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12,
-	0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73,
-	0x67, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66,
-	0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x63, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x50, 0x72,
-	0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79,
-	0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65,
-	0x74, 0x5f, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x1f,
-	0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49,
-	0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63,
-	0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3d, 0x0a, 0x1c, 0x47,
-	0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
-	0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61,
-	0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x73, 0x0a, 0x1d, 0x47, 0x65,
-	0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
-	0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63,
-	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12,
-	0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73,
-	0x67, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45,
-	0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,
-	0x73, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70,
-	0x72, 0x69, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
-	0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65,
-	0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a,
-	0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70,
-	0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74,
-	0x4c, 0x69, 0x73, 0x74, 0x22, 0x92, 0x01, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
-	0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65,
-	0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65,
-	0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x75, 0x6d,
-	0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74,
-	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f,
-	0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61,
-	0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
-	0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0x84, 0x12, 0x0a, 0x0c, 0x52, 0x65,
-	0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x43, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f,
+	0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x69,
+	0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x22, 0x95, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+	0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x0a, 0x64, 0x62,
+	0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08,
+	0x64, 0x62, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e,
+	0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72,
+	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x09,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1d, 0x0a,
+	0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x9e, 0x01, 0x0a,
+	0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e,
+	0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x67,
+	0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f,
+	0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65,
+	0x53, 0x69, 0x7a, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x65, 0x0a,
+	0x17, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03,
+	0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x24,
+	0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x22, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x1d,
+	0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a,
+	0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50,
+	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,
+	0x63, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65,
+	0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64,
+	0x12, 0x22, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e,
+	0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e,
+	0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d,
+	0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x24, 0x0a,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x22, 0x3d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74,
+	0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61,
+	0x6d, 0x65, 0x22, 0x73, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+	0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
+	0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x73, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f,
+	0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
+	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c,
+	0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65,
+	0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x92, 0x01, 0x0a,
+	0x0f, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61,
+	0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x22,
+	0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x4e, 0x61,
+	0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x32, 0xb6, 0x12, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f,
+	0x6e, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52,
-	0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x0d, 0x47,
-	0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x4c, 0x69,
-	0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
-	0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x42, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
-	0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f,
-	0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
-	0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x42, 0x43,
-	0x6f, 0x6e, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72,
+	0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
+	0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x42,
+	0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
+	0x71, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x43,
+	0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x0c, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x44, 0x42, 0x43, 0x6f,
-	0x6e, 0x6e, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x44,
-	0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x54, 0x65, 0x73, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x48, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69,
-	0x73, 0x74, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e,
-	0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72,
-	0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x13, 0x47, 0x65, 0x74,
-	0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74,
-	0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72,
-	0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a,
-	0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43,
-	0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c,
-	0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x41,
-	0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a,
-	0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x11,
-	0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73,
-	0x74, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74,
-	0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f,
-	0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x11,
-	0x47, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73,
-	0x74, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6f, 0x75,
-	0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x14,
-	0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74,
-	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
-	0x44, 0x61, 0x74, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
-	0x44, 0x61, 0x74, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61,
-	0x74, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12,
-	0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
-	0x71, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64,
-	0x61, 0x74, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x73,
-	0x73, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x45, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x54, 0x61, 0x62, 0x6c, 0x65,
-	0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
-	0x44, 0x42, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x19,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x54, 0x61, 0x62, 0x6c,
-	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x48, 0x0a, 0x0f, 0x47, 0x65, 0x74,
-	0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x19, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c,
-	0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65,
-	0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x53, 0x61, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73,
-	0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65,
-	0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x12, 0x30, 0x0a, 0x07, 0x53, 0x61, 0x76, 0x65, 0x41, 0x50, 0x49, 0x12, 0x11, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x12,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x41, 0x50, 0x49, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x51, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c,
-	0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75,
-	0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41,
-	0x50, 0x49, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x50, 0x49, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a,
-	0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x41,
-	0x73, 0x73, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65,
-	0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x55,
-	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x65, 0x72,
-	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a,
-	0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
-	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73,
-	0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x36, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x13, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
-	0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x6e,
-	0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
-	0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4c,
-	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76,
-	0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
-	0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
-	0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54,
+	0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0a,
+	0x54, 0x65, 0x73, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x71,
+	0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x44, 0x42, 0x43,
+	0x6f, 0x6e, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x48, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e,
+	0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
+	0x74, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x54, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x74, 0x65,
+	0x67, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x73,
+	0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47,
+	0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47,
+	0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53,
+	0x63, 0x61, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x63, 0x61, 0x6c,
+	0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x53, 0x63, 0x61, 0x6c,
+	0x65, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5d, 0x0a,
+	0x16, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x55,
+	0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x55, 0x6e,
+	0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65,
+	0x55, 0x6e, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52,
+	0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x0e, 0x47, 0x65,
+	0x74, 0x44, 0x42, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x42, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47,
+	0x65, 0x74, 0x44, 0x42, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x48, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c,
+	0x75, 0x6d, 0x6e, 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
+	0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a,
+	0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65,
+	0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x53,
+	0x61, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12,
+	0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c,
+	0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c,
+	0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x53, 0x61, 0x76, 0x65,
+	0x41, 0x50, 0x49, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65,
+	0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53,
+	0x61, 0x76, 0x65, 0x41, 0x50, 0x49, 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, 0x12, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73,
+	0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54,
+	0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62,
+	0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a,
+	0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x50, 0x49, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x1a,
+	0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x50,
+	0x49, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41,
+	0x73, 0x73, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x3c, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+	0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
+	0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x36, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
+	0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74,
+	0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x3c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x15,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a,
+	0x07, 0x41, 0x50, 0x49, 0x54, 0x65, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x41, 0x50, 0x49, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x50, 0x49, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x57, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43,
+	0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x42, 0x43, 0x6f, 0x6e, 0x6e,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50,
+	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1e,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74,
+	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54,
 	0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
-	0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
-	0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
-	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73,
-	0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73,
-	0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6c, 0x0a, 0x1b, 0x47, 0x65,
+	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
 	0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66,
-	0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71,
-	0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76,
-	0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e,
-	0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50,
-	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65,
-	0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
-	0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
-	0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74,
-	0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x42, 0x12, 0x5a, 0x10, 0x2e, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x6c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42,
+	0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x45, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x66, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+	0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12,
+	0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74,
+	0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
+	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x12, 0x5a, 0x10, 0x2e, 0x2f,
+	0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -7951,7 +8101,7 @@ func file_proto_registration_proto_rawDescGZIP() []byte {
 	return file_proto_registration_proto_rawDescData
 }
 
-var file_proto_registration_proto_msgTypes = make([]protoimpl.MessageInfo, 96)
+var file_proto_registration_proto_msgTypes = make([]protoimpl.MessageInfo, 98)
 var file_proto_registration_proto_goTypes = []interface{}{
 	(*CreateDBConnReq)(nil),                 // 0: proto.CreateDBConnReq
 	(*CreateDBConnResp)(nil),                // 1: proto.CreateDBConnResp
@@ -8036,26 +8186,28 @@ var file_proto_registration_proto_goTypes = []interface{}{
 	(*EnterpriseInfo)(nil),                  // 80: proto.EnterpriseInfo
 	(*UpdateAssetReq)(nil),                  // 81: proto.UpdateAssetReq
 	(*UpdateAssetResp)(nil),                 // 82: proto.UpdateAssetResp
-	(*GetPrivateDBConnInfoReq)(nil),         // 83: proto.GetPrivateDBConnInfoReq
-	(*GetPrivateDBConnInfoResp)(nil),        // 84: proto.GetPrivateDBConnInfoResp
-	(*PrivateDBConnInfo)(nil),               // 85: proto.PrivateDBConnInfo
-	(*GetPrivateAssetListReq)(nil),          // 86: proto.GetPrivateAssetListReq
-	(*GetPrivateAssetListResp)(nil),         // 87: proto.GetPrivateAssetListResp
-	(*GetPrivateAssetInfoReq)(nil),          // 88: proto.GetPrivateAssetInfoReq
-	(*GetPrivateAssetInfoResp)(nil),         // 89: proto.GetPrivateAssetInfoResp
-	(*GetPrivateAssetInfoByEnNameReq)(nil),  // 90: proto.GetPrivateAssetInfoByEnNameReq
-	(*GetPrivateAssetInfoByEnNameResp)(nil), // 91: proto.GetPrivateAssetInfoByEnNameResp
-	(*GetPrivateEnterpriseAssetReq)(nil),    // 92: proto.GetPrivateEnterpriseAssetReq
-	(*GetPrivateEnterpriseAssetResp)(nil),   // 93: proto.GetPrivateEnterpriseAssetResp
-	(*PrivateEnterprise)(nil),               // 94: proto.PrivateEnterprise
-	(*EnterpriseAsset)(nil),                 // 95: proto.EnterpriseAsset
-	(*commonpb.Filter)(nil),                 // 96: proto.Filter
-	(*commonpb.Pagination)(nil),             // 97: proto.Pagination
+	(*APITestReq)(nil),                      // 83: proto.APITestReq
+	(*APITestResp)(nil),                     // 84: proto.APITestResp
+	(*GetPrivateDBConnInfoReq)(nil),         // 85: proto.GetPrivateDBConnInfoReq
+	(*GetPrivateDBConnInfoResp)(nil),        // 86: proto.GetPrivateDBConnInfoResp
+	(*PrivateDBConnInfo)(nil),               // 87: proto.PrivateDBConnInfo
+	(*GetPrivateAssetListReq)(nil),          // 88: proto.GetPrivateAssetListReq
+	(*GetPrivateAssetListResp)(nil),         // 89: proto.GetPrivateAssetListResp
+	(*GetPrivateAssetInfoReq)(nil),          // 90: proto.GetPrivateAssetInfoReq
+	(*GetPrivateAssetInfoResp)(nil),         // 91: proto.GetPrivateAssetInfoResp
+	(*GetPrivateAssetInfoByEnNameReq)(nil),  // 92: proto.GetPrivateAssetInfoByEnNameReq
+	(*GetPrivateAssetInfoByEnNameResp)(nil), // 93: proto.GetPrivateAssetInfoByEnNameResp
+	(*GetPrivateEnterpriseAssetReq)(nil),    // 94: proto.GetPrivateEnterpriseAssetReq
+	(*GetPrivateEnterpriseAssetResp)(nil),   // 95: proto.GetPrivateEnterpriseAssetResp
+	(*PrivateEnterprise)(nil),               // 96: proto.PrivateEnterprise
+	(*EnterpriseAsset)(nil),                 // 97: proto.EnterpriseAsset
+	(*commonpb.Filter)(nil),                 // 98: proto.Filter
+	(*commonpb.Pagination)(nil),             // 99: proto.Pagination
 }
 var file_proto_registration_proto_depIdxs = []int32{
-	96, // 0: proto.GetDBConnListReq.filters:type_name -> proto.Filter
+	98, // 0: proto.GetDBConnListReq.filters:type_name -> proto.Filter
 	4,  // 1: proto.GetDBConnListResp.data:type_name -> proto.DBConnListData
-	97, // 2: proto.DBConnListData.pagination:type_name -> proto.Pagination
+	99, // 2: proto.DBConnListData.pagination:type_name -> proto.Pagination
 	5,  // 3: proto.DBConnListData.list:type_name -> proto.DBConn
 	8,  // 4: proto.GetDBConnInfoResp.data:type_name -> proto.DBConnInfo
 	15, // 5: proto.GetIndustryListResp.data:type_name -> proto.IndustryItem
@@ -8074,9 +8226,9 @@ var file_proto_registration_proto_depIdxs = []int32{
 	47, // 18: proto.SaveTableColumnsReq.list:type_name -> proto.SaveTableColumnItem
 	47, // 19: proto.UpdateTableColumnsReq.list:type_name -> proto.SaveTableColumnItem
 	59, // 20: proto.AssetUploadResp.data:type_name -> proto.AssetUpload
-	96, // 21: proto.AssetListReq.filters:type_name -> proto.Filter
+	98, // 21: proto.AssetListReq.filters:type_name -> proto.Filter
 	64, // 22: proto.AssetListResp.data:type_name -> proto.AssetList
-	97, // 23: proto.AssetList.pagination:type_name -> proto.Pagination
+	99, // 23: proto.AssetList.pagination:type_name -> proto.Pagination
 	65, // 24: proto.AssetList.list:type_name -> proto.AssetItem
 	66, // 25: proto.AssetItem.asset_users:type_name -> proto.AssetUser
 	67, // 26: proto.AssetItem.asset_operators:type_name -> proto.AssetOperator
@@ -8094,20 +8246,20 @@ var file_proto_registration_proto_depIdxs = []int32{
 	8,  // 38: proto.DataSetInfo.db_conn_info:type_name -> proto.DBConnInfo
 	47, // 39: proto.DataSetInfo.items:type_name -> proto.SaveTableColumnItem
 	74, // 40: proto.CertificationInfo.file_info:type_name -> proto.FileInfo
-	96, // 41: proto.GetEnterpriseListReq.filters:type_name -> proto.Filter
+	98, // 41: proto.GetEnterpriseListReq.filters:type_name -> proto.Filter
 	79, // 42: proto.GetEnterpriseListResp.data:type_name -> proto.EnterpriseList
-	97, // 43: proto.EnterpriseList.pagination:type_name -> proto.Pagination
+	99, // 43: proto.EnterpriseList.pagination:type_name -> proto.Pagination
 	80, // 44: proto.EnterpriseList.list:type_name -> proto.EnterpriseInfo
 	36, // 45: proto.UpdateAssetReq.asset_base_info:type_name -> proto.AssetBaseInfo
 	37, // 46: proto.UpdateAssetReq.asset_data_info:type_name -> proto.AssetDataInfo
 	38, // 47: proto.UpdateAssetReq.asset_file_info:type_name -> proto.AssetFileInfo
-	85, // 48: proto.GetPrivateDBConnInfoResp.data:type_name -> proto.PrivateDBConnInfo
-	96, // 49: proto.GetPrivateAssetListReq.filters:type_name -> proto.Filter
+	87, // 48: proto.GetPrivateDBConnInfoResp.data:type_name -> proto.PrivateDBConnInfo
+	98, // 49: proto.GetPrivateAssetListReq.filters:type_name -> proto.Filter
 	64, // 50: proto.GetPrivateAssetListResp.data:type_name -> proto.AssetList
 	70, // 51: proto.GetPrivateAssetInfoResp.data:type_name -> proto.AssetInfo
 	70, // 52: proto.GetPrivateAssetInfoByEnNameResp.data:type_name -> proto.AssetInfo
-	94, // 53: proto.GetPrivateEnterpriseAssetResp.data:type_name -> proto.PrivateEnterprise
-	95, // 54: proto.PrivateEnterprise.asset_list:type_name -> proto.EnterpriseAsset
+	96, // 53: proto.GetPrivateEnterpriseAssetResp.data:type_name -> proto.PrivateEnterprise
+	97, // 54: proto.PrivateEnterprise.asset_list:type_name -> proto.EnterpriseAsset
 	0,  // 55: proto.Registration.CreateDBConn:input_type -> proto.CreateDBConnReq
 	2,  // 56: proto.Registration.GetDBConnList:input_type -> proto.GetDBConnListReq
 	6,  // 57: proto.Registration.GetDBConnInfo:input_type -> proto.GetDBConnInfoReq
@@ -8134,44 +8286,46 @@ var file_proto_registration_proto_depIdxs = []int32{
 	68, // 78: proto.Registration.AssetInfo:input_type -> proto.AssetInfoReq
 	77, // 79: proto.Registration.GetEnterpriseList:input_type -> proto.GetEnterpriseListReq
 	81, // 80: proto.Registration.UpdateAsset:input_type -> proto.UpdateAssetReq
-	83, // 81: proto.Registration.GetPrivateDBConnInfo:input_type -> proto.GetPrivateDBConnInfoReq
-	86, // 82: proto.Registration.GetPrivateAssetList:input_type -> proto.GetPrivateAssetListReq
-	88, // 83: proto.Registration.GetPrivateAssetInfo:input_type -> proto.GetPrivateAssetInfoReq
-	90, // 84: proto.Registration.GetPrivateAssetInfoByEnName:input_type -> proto.GetPrivateAssetInfoByEnNameReq
-	92, // 85: proto.Registration.GetPrivateEnterpriseAsset:input_type -> proto.GetPrivateEnterpriseAssetReq
-	1,  // 86: proto.Registration.CreateDBConn:output_type -> proto.CreateDBConnResp
-	3,  // 87: proto.Registration.GetDBConnList:output_type -> proto.GetDBConnListResp
-	7,  // 88: proto.Registration.GetDBConnInfo:output_type -> proto.GetDBConnInfoResp
-	10, // 89: proto.Registration.DeleteDBConn:output_type -> proto.DeleteDBConnResp
-	12, // 90: proto.Registration.TestDBConn:output_type -> proto.TestDBConnResp
-	14, // 91: proto.Registration.GetIndustryList:output_type -> proto.GetIndustryListResp
-	17, // 92: proto.Registration.GetUserCategoryList:output_type -> proto.GetUserCategoryListResp
-	20, // 93: proto.Registration.GetAssetTypeList:output_type -> proto.GetAssetTypeListResp
-	23, // 94: proto.Registration.GetDataFormatList:output_type -> proto.GetDataFormatListResp
-	26, // 95: proto.Registration.GetSourceTypeList:output_type -> proto.GetSourceTypeListResp
-	29, // 96: proto.Registration.GetDataScaleUnitList:output_type -> proto.GetDataScaleUnitListResp
-	32, // 97: proto.Registration.GetUpdateCycleUnitList:output_type -> proto.GetUpdateCycleUnitListResp
-	39, // 98: proto.Registration.CreateAsset:output_type -> proto.CreateAssetResp
-	42, // 99: proto.Registration.GetDBTableList:output_type -> proto.GetDBTableListResp
-	44, // 100: proto.Registration.GetTableColumns:output_type -> proto.GetTableColumnsResp
-	48, // 101: proto.Registration.SaveTableColumns:output_type -> proto.SaveTableColumnsResp
-	50, // 102: proto.Registration.SaveAPI:output_type -> proto.SaveAPIResp
-	52, // 103: proto.Registration.UpdateTableColumns:output_type -> proto.UpdateTableColumnsResp
-	54, // 104: proto.Registration.updateAPI:output_type -> proto.updateAPIResp
-	56, // 105: proto.Registration.DeleteAsset:output_type -> proto.DeleteAssetResp
-	58, // 106: proto.Registration.AssetUpload:output_type -> proto.AssetUploadResp
-	61, // 107: proto.Registration.certificate:output_type -> proto.certificateResp
-	63, // 108: proto.Registration.AssetList:output_type -> proto.AssetListResp
-	69, // 109: proto.Registration.AssetInfo:output_type -> proto.AssetInfoResp
-	78, // 110: proto.Registration.GetEnterpriseList:output_type -> proto.GetEnterpriseListResp
-	82, // 111: proto.Registration.UpdateAsset:output_type -> proto.UpdateAssetResp
-	84, // 112: proto.Registration.GetPrivateDBConnInfo:output_type -> proto.GetPrivateDBConnInfoResp
-	87, // 113: proto.Registration.GetPrivateAssetList:output_type -> proto.GetPrivateAssetListResp
-	89, // 114: proto.Registration.GetPrivateAssetInfo:output_type -> proto.GetPrivateAssetInfoResp
-	91, // 115: proto.Registration.GetPrivateAssetInfoByEnName:output_type -> proto.GetPrivateAssetInfoByEnNameResp
-	93, // 116: proto.Registration.GetPrivateEnterpriseAsset:output_type -> proto.GetPrivateEnterpriseAssetResp
-	86, // [86:117] is the sub-list for method output_type
-	55, // [55:86] is the sub-list for method input_type
+	83, // 81: proto.Registration.APITest:input_type -> proto.APITestReq
+	85, // 82: proto.Registration.GetPrivateDBConnInfo:input_type -> proto.GetPrivateDBConnInfoReq
+	88, // 83: proto.Registration.GetPrivateAssetList:input_type -> proto.GetPrivateAssetListReq
+	90, // 84: proto.Registration.GetPrivateAssetInfo:input_type -> proto.GetPrivateAssetInfoReq
+	92, // 85: proto.Registration.GetPrivateAssetInfoByEnName:input_type -> proto.GetPrivateAssetInfoByEnNameReq
+	94, // 86: proto.Registration.GetPrivateEnterpriseAsset:input_type -> proto.GetPrivateEnterpriseAssetReq
+	1,  // 87: proto.Registration.CreateDBConn:output_type -> proto.CreateDBConnResp
+	3,  // 88: proto.Registration.GetDBConnList:output_type -> proto.GetDBConnListResp
+	7,  // 89: proto.Registration.GetDBConnInfo:output_type -> proto.GetDBConnInfoResp
+	10, // 90: proto.Registration.DeleteDBConn:output_type -> proto.DeleteDBConnResp
+	12, // 91: proto.Registration.TestDBConn:output_type -> proto.TestDBConnResp
+	14, // 92: proto.Registration.GetIndustryList:output_type -> proto.GetIndustryListResp
+	17, // 93: proto.Registration.GetUserCategoryList:output_type -> proto.GetUserCategoryListResp
+	20, // 94: proto.Registration.GetAssetTypeList:output_type -> proto.GetAssetTypeListResp
+	23, // 95: proto.Registration.GetDataFormatList:output_type -> proto.GetDataFormatListResp
+	26, // 96: proto.Registration.GetSourceTypeList:output_type -> proto.GetSourceTypeListResp
+	29, // 97: proto.Registration.GetDataScaleUnitList:output_type -> proto.GetDataScaleUnitListResp
+	32, // 98: proto.Registration.GetUpdateCycleUnitList:output_type -> proto.GetUpdateCycleUnitListResp
+	39, // 99: proto.Registration.CreateAsset:output_type -> proto.CreateAssetResp
+	42, // 100: proto.Registration.GetDBTableList:output_type -> proto.GetDBTableListResp
+	44, // 101: proto.Registration.GetTableColumns:output_type -> proto.GetTableColumnsResp
+	48, // 102: proto.Registration.SaveTableColumns:output_type -> proto.SaveTableColumnsResp
+	50, // 103: proto.Registration.SaveAPI:output_type -> proto.SaveAPIResp
+	52, // 104: proto.Registration.UpdateTableColumns:output_type -> proto.UpdateTableColumnsResp
+	54, // 105: proto.Registration.updateAPI:output_type -> proto.updateAPIResp
+	56, // 106: proto.Registration.DeleteAsset:output_type -> proto.DeleteAssetResp
+	58, // 107: proto.Registration.AssetUpload:output_type -> proto.AssetUploadResp
+	61, // 108: proto.Registration.certificate:output_type -> proto.certificateResp
+	63, // 109: proto.Registration.AssetList:output_type -> proto.AssetListResp
+	69, // 110: proto.Registration.AssetInfo:output_type -> proto.AssetInfoResp
+	78, // 111: proto.Registration.GetEnterpriseList:output_type -> proto.GetEnterpriseListResp
+	82, // 112: proto.Registration.UpdateAsset:output_type -> proto.UpdateAssetResp
+	84, // 113: proto.Registration.APITest:output_type -> proto.APITestResp
+	86, // 114: proto.Registration.GetPrivateDBConnInfo:output_type -> proto.GetPrivateDBConnInfoResp
+	89, // 115: proto.Registration.GetPrivateAssetList:output_type -> proto.GetPrivateAssetListResp
+	91, // 116: proto.Registration.GetPrivateAssetInfo:output_type -> proto.GetPrivateAssetInfoResp
+	93, // 117: proto.Registration.GetPrivateAssetInfoByEnName:output_type -> proto.GetPrivateAssetInfoByEnNameResp
+	95, // 118: proto.Registration.GetPrivateEnterpriseAsset:output_type -> proto.GetPrivateEnterpriseAssetResp
+	87, // [87:119] is the sub-list for method output_type
+	55, // [55:87] is the sub-list for method input_type
 	55, // [55:55] is the sub-list for extension type_name
 	55, // [55:55] is the sub-list for extension extendee
 	0,  // [0:55] is the sub-list for field type_name
@@ -9180,7 +9334,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateDBConnInfoReq); i {
+			switch v := v.(*APITestReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9192,7 +9346,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateDBConnInfoResp); i {
+			switch v := v.(*APITestResp); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9204,7 +9358,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PrivateDBConnInfo); i {
+			switch v := v.(*GetPrivateDBConnInfoReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9216,7 +9370,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetListReq); i {
+			switch v := v.(*GetPrivateDBConnInfoResp); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9228,7 +9382,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetListResp); i {
+			switch v := v.(*PrivateDBConnInfo); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9240,7 +9394,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetInfoReq); i {
+			switch v := v.(*GetPrivateAssetListReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9252,7 +9406,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetInfoResp); i {
+			switch v := v.(*GetPrivateAssetListResp); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9264,7 +9418,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetInfoByEnNameReq); i {
+			switch v := v.(*GetPrivateAssetInfoReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9276,7 +9430,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateAssetInfoByEnNameResp); i {
+			switch v := v.(*GetPrivateAssetInfoResp); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9288,7 +9442,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateEnterpriseAssetReq); i {
+			switch v := v.(*GetPrivateAssetInfoByEnNameReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9300,7 +9454,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPrivateEnterpriseAssetResp); i {
+			switch v := v.(*GetPrivateAssetInfoByEnNameResp); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9312,7 +9466,7 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PrivateEnterprise); i {
+			switch v := v.(*GetPrivateEnterpriseAssetReq); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -9324,6 +9478,30 @@ func file_proto_registration_proto_init() {
 			}
 		}
 		file_proto_registration_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPrivateEnterpriseAssetResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_registration_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PrivateEnterprise); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_registration_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnterpriseAsset); i {
 			case 0:
 				return &v.state
@@ -9342,7 +9520,7 @@ func file_proto_registration_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_proto_registration_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   96,
+			NumMessages:   98,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/pb/registrationpb/registration_grpc.pb.go b/pb/registrationpb/registration_grpc.pb.go
index 48b0078bf1dd07c4f742f45e8274d6541393191b..488c6faf205d96fe07562c8654c0d29684775ef2 100644
--- a/pb/registrationpb/registration_grpc.pb.go
+++ b/pb/registrationpb/registration_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.21.12
+// - protoc             v4.25.3
 // source: proto/registration.proto
 
 // 琛ㄧず褰撳墠 proto 鏂囦欢灞炰簬 protobuf 鍖咃紝瀹冧笉鏄� go 鏂囦欢鐨� package
@@ -48,6 +48,7 @@ const (
 	Registration_AssetInfo_FullMethodName                   = "/proto.Registration/AssetInfo"
 	Registration_GetEnterpriseList_FullMethodName           = "/proto.Registration/GetEnterpriseList"
 	Registration_UpdateAsset_FullMethodName                 = "/proto.Registration/UpdateAsset"
+	Registration_APITest_FullMethodName                     = "/proto.Registration/APITest"
 	Registration_GetPrivateDBConnInfo_FullMethodName        = "/proto.Registration/GetPrivateDBConnInfo"
 	Registration_GetPrivateAssetList_FullMethodName         = "/proto.Registration/GetPrivateAssetList"
 	Registration_GetPrivateAssetInfo_FullMethodName         = "/proto.Registration/GetPrivateAssetInfo"
@@ -114,6 +115,8 @@ type RegistrationClient interface {
 	GetEnterpriseList(ctx context.Context, in *GetEnterpriseListReq, opts ...grpc.CallOption) (*GetEnterpriseListResp, error)
 	// 14. 鏁版嵁璧勪骇缂栬緫鎺ュ彛
 	UpdateAsset(ctx context.Context, in *UpdateAssetReq, opts ...grpc.CallOption) (*UpdateAssetResp, error)
+	// 15. API杩炴帴娴嬭瘯
+	APITest(ctx context.Context, in *APITestReq, opts ...grpc.CallOption) (*APITestResp, error)
 	// 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 	GetPrivateDBConnInfo(ctx context.Context, in *GetPrivateDBConnInfoReq, opts ...grpc.CallOption) (*GetPrivateDBConnInfoResp, error)
 	// 2. 鑾峰彇閾句笂璧勪骇鍒楄〃
@@ -368,6 +371,15 @@ func (c *registrationClient) UpdateAsset(ctx context.Context, in *UpdateAssetReq
 	return out, nil
 }
 
+func (c *registrationClient) APITest(ctx context.Context, in *APITestReq, opts ...grpc.CallOption) (*APITestResp, error) {
+	out := new(APITestResp)
+	err := c.cc.Invoke(ctx, Registration_APITest_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *registrationClient) GetPrivateDBConnInfo(ctx context.Context, in *GetPrivateDBConnInfoReq, opts ...grpc.CallOption) (*GetPrivateDBConnInfoResp, error) {
 	out := new(GetPrivateDBConnInfoResp)
 	err := c.cc.Invoke(ctx, Registration_GetPrivateDBConnInfo_FullMethodName, in, out, opts...)
@@ -472,6 +484,8 @@ type RegistrationServer interface {
 	GetEnterpriseList(context.Context, *GetEnterpriseListReq) (*GetEnterpriseListResp, error)
 	// 14. 鏁版嵁璧勪骇缂栬緫鎺ュ彛
 	UpdateAsset(context.Context, *UpdateAssetReq) (*UpdateAssetResp, error)
+	// 15. API杩炴帴娴嬭瘯
+	APITest(context.Context, *APITestReq) (*APITestResp, error)
 	// 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 	GetPrivateDBConnInfo(context.Context, *GetPrivateDBConnInfoReq) (*GetPrivateDBConnInfoResp, error)
 	// 2. 鑾峰彇閾句笂璧勪骇鍒楄〃
@@ -567,6 +581,9 @@ func (UnimplementedRegistrationServer) GetEnterpriseList(context.Context, *GetEn
 func (UnimplementedRegistrationServer) UpdateAsset(context.Context, *UpdateAssetReq) (*UpdateAssetResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateAsset not implemented")
 }
+func (UnimplementedRegistrationServer) APITest(context.Context, *APITestReq) (*APITestResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method APITest not implemented")
+}
 func (UnimplementedRegistrationServer) GetPrivateDBConnInfo(context.Context, *GetPrivateDBConnInfoReq) (*GetPrivateDBConnInfoResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetPrivateDBConnInfo not implemented")
 }
@@ -1063,6 +1080,24 @@ func _Registration_UpdateAsset_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Registration_APITest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(APITestReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RegistrationServer).APITest(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: Registration_APITest_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RegistrationServer).APITest(ctx, req.(*APITestReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Registration_GetPrivateDBConnInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(GetPrivateDBConnInfoReq)
 	if err := dec(in); err != nil {
@@ -1264,6 +1299,10 @@ var Registration_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "UpdateAsset",
 			Handler:    _Registration_UpdateAsset_Handler,
 		},
+		{
+			MethodName: "APITest",
+			Handler:    _Registration_APITest_Handler,
+		},
 		{
 			MethodName: "GetPrivateDBConnInfo",
 			Handler:    _Registration_GetPrivateDBConnInfo_Handler,
diff --git a/proto/registration.proto b/proto/registration.proto
index 23e05d20675a224ebeaa257cf94247ec7d86382c..6e445fe24e604eb29a100ea2cf55265894c3a3e9 100644
--- a/proto/registration.proto
+++ b/proto/registration.proto
@@ -656,6 +656,19 @@ message UpdateAssetResp{
   string data = 3;
 }
 
+// 15. API杩炴帴娴嬭瘯
+message APITestReq{
+  string request_id = 1;
+  string header = 3; // header
+  string url = 4; // API鍦板潃
+  string method = 5; // 璇锋眰鏂瑰紡锛� GET銆丳OST绛�
+}
+
+message APITestResp{
+  int32 code = 1;
+  string msg = 2;
+  string data = 3;
+}
 
 // ============== 闅愮璁$畻 ============== //
 
@@ -829,6 +842,8 @@ service Registration {
   // 14. 鏁版嵁璧勪骇缂栬緫鎺ュ彛
   rpc UpdateAsset(UpdateAssetReq) returns (UpdateAssetResp);
 
+  // 15. API杩炴帴娴嬭瘯
+  rpc APITest(APITestReq) returns (APITestResp);
 
   // ============== 闅愮璁$畻 ============== //
 
diff --git a/registration/registration.go b/registration/registration.go
index 661a24321bafc11e88c24af604ee25c7f7f78d14..c622aa93701c353481e9489b61f8e0de9b41b8a9 100644
--- a/registration/registration.go
+++ b/registration/registration.go
@@ -13,6 +13,8 @@ import (
 )
 
 type (
+	APITestReq                      = registrationpb.APITestReq
+	APITestResp                     = registrationpb.APITestResp
 	AssetBaseInfo                   = registrationpb.AssetBaseInfo
 	AssetDataInfo                   = registrationpb.AssetDataInfo
 	AssetFileInfo                   = registrationpb.AssetFileInfo
@@ -163,6 +165,8 @@ type (
 		GetEnterpriseList(ctx context.Context, in *GetEnterpriseListReq, opts ...grpc.CallOption) (*GetEnterpriseListResp, error)
 		// 14. 鏁版嵁璧勪骇缂栬緫鎺ュ彛
 		UpdateAsset(ctx context.Context, in *UpdateAssetReq, opts ...grpc.CallOption) (*UpdateAssetResp, error)
+		// 15. API杩炴帴娴嬭瘯
+		APITest(ctx context.Context, in *APITestReq, opts ...grpc.CallOption) (*APITestResp, error)
 		// 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 		GetPrivateDBConnInfo(ctx context.Context, in *GetPrivateDBConnInfoReq, opts ...grpc.CallOption) (*GetPrivateDBConnInfoResp, error)
 		// 2. 鑾峰彇閾句笂璧勪骇鍒楄〃
@@ -342,6 +346,12 @@ func (m *defaultRegistration) UpdateAsset(ctx context.Context, in *UpdateAssetRe
 	return client.UpdateAsset(ctx, in, opts...)
 }
 
+// 15. API杩炴帴娴嬭瘯
+func (m *defaultRegistration) APITest(ctx context.Context, in *APITestReq, opts ...grpc.CallOption) (*APITestResp, error) {
+	client := registrationpb.NewRegistrationClient(m.cli.Conn())
+	return client.APITest(ctx, in, opts...)
+}
+
 // 1. 鑾峰彇鍖呭惈闅愮淇℃伅鐨勬暟鎹簮杩炴帴淇℃伅鎺ュ彛
 func (m *defaultRegistration) GetPrivateDBConnInfo(ctx context.Context, in *GetPrivateDBConnInfoReq, opts ...grpc.CallOption) (*GetPrivateDBConnInfoResp, error) {
 	client := registrationpb.NewRegistrationClient(m.cli.Conn())