Loading go-apps/meep-platform-ctrl/main.go +2 −2 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ func main() { priAccessMap := map[string]string{} if altServ != "" { priAccessMap = map[string]string{ "Index": ss.AccessGrant, "Index": ss.AccessBlock, "CreateSandbox": ss.AccessBlock, "DeleteSandbox": ss.AccessBlock, "DeleteSandboxList": ss.AccessBlock, Loading @@ -117,7 +117,7 @@ func main() { "CreateScenario": ss.AccessBlock, "DeleteScenario": ss.AccessBlock, "DeleteScenarioList": ss.AccessBlock, "GetScenario": ss.AccessBlock, "GetScenario": ss.AccessVerify, "GetScenarioList": ss.AccessVerify, "SetScenario": ss.AccessBlock, "LoginUser": ss.AccessGrant, Loading go-apps/meep-sandbox-ctrl/go.mod +2 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-replay-manager v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-store v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions v0.0.0 github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.7.3 ) Loading @@ -29,4 +30,5 @@ replace ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-replay-manager => ../../go-packages/meep-replay-manager github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client => ../../go-packages/meep-sandbox-ctrl-client github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-store => ../../go-packages/meep-sandbox-store github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions => ../../go-packages/meep-sessions ) go-apps/meep-sandbox-ctrl/go.sum +6 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZs github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= Loading @@ -39,6 +43,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= Loading go-apps/meep-sandbox-ctrl/main.go +25 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import ( server "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-sandbox-ctrl/server" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ss "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions" "github.com/gorilla/handlers" ) Loading Loading @@ -81,7 +82,8 @@ func main() { go func() { log.Info("Starting Alt-server on port " + altServ) log.Info("Alt-serving [sw:" + altSw) secRouter := server.NewRouter(altSw) secAccessMap := map[string]string{} secRouter := server.NewRouter(altSw, secAccessMap) methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"}) header := handlers.AllowedHeaders([]string{"content-type"}) log.Fatal(http.ListenAndServe(":"+altServ, handlers.CORS(methods, header)(secRouter))) Loading @@ -92,7 +94,28 @@ func main() { // Start primary REST API Server log.Info("Starting Primary-server on port 80") log.Info("Primary-serving [sw:" + priSw) router := server.NewRouter(priSw) priAccessMap := map[string]string{} if altServ != "" { priAccessMap = map[string]string{ "Index": ss.AccessBlock, "ActivateScenario": ss.AccessVerify, "GetActiveNodeServiceMaps": ss.AccessBlock, "GetActiveScenario": ss.AccessVerify, "TerminateScenario": ss.AccessVerify, "CreateReplayFile": ss.AccessBlock, "CreateReplayFileFromScenarioExec": ss.AccessBlock, "DeleteReplayFile": ss.AccessBlock, "DeleteReplayFileList": ss.AccessBlock, "GetReplayFile": ss.AccessBlock, "GetReplayFileList": ss.AccessBlock, "GetReplayStatus": ss.AccessBlock, "LoopReplay": ss.AccessBlock, "PlayReplayFile": ss.AccessBlock, "StopReplayFile": ss.AccessBlock, "SendEvent": ss.AccessVerify, } } router := server.NewRouter(priSw, priAccessMap) methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"}) header := handlers.AllowedHeaders([]string{"content-type"}) log.Fatal(http.ListenAndServe(":80", handlers.CORS(methods, header)(router))) Loading go-apps/meep-sandbox-ctrl/server/routers.go +32 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import ( "strings" "github.com/gorilla/mux" ss "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions" ) type Route struct { Loading @@ -37,16 +39,29 @@ type Route struct { Method string Pattern string HandlerFunc http.HandlerFunc AccessType string } type Routes []Route func NewRouter(swDir string) *mux.Router { func NewRouter(swDir string, accessMap map[string]string) *mux.Router { router := mux.NewRouter().StrictSlash(true) for _, route := range routes { var handler http.Handler = Logger(route.HandlerFunc, route.Name) // Authorization accessType, found := accessMap[route.Name] if !found { accessType = route.AccessType } if accessType == ss.AccessBlock { handler = sbxCtrl.sessionStore.AccessBlocker(handler) } else if accessType == ss.AccessVerify { handler = sbxCtrl.sessionStore.AccessVerifier(handler) } router. Methods(route.Method). Path(route.Pattern). Loading @@ -72,6 +87,7 @@ var routes = Routes{ "GET", "/sandbox-ctrl/v1/", Index, ss.AccessGrant, }, Route{ Loading @@ -79,6 +95,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/active/{name}", ActivateScenario, ss.AccessGrant, }, Route{ Loading @@ -86,6 +103,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/active/serviceMaps", GetActiveNodeServiceMaps, ss.AccessGrant, }, Route{ Loading @@ -93,6 +111,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/active", GetActiveScenario, ss.AccessGrant, }, Route{ Loading @@ -100,6 +119,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/active", TerminateScenario, ss.AccessGrant, }, Route{ Loading @@ -107,6 +127,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}", CreateReplayFile, ss.AccessGrant, }, Route{ Loading @@ -114,6 +135,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/generate", CreateReplayFileFromScenarioExec, ss.AccessGrant, }, Route{ Loading @@ -121,6 +143,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/replay/{name}", DeleteReplayFile, ss.AccessGrant, }, Route{ Loading @@ -128,6 +151,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/replay", DeleteReplayFileList, ss.AccessGrant, }, Route{ Loading @@ -135,6 +159,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replay/{name}", GetReplayFile, ss.AccessGrant, }, Route{ Loading @@ -142,6 +167,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replay", GetReplayFileList, ss.AccessGrant, }, Route{ Loading @@ -149,6 +175,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replaystatus", GetReplayStatus, ss.AccessGrant, }, Route{ Loading @@ -156,6 +183,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/loop", LoopReplay, ss.AccessGrant, }, Route{ Loading @@ -163,6 +191,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/play", PlayReplayFile, ss.AccessGrant, }, Route{ Loading @@ -170,6 +199,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/stop", StopReplayFile, ss.AccessGrant, }, Route{ Loading @@ -177,5 +207,6 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/events/{type}", SendEvent, ss.AccessGrant, }, } Loading
go-apps/meep-platform-ctrl/main.go +2 −2 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ func main() { priAccessMap := map[string]string{} if altServ != "" { priAccessMap = map[string]string{ "Index": ss.AccessGrant, "Index": ss.AccessBlock, "CreateSandbox": ss.AccessBlock, "DeleteSandbox": ss.AccessBlock, "DeleteSandboxList": ss.AccessBlock, Loading @@ -117,7 +117,7 @@ func main() { "CreateScenario": ss.AccessBlock, "DeleteScenario": ss.AccessBlock, "DeleteScenarioList": ss.AccessBlock, "GetScenario": ss.AccessBlock, "GetScenario": ss.AccessVerify, "GetScenarioList": ss.AccessVerify, "SetScenario": ss.AccessBlock, "LoginUser": ss.AccessGrant, Loading
go-apps/meep-sandbox-ctrl/go.mod +2 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ require ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-replay-manager v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-store v0.0.0 github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions v0.0.0 github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.7.3 ) Loading @@ -29,4 +30,5 @@ replace ( github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-replay-manager => ../../go-packages/meep-replay-manager github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client => ../../go-packages/meep-sandbox-ctrl-client github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-store => ../../go-packages/meep-sandbox-store github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions => ../../go-packages/meep-sessions )
go-apps/meep-sandbox-ctrl/go.sum +6 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZs github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= Loading @@ -39,6 +43,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= Loading
go-apps/meep-sandbox-ctrl/main.go +25 −2 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import ( server "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-sandbox-ctrl/server" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ss "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions" "github.com/gorilla/handlers" ) Loading Loading @@ -81,7 +82,8 @@ func main() { go func() { log.Info("Starting Alt-server on port " + altServ) log.Info("Alt-serving [sw:" + altSw) secRouter := server.NewRouter(altSw) secAccessMap := map[string]string{} secRouter := server.NewRouter(altSw, secAccessMap) methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"}) header := handlers.AllowedHeaders([]string{"content-type"}) log.Fatal(http.ListenAndServe(":"+altServ, handlers.CORS(methods, header)(secRouter))) Loading @@ -92,7 +94,28 @@ func main() { // Start primary REST API Server log.Info("Starting Primary-server on port 80") log.Info("Primary-serving [sw:" + priSw) router := server.NewRouter(priSw) priAccessMap := map[string]string{} if altServ != "" { priAccessMap = map[string]string{ "Index": ss.AccessBlock, "ActivateScenario": ss.AccessVerify, "GetActiveNodeServiceMaps": ss.AccessBlock, "GetActiveScenario": ss.AccessVerify, "TerminateScenario": ss.AccessVerify, "CreateReplayFile": ss.AccessBlock, "CreateReplayFileFromScenarioExec": ss.AccessBlock, "DeleteReplayFile": ss.AccessBlock, "DeleteReplayFileList": ss.AccessBlock, "GetReplayFile": ss.AccessBlock, "GetReplayFileList": ss.AccessBlock, "GetReplayStatus": ss.AccessBlock, "LoopReplay": ss.AccessBlock, "PlayReplayFile": ss.AccessBlock, "StopReplayFile": ss.AccessBlock, "SendEvent": ss.AccessVerify, } } router := server.NewRouter(priSw, priAccessMap) methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"}) header := handlers.AllowedHeaders([]string{"content-type"}) log.Fatal(http.ListenAndServe(":80", handlers.CORS(methods, header)(router))) Loading
go-apps/meep-sandbox-ctrl/server/routers.go +32 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import ( "strings" "github.com/gorilla/mux" ss "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions" ) type Route struct { Loading @@ -37,16 +39,29 @@ type Route struct { Method string Pattern string HandlerFunc http.HandlerFunc AccessType string } type Routes []Route func NewRouter(swDir string) *mux.Router { func NewRouter(swDir string, accessMap map[string]string) *mux.Router { router := mux.NewRouter().StrictSlash(true) for _, route := range routes { var handler http.Handler = Logger(route.HandlerFunc, route.Name) // Authorization accessType, found := accessMap[route.Name] if !found { accessType = route.AccessType } if accessType == ss.AccessBlock { handler = sbxCtrl.sessionStore.AccessBlocker(handler) } else if accessType == ss.AccessVerify { handler = sbxCtrl.sessionStore.AccessVerifier(handler) } router. Methods(route.Method). Path(route.Pattern). Loading @@ -72,6 +87,7 @@ var routes = Routes{ "GET", "/sandbox-ctrl/v1/", Index, ss.AccessGrant, }, Route{ Loading @@ -79,6 +95,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/active/{name}", ActivateScenario, ss.AccessGrant, }, Route{ Loading @@ -86,6 +103,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/active/serviceMaps", GetActiveNodeServiceMaps, ss.AccessGrant, }, Route{ Loading @@ -93,6 +111,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/active", GetActiveScenario, ss.AccessGrant, }, Route{ Loading @@ -100,6 +119,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/active", TerminateScenario, ss.AccessGrant, }, Route{ Loading @@ -107,6 +127,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}", CreateReplayFile, ss.AccessGrant, }, Route{ Loading @@ -114,6 +135,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/generate", CreateReplayFileFromScenarioExec, ss.AccessGrant, }, Route{ Loading @@ -121,6 +143,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/replay/{name}", DeleteReplayFile, ss.AccessGrant, }, Route{ Loading @@ -128,6 +151,7 @@ var routes = Routes{ strings.ToUpper("Delete"), "/sandbox-ctrl/v1/replay", DeleteReplayFileList, ss.AccessGrant, }, Route{ Loading @@ -135,6 +159,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replay/{name}", GetReplayFile, ss.AccessGrant, }, Route{ Loading @@ -142,6 +167,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replay", GetReplayFileList, ss.AccessGrant, }, Route{ Loading @@ -149,6 +175,7 @@ var routes = Routes{ strings.ToUpper("Get"), "/sandbox-ctrl/v1/replaystatus", GetReplayStatus, ss.AccessGrant, }, Route{ Loading @@ -156,6 +183,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/loop", LoopReplay, ss.AccessGrant, }, Route{ Loading @@ -163,6 +191,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/play", PlayReplayFile, ss.AccessGrant, }, Route{ Loading @@ -170,6 +199,7 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/replay/{name}/stop", StopReplayFile, ss.AccessGrant, }, Route{ Loading @@ -177,5 +207,6 @@ var routes = Routes{ strings.ToUpper("Post"), "/sandbox-ctrl/v1/events/{type}", SendEvent, ss.AccessGrant, }, }