You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/04/02 21:14:21 UTC

[GitHub] mrutkows closed pull request #834: Adding support for conductor, web sequences, and converting to web actions for api gateway

mrutkows closed pull request #834: Adding support for conductor, web sequences, and converting to web actions for api gateway
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/834
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index c9f02681..1f9171da 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -78,7 +78,7 @@ func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, manifestP
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	sequences, err := manifestParser.ComposeSequencesFromAllPackages(deployer.serviceDeployer.ClientConfig.Namespace, manifest, managedAnnotations)
+	sequences, err := manifestParser.ComposeSequencesFromAllPackages(deployer.serviceDeployer.ClientConfig.Namespace, manifest, deployer.serviceDeployer.ManifestPath, managedAnnotations)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index 9cfa6732..b46f73a6 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -142,7 +142,7 @@ func (dm *YAMLParser) composeAnnotations(annotations map[string]interface{}) whi
 	return listOfAnnotations
 }
 
-func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, ma whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, managedAnnotations whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
 	dependencies := make(map[string]utils.DependencyRecord)
 	packages := make(map[string]Package)
 
@@ -153,7 +153,7 @@ func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, project
 	}
 
 	for n, p := range packages {
-		d, err := dm.ComposeDependencies(p, projectPath, filePath, n, ma)
+		d, err := dm.ComposeDependencies(p, projectPath, filePath, n, managedAnnotations)
 		if err == nil {
 			for k, v := range d {
 				dependencies[k] = v
@@ -165,7 +165,7 @@ func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, project
 	return dependencies, nil
 }
 
-func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, ma whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, managedAnnotations whisk.KeyValue) (map[string]utils.DependencyRecord, error) {
 
 	depMap := make(map[string]utils.DependencyRecord)
 	for key, dependency := range pkg.Dependencies {
@@ -203,7 +203,7 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
 		annotations := dm.composeAnnotations(dependency.Annotations)
 
 		if utils.Flags.Managed || utils.Flags.Sync {
-			annotations = append(annotations, ma)
+			annotations = append(annotations, managedAnnotations)
 		}
 
 		packDir := path.Join(projectPath, strings.Title(YAML_KEY_PACKAGES))
@@ -214,7 +214,7 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
 	return depMap, nil
 }
 
-func (dm *YAMLParser) ComposeAllPackages(manifest *YAML, filePath string, ma whisk.KeyValue) (map[string]*whisk.Package, error) {
+func (dm *YAMLParser) ComposeAllPackages(manifest *YAML, filePath string, managedAnnotations whisk.KeyValue) (map[string]*whisk.Package, error) {
 	packages := map[string]*whisk.Package{}
 	manifestPackages := make(map[string]Package)
 
@@ -234,7 +234,7 @@ func (dm *YAMLParser) ComposeAllPackages(manifest *YAML, filePath string, ma whi
 
 	// Compose each package found in manifest
 	for n, p := range manifestPackages {
-		s, err := dm.ComposePackage(p, n, filePath, ma)
+		s, err := dm.ComposePackage(p, n, filePath, managedAnnotations)
 
 		if err == nil {
 			packages[n] = s
@@ -246,7 +246,7 @@ func (dm *YAMLParser) ComposeAllPackages(manifest *YAML, filePath string, ma whi
 	return packages, nil
 }
 
-func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath string, ma whisk.KeyValue) (*whisk.Package, error) {
+func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath string, managedAnnotations whisk.KeyValue) (*whisk.Package, error) {
 	pag := &whisk.Package{}
 	pag.Name = packageName
 	//The namespace for this package is absent, so we use default guest here.
@@ -314,7 +314,7 @@ func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath s
 
 	// add Managed Annotations if this is Managed Deployment
 	if utils.Flags.Managed || utils.Flags.Sync {
-		pag.Annotations = append(pag.Annotations, ma)
+		pag.Annotations = append(pag.Annotations, managedAnnotations)
 	}
 
 	// "default" package is a reserved package name
@@ -336,7 +336,7 @@ func (dm *YAMLParser) ComposePackage(pkg Package, packageName string, filePath s
 	return pag, nil
 }
 
-func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *YAML, ma whisk.KeyValue) ([]utils.ActionRecord, error) {
+func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *YAML, manifestFilePath string, managedAnnotations whisk.KeyValue) ([]utils.ActionRecord, error) {
 	var sequences []utils.ActionRecord = make([]utils.ActionRecord, 0)
 	manifestPackages := make(map[string]Package)
 
@@ -347,7 +347,7 @@ func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *YA
 	}
 
 	for n, p := range manifestPackages {
-		s, err := dm.ComposeSequences(namespace, p.Sequences, n, ma)
+		s, err := dm.ComposeSequences(namespace, p.Sequences, n, manifestFilePath, managedAnnotations)
 		if err == nil {
 			sequences = append(sequences, s...)
 		} else {
@@ -357,8 +357,9 @@ func (dm *YAMLParser) ComposeSequencesFromAllPackages(namespace string, mani *YA
 	return sequences, nil
 }
 
-func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Sequence, packageName string, ma whisk.KeyValue) ([]utils.ActionRecord, error) {
+func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Sequence, packageName string, manifestFilePath string, managedAnnotations whisk.KeyValue) ([]utils.ActionRecord, error) {
 	var listOfSequences []utils.ActionRecord = make([]utils.ActionRecord, 0)
+	var errorParser error
 
 	for key, sequence := range sequences {
 		wskaction := new(whisk.Action)
@@ -389,7 +390,19 @@ func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Se
 
 		// appending managed annotations if its a managed deployment
 		if utils.Flags.Managed || utils.Flags.Sync {
-			wskaction.Annotations = append(wskaction.Annotations, ma)
+			wskaction.Annotations = append(wskaction.Annotations, managedAnnotations)
+		}
+
+		// Web Export
+		// Treat sequence as a web action, a raw HTTP web action, or as a standard action based on web-export;
+		// when web-export is set to yes | true, treat sequence as a web action,
+		// when web-export is set to raw, treat sequence as a raw HTTP web action,
+		// when web-export is set to no | false, treat sequence as a standard action
+		if len(sequence.Web) != 0 {
+			wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, wskaction.Name, sequence.Web, wskaction.Annotations, false)
+			if errorParser != nil {
+				return nil, errorParser
+			}
 		}
 
 		record := utils.ActionRecord{Action: wskaction, Packagename: packageName, Filepath: key}
@@ -398,7 +411,7 @@ func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Se
 	return listOfSequences, nil
 }
 
-func (dm *YAMLParser) ComposeActionsFromAllPackages(manifest *YAML, filePath string, ma whisk.KeyValue) ([]utils.ActionRecord, error) {
+func (dm *YAMLParser) ComposeActionsFromAllPackages(manifest *YAML, filePath string, managedAnnotations whisk.KeyValue) ([]utils.ActionRecord, error) {
 	var actions []utils.ActionRecord = make([]utils.ActionRecord, 0)
 	manifestPackages := make(map[string]Package)
 
@@ -409,7 +422,7 @@ func (dm *YAMLParser) ComposeActionsFromAllPackages(manifest *YAML, filePath str
 	}
 
 	for n, p := range manifestPackages {
-		a, err := dm.ComposeActions(filePath, p.Actions, n, ma)
+		a, err := dm.ComposeActions(filePath, p.Actions, n, managedAnnotations)
 		if err == nil {
 			actions = append(actions, a...)
 		} else {
@@ -708,7 +721,15 @@ func (dm *YAMLParser) composeActionLimits(limits Limits) *whisk.Limits {
 	return nil
 }
 
-func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string]Action, packageName string, ma whisk.KeyValue) ([]utils.ActionRecord, error) {
+func (dm *YAMLParser) validateActionWebFlag(action Action) {
+	if len(action.Web) != 0 && len(action.Webexport) != 0 {
+		warningString := wski18n.T(wski18n.ID_WARN_ACTION_WEB_X_action_X,
+			map[string]interface{}{wski18n.KEY_ACTION: action.Name})
+		wskprint.PrintOpenWhiskWarning(warningString)
+	}
+}
+
+func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string]Action, packageName string, managedAnnotations whisk.KeyValue) ([]utils.ActionRecord, error) {
 
 	var errorParser error
 	var listOfActions []utils.ActionRecord = make([]utils.ActionRecord, 0)
@@ -762,7 +783,7 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
 
 		// add managed annotations if its marked as managed deployment
 		if utils.Flags.Managed || utils.Flags.Sync {
-			wskaction.Annotations = append(wskaction.Annotations, ma)
+			wskaction.Annotations = append(wskaction.Annotations, managedAnnotations)
 		}
 
 		// Web Export
@@ -770,8 +791,9 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
 		// when web-export is set to yes | true, treat action as a web action,
 		// when web-export is set to raw, treat action as a raw HTTP web action,
 		// when web-export is set to no | false, treat action as a standard action
-		if len(action.Webexport) != 0 {
-			wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, action.Name, action.Webexport, wskaction.Annotations, false)
+		dm.validateActionWebFlag(action)
+		if len(action.GetWeb()) != 0 {
+			wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, action.Name, action.GetWeb(), wskaction.Annotations, false)
 			if errorParser != nil {
 				return listOfActions, errorParser
 			}
@@ -783,6 +805,10 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
 				wskaction.Limits = wsklimits
 			}
 		}
+		// Conductor Action
+		if action.Conductor {
+			wskaction.Annotations = append(wskaction.Annotations, utils.ConductorAction())
+		}
 
 		wskaction.Name = actionName
 		pub := false
@@ -796,7 +822,7 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
 
 }
 
-func (dm *YAMLParser) ComposeTriggersFromAllPackages(manifest *YAML, filePath string, ma whisk.KeyValue) ([]*whisk.Trigger, error) {
+func (dm *YAMLParser) ComposeTriggersFromAllPackages(manifest *YAML, filePath string, managedAnnotations whisk.KeyValue) ([]*whisk.Trigger, error) {
 	var triggers []*whisk.Trigger = make([]*whisk.Trigger, 0)
 	manifestPackages := make(map[string]Package)
 
@@ -807,7 +833,7 @@ func (dm *YAMLParser) ComposeTriggersFromAllPackages(manifest *YAML, filePath st
 	}
 
 	for _, p := range manifestPackages {
-		t, err := dm.ComposeTriggers(filePath, p, ma)
+		t, err := dm.ComposeTriggers(filePath, p, managedAnnotations)
 		if err == nil {
 			triggers = append(triggers, t...)
 		} else {
@@ -817,7 +843,7 @@ func (dm *YAMLParser) ComposeTriggersFromAllPackages(manifest *YAML, filePath st
 	return triggers, nil
 }
 
-func (dm *YAMLParser) ComposeTriggers(filePath string, pkg Package, ma whisk.KeyValue) ([]*whisk.Trigger, error) {
+func (dm *YAMLParser) ComposeTriggers(filePath string, pkg Package, managedAnnotations whisk.KeyValue) ([]*whisk.Trigger, error) {
 	var errorParser error
 	var listOfTriggers []*whisk.Trigger = make([]*whisk.Trigger, 0)
 
@@ -870,7 +896,7 @@ func (dm *YAMLParser) ComposeTriggers(filePath string, pkg Package, ma whisk.Key
 
 		// add managed annotations if its a managed deployment
 		if utils.Flags.Managed || utils.Flags.Sync {
-			wsktrigger.Annotations = append(wsktrigger.Annotations, ma)
+			wsktrigger.Annotations = append(wsktrigger.Annotations, managedAnnotations)
 		}
 
 		listOfTriggers = append(listOfTriggers, wsktrigger)
@@ -878,7 +904,7 @@ func (dm *YAMLParser) ComposeTriggers(filePath string, pkg Package, ma whisk.Key
 	return listOfTriggers, nil
 }
 
-func (dm *YAMLParser) ComposeRulesFromAllPackages(manifest *YAML, ma whisk.KeyValue) ([]*whisk.Rule, error) {
+func (dm *YAMLParser) ComposeRulesFromAllPackages(manifest *YAML, managedAnnotations whisk.KeyValue) ([]*whisk.Rule, error) {
 	var rules []*whisk.Rule = make([]*whisk.Rule, 0)
 	manifestPackages := make(map[string]Package)
 
@@ -889,7 +915,7 @@ func (dm *YAMLParser) ComposeRulesFromAllPackages(manifest *YAML, ma whisk.KeyVa
 	}
 
 	for n, p := range manifestPackages {
-		r, err := dm.ComposeRules(p, n, ma)
+		r, err := dm.ComposeRules(p, n, managedAnnotations)
 		if err == nil {
 			rules = append(rules, r...)
 		} else {
@@ -899,7 +925,7 @@ func (dm *YAMLParser) ComposeRulesFromAllPackages(manifest *YAML, ma whisk.KeyVa
 	return rules, nil
 }
 
-func (dm *YAMLParser) ComposeRules(pkg Package, packageName string, ma whisk.KeyValue) ([]*whisk.Rule, error) {
+func (dm *YAMLParser) ComposeRules(pkg Package, packageName string, managedAnnotations whisk.KeyValue) ([]*whisk.Rule, error) {
 	var rules []*whisk.Rule = make([]*whisk.Rule, 0)
 
 	for _, rule := range pkg.GetRuleList() {
@@ -923,7 +949,7 @@ func (dm *YAMLParser) ComposeRules(pkg Package, packageName string, ma whisk.Key
 
 		// add managed annotations if its a managed deployment
 		if utils.Flags.Managed || utils.Flags.Sync {
-			wskrule.Annotations = append(wskrule.Annotations, ma)
+			wskrule.Annotations = append(wskrule.Annotations, managedAnnotations)
 		}
 
 		rules = append(rules, wskrule)
@@ -1009,46 +1035,51 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
 									wski18n.KEY_API:    apiName}))
 					} else {
 						// verify that the action is defined as web action
-						// web-export set to any of [true, yes, raw]
-						if !utils.IsWebAction(pkg.Actions[actionName].Webexport) {
-							return nil, wskderrors.NewYAMLFileFormatError(manifestPath,
-								wski18n.T(wski18n.ID_ERR_API_MISSING_WEB_ACTION_X_action_X_api_X,
-									map[string]interface{}{
-										wski18n.KEY_ACTION: actionName,
-										wski18n.KEY_API:    apiName}))
-						} else {
-							request := new(whisk.ApiCreateRequest)
-							request.ApiDoc = new(whisk.Api)
-							request.ApiDoc.GatewayBasePath = gatewayBasePath
-							// is API verb is valid, it must be one of (GET, PUT, POST, DELETE)
-							request.ApiDoc.GatewayRelPath = gatewayRelPath
-							if _, ok := whisk.ApiVerbs[strings.ToUpper(gatewayMethod)]; !ok {
-								return nil, wskderrors.NewInvalidAPIGatewayMethodError(manifestPath,
-									gatewayBasePath+gatewayRelPath,
-									gatewayMethod,
-									dm.getGatewayMethods())
-							}
-							request.ApiDoc.GatewayMethod = strings.ToUpper(gatewayMethod)
-							request.ApiDoc.Namespace = client.Namespace
-							request.ApiDoc.ApiName = apiName
-							request.ApiDoc.Id = strings.Join([]string{API, request.ApiDoc.Namespace, request.ApiDoc.GatewayRelPath}, ":")
-							// set action of an API Doc
-							request.ApiDoc.Action = new(whisk.ApiAction)
-							if packageName == DEFAULT_PACKAGE {
-								request.ApiDoc.Action.Name = actionName
-							} else {
-								request.ApiDoc.Action.Name = packageName + PATH_SEPARATOR + actionName
+						// web or web-export set to any of [true, yes, raw]
+						a := pkg.Actions[actionName]
+						if !utils.IsWebAction(a.GetWeb()) {
+							warningString := wski18n.T(wski18n.ID_WARN_API_MISSING_WEB_ACTION_X_action_X_api_X,
+								map[string]interface{}{
+									wski18n.KEY_ACTION: actionName,
+									wski18n.KEY_API:    apiName})
+							wskprint.PrintOpenWhiskWarning(warningString)
+							if a.Annotations == nil {
+								a.Annotations = make(map[string]interface{}, 0)
 							}
-							url := []string{HTTPS + client.Host, strings.ToLower(API),
-								API_VERSION, WEB, client.Namespace, packageName,
-								actionName + "." + utils.HTTP_FILE_EXTENSION}
-							request.ApiDoc.Action.Namespace = client.Namespace
-							request.ApiDoc.Action.BackendUrl = strings.Join(url, PATH_SEPARATOR)
-							request.ApiDoc.Action.BackendMethod = gatewayMethod
-							request.ApiDoc.Action.Auth = client.AuthToken
-							// add a newly created ApiCreateRequest object to a list of requests
-							requests = append(requests, request)
+							a.Annotations[utils.WEB_EXPORT_ANNOT] = true
+							pkg.Actions[actionName] = a
+						}
+						request := new(whisk.ApiCreateRequest)
+						request.ApiDoc = new(whisk.Api)
+						request.ApiDoc.GatewayBasePath = gatewayBasePath
+						// is API verb is valid, it must be one of (GET, PUT, POST, DELETE)
+						request.ApiDoc.GatewayRelPath = gatewayRelPath
+						if _, ok := whisk.ApiVerbs[strings.ToUpper(gatewayMethod)]; !ok {
+							return nil, wskderrors.NewInvalidAPIGatewayMethodError(manifestPath,
+								gatewayBasePath+gatewayRelPath,
+								gatewayMethod,
+								dm.getGatewayMethods())
+						}
+						request.ApiDoc.GatewayMethod = strings.ToUpper(gatewayMethod)
+						request.ApiDoc.Namespace = client.Namespace
+						request.ApiDoc.ApiName = apiName
+						request.ApiDoc.Id = strings.Join([]string{API, request.ApiDoc.Namespace, request.ApiDoc.GatewayRelPath}, ":")
+						// set action of an API Doc
+						request.ApiDoc.Action = new(whisk.ApiAction)
+						if packageName == DEFAULT_PACKAGE {
+							request.ApiDoc.Action.Name = actionName
+						} else {
+							request.ApiDoc.Action.Name = packageName + PATH_SEPARATOR + actionName
 						}
+						url := []string{HTTPS + client.Host, strings.ToLower(API),
+							API_VERSION, WEB, client.Namespace, packageName,
+							actionName + "." + utils.HTTP_FILE_EXTENSION}
+						request.ApiDoc.Action.Namespace = client.Namespace
+						request.ApiDoc.Action.BackendUrl = strings.Join(url, PATH_SEPARATOR)
+						request.ApiDoc.Action.BackendMethod = gatewayMethod
+						request.ApiDoc.Action.Auth = client.AuthToken
+						// add a newly created ApiCreateRequest object to a list of requests
+						requests = append(requests, request)
 					}
 				}
 			}
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index 6c644922..c3d62d4d 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -1033,6 +1033,41 @@ func TestComposeActionsForInvalidWebActions(t *testing.T) {
 	assert.NotNil(t, err, "Expected error for invalid web-export.")
 }
 
+func TestComposeActionsForWebAndWebExport(t *testing.T) {
+	file := "../tests/dat/manifest_data_compose_actions_for_web_and_web_export.yaml"
+	p, m, _ := testLoadParseManifest(t, file)
+
+	actions, err := p.ComposeActionsFromAllPackages(m, m.Filepath, whisk.KeyValue{})
+	assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_COMPOSE_ACTION_FAILURE, file))
+
+	for _, action := range actions {
+		if action.Action.Name == "hello1" || action.Action.Name == "hello2" {
+			for _, a := range action.Action.Annotations {
+				switch a.Key {
+				case "web-export":
+					assert.True(t, a.Value.(bool), "Expected true for web-export but got "+strconv.FormatBool(a.Value.(bool)))
+				}
+			}
+		} else if action.Action.Name == "hello3" {
+			for _, a := range action.Action.Annotations {
+				switch a.Key {
+				case "web-export":
+					assert.False(t, a.Value.(bool), "Expected false for web-export but got "+strconv.FormatBool(a.Value.(bool)))
+				}
+			}
+		} else if action.Action.Name == "hello4" {
+			for _, a := range action.Action.Annotations {
+				switch a.Key {
+				case "web-export":
+					assert.True(t, a.Value.(bool), "Expected true for web-export but got "+strconv.FormatBool(a.Value.(bool)))
+				case "raw-http":
+					assert.True(t, a.Value.(bool), "Expected true for raw but got "+strconv.FormatBool(a.Value.(bool)))
+				}
+			}
+		}
+	}
+}
+
 // Test 16: validate manifest_parser.ResolveParameter() method
 func TestResolveParameterForMultiLineParams(t *testing.T) {
 	paramName := "name"
@@ -1192,10 +1227,11 @@ func TestComposePackage(t *testing.T) {
 
 func TestComposeSequences(t *testing.T) {
 
-	p, m, _ := testLoadParseManifest(t, "../tests/dat/manifest_data_compose_sequences.yaml")
+	file := "../tests/dat/manifest_data_compose_sequences.yaml"
+	p, m, _ := testLoadParseManifest(t, file)
 
 	// Note: set first param (namespace) to empty string
-	seqList, err := p.ComposeSequencesFromAllPackages("", m, whisk.KeyValue{})
+	seqList, err := p.ComposeSequencesFromAllPackages("", m, file, whisk.KeyValue{})
 	if err != nil {
 		assert.Fail(t, "Failed to compose sequences")
 	}
diff --git a/parsers/yamlparser.go b/parsers/yamlparser.go
index c65896f3..a4a8b792 100644
--- a/parsers/yamlparser.go
+++ b/parsers/yamlparser.go
@@ -102,9 +102,11 @@ type Action struct {
 	Credential  string                 `yaml:"credential"`
 	ExposedUrl  string                 `yaml:"exposedUrl"`
 	Webexport   string                 `yaml:"web-export"`
+	Web         string                 `yaml:"web"`
 	Main        string                 `yaml:"main"`
 	Docker      string                 `yaml:"docker,omitempty"`
 	Native      bool                   `yaml:"native,omitempty"`
+	Conductor   bool                   `yaml:"conductor,omitempty"`
 	Limits      *Limits                `yaml:"limits"`
 	Inputs      map[string]Parameter   `yaml:"inputs"`
 	Outputs     map[string]Parameter   `yaml:"outputs"`
@@ -125,6 +127,7 @@ type Limits struct {
 
 type Sequence struct {
 	Actions     string                 `yaml:"actions"`
+	Web         string                 `yaml:"web"`
 	Annotations map[string]interface{} `yaml:"annotations,omitempty"`
 }
 
@@ -231,6 +234,15 @@ type YAML struct {
 	Filepath string             //file path of the yaml file
 }
 
+// function to return web-export or web depending on what is specified
+// in manifest and deployment files
+func (action *Action) GetWeb() string {
+	if len(action.Web) == 0 && len(action.Webexport) != 0 {
+		return action.Webexport
+	}
+	return action.Web
+}
+
 // function to return Project or Application depending on what is specified in
 // manifest and deployment files
 func (yaml *YAML) GetProject() Project {
diff --git a/tests/dat/manifest_data_compose_actions_for_web_and_web_export.yaml b/tests/dat/manifest_data_compose_actions_for_web_and_web_export.yaml
new file mode 100644
index 00000000..c6eb5092
--- /dev/null
+++ b/tests/dat/manifest_data_compose_actions_for_web_and_web_export.yaml
@@ -0,0 +1,39 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+  helloworld:
+    actions:
+      hello1:
+        function: ../src/integration/helloworld/actions/hello.js
+        runtime: nodejs
+        web: true
+        web-export: true
+      hello2:
+        function: ../src/integration/helloworld/actions/hello.js
+        runtime: nodejs
+        web: true
+        web-export: false
+      hello3:
+        function: ../src/integration/helloworld/actions/hello.js
+        runtime: nodejs
+        web: false
+        web-export: true
+      hello4:
+        function: ../src/integration/helloworld/actions/hello.js
+        runtime: nodejs
+        web: raw
+        web-export: true
diff --git a/tests/dat/manifest_data_compose_api_records.yaml b/tests/dat/manifest_data_compose_api_records.yaml
index 55cd84e1..385c8e97 100644
--- a/tests/dat/manifest_data_compose_api_records.yaml
+++ b/tests/dat/manifest_data_compose_api_records.yaml
@@ -22,19 +22,14 @@ packages:
         web-export: true
       deleteBooks:
         function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
       listMembers:
         function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
       getBooks2:
         function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
       postBooks2:
         function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
       listMembers2:
         function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
     apis:
       book-club:
         club:
diff --git a/tests/src/integration/apigateway/manifest.yml b/tests/src/integration/apigateway/manifest.yml
index 407347af..e2b26f56 100644
--- a/tests/src/integration/apigateway/manifest.yml
+++ b/tests/src/integration/apigateway/manifest.yml
@@ -25,19 +25,14 @@ packages:
                 function: src/greeting.js
                 runtime: nodejs:6
             getBooks:
-                web-export: true
                 function: src/get-books.js
             postBooks:
-                web-export: true
                 function: src/post-books.js
             putBooks:
-                web-export: true
                 function: src/put-books.js
             deleteBooks:
-                web-export: true
                 function: src/delete-books.js
             listMembers:
-                web-export: true
                 function: src/list-members.js
         # new top-level key for defining groups of named APIs
         apis:
diff --git a/tests/src/integration/conductor/actions/increment.js b/tests/src/integration/conductor/actions/increment.js
new file mode 100644
index 00000000..ef3877dc
--- /dev/null
+++ b/tests/src/integration/conductor/actions/increment.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Increment input value by 1
+ */
+function main({ value }) { return { value: value + 1 } }
diff --git a/tests/src/integration/conductor/actions/triple.js b/tests/src/integration/conductor/actions/triple.js
new file mode 100644
index 00000000..0636d1cc
--- /dev/null
+++ b/tests/src/integration/conductor/actions/triple.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Return triple of the input value.
+ */
+function main({ value }) { return { value: value * 3 } }
diff --git a/tests/src/integration/conductor/actions/tripleAndIncrement.js b/tests/src/integration/conductor/actions/tripleAndIncrement.js
new file mode 100644
index 00000000..db5bcdb9
--- /dev/null
+++ b/tests/src/integration/conductor/actions/tripleAndIncrement.js
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function main(params) {
+    let step = params.$step || 0
+    delete params.$step
+    package_name = "conductorPackage1"
+    switch (step) {
+        case 0: return { action: package_name+'/triple', params, state: { $step: 1 } }
+        case 1: return { action: package_name+'/increment', params, state: { $step: 2 } }
+        case 2: return { params }
+    }
+}
diff --git a/tests/src/integration/conductor/conductor_test.go b/tests/src/integration/conductor/conductor_test.go
new file mode 100644
index 00000000..162d4f98
--- /dev/null
+++ b/tests/src/integration/conductor/conductor_test.go
@@ -0,0 +1,40 @@
+// +build integration
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests
+
+import (
+	"os"
+	"testing"
+
+	"github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/common"
+	"github.com/stretchr/testify/assert"
+)
+
+const PATH = "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/conductor/"
+
+func TestManagedDeployment(t *testing.T) {
+	manifestPath := os.Getenv("GOPATH") + PATH + "manifest.yaml"
+	wskdeploy := common.NewWskdeploy()
+	_, err := wskdeploy.DeployManifestPathOnly(manifestPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest file.")
+	_, err = wskdeploy.UndeployManifestPathOnly(manifestPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest file.")
+
+}
diff --git a/tests/src/integration/conductor/manifest.yaml b/tests/src/integration/conductor/manifest.yaml
new file mode 100644
index 00000000..7e8ce4f0
--- /dev/null
+++ b/tests/src/integration/conductor/manifest.yaml
@@ -0,0 +1,52 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+project:
+    name: DemoConductor
+    packages:
+        conductorPackage1:
+            actions:
+                triple:
+                    function: actions/triple.js
+                increment:
+                    function: actions/increment.js
+                    runtime: nodejs:6
+                tripleAndIncrement:
+                    function: actions/tripleAndIncrement.js
+                    conductor: true
+        default:
+            actions:
+                triple:
+                    code: |
+                          function main({ value }) { return { value: value * 3 } }
+                    runtime: nodejs:6
+                increment:
+                    code: |
+                          function main({ value }) { return { value: value + 1 } }
+                    runtime: nodejs:6
+                tripleAndIncrement:
+                    code: |
+                          function main(params) {
+                              let step = params.$step || 0
+                              delete params.$step
+                              switch (step) {
+                                  case 0: return { action: 'triple', params, state: { $step: 1 } }
+                                  case 1: return { action: 'increment', params, state: { $step: 2 } }
+                                  case 2: return { params }
+                              }
+                          }
+                    runtime: nodejs:6
+                    conductor: true
+
diff --git a/tests/src/integration/websequence/manifest.yaml b/tests/src/integration/websequence/manifest.yaml
new file mode 100644
index 00000000..ebd97676
--- /dev/null
+++ b/tests/src/integration/websequence/manifest.yaml
@@ -0,0 +1,50 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements.  See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    IntegrationTestWebSequence:
+        actions:
+            greeting-1:
+                version: 1.0
+                function: src/greeting.js
+                runtime: nodejs:6
+                inputs:
+                    name: string
+                    place: string
+                outputs:
+                    payload: string
+            greeting-2:
+                version: 1.0
+                function: src/greeting.js
+                runtime: nodejs:6
+                inputs:
+                    name: string
+                    place: string
+                outputs:
+                    payload: string
+        sequences:
+            greeting-sequence-1:
+                actions: greeting-1, greeting-2
+                web: true
+            greeting-sequence-2:
+                actions: greeting-1, greeting-2
+                web: raw
+        triggers:
+            webSequenceTrigger:
+        rules:
+            webSequenceRule:
+                trigger: webSequenceTrigger
+                action: greeting-sequence-1
\ No newline at end of file
diff --git a/tests/src/integration/websequence/src/greeting.js b/tests/src/integration/websequence/src/greeting.js
new file mode 100644
index 00000000..5c01d98b
--- /dev/null
+++ b/tests/src/integration/websequence/src/greeting.js
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+/**
+ * Return a simple greeting message for someone.
+ *
+ * @param name A person's name.
+ * @param place Where the person is from.
+ */
+function main(params) {
+    var name = params.name || params.payload || 'stranger';
+    var place = params.place || 'somewhere';
+    return {payload:  'Hello, ' + name + ' from ' + place + '!'};
+}
diff --git a/tests/src/integration/websequence/websequence_test.go b/tests/src/integration/websequence/websequence_test.go
new file mode 100644
index 00000000..7f6eaef7
--- /dev/null
+++ b/tests/src/integration/websequence/websequence_test.go
@@ -0,0 +1,43 @@
+// +build integration
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests
+
+import (
+	"os"
+	"testing"
+
+	"github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/common"
+	"github.com/stretchr/testify/assert"
+)
+
+var wskprops = common.GetWskprops()
+
+func TestWebSequence(t *testing.T) {
+	wskdeploy := common.NewWskdeploy()
+	_, err := wskdeploy.Deploy(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest file.")
+	_, err = wskdeploy.Undeploy(manifestPath, deploymentPath)
+	assert.Equal(t, nil, err, "Failed to undeploy based on the manifest file.")
+}
+
+var (
+	manifestPath   = os.Getenv("GOPATH") + "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/websequence/manifest.yaml"
+	deploymentPath = ""
+)
diff --git a/utils/conductor.go b/utils/conductor.go
new file mode 100644
index 00000000..8688d81f
--- /dev/null
+++ b/utils/conductor.go
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package utils
+
+import "github.com/apache/incubator-openwhisk-client-go/whisk"
+
+const CONDUCTOR_ANNOTATION = "conductor"
+
+func ConductorAction() whisk.KeyValue {
+	return whisk.KeyValue{
+		Key:   CONDUCTOR_ANNOTATION,
+		Value: true,
+	}
+}
diff --git a/utils/conductor_test.go b/utils/conductor_test.go
new file mode 100644
index 00000000..ffaab6b6
--- /dev/null
+++ b/utils/conductor_test.go
@@ -0,0 +1,37 @@
+// +build unit
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package utils
+
+import (
+	"testing"
+
+	"github.com/apache/incubator-openwhisk-client-go/whisk"
+	"github.com/stretchr/testify/assert"
+)
+
+const MSG_ERR_CONDUCTOR_ACTION_INVALID = "Conductor action does not create conductor annotation"
+
+func TestConductorAction(t *testing.T) {
+	conductor := ConductorAction()
+	annotation := whisk.KeyValue{Key: CONDUCTOR_ANNOTATION, Value: true}
+	assert.NotNil(t, conductor, MSG_ERR_CONDUCTOR_ACTION_INVALID)
+	assert.NotEqual(t, whisk.KeyValue{}, conductor, MSG_ERR_CONDUCTOR_ACTION_INVALID)
+	assert.Equal(t, annotation, conductor, MSG_ERR_CONDUCTOR_ACTION_INVALID)
+}
diff --git a/utils/misc.go b/utils/misc.go
index 3ffe17e4..29c7b892 100644
--- a/utils/misc.go
+++ b/utils/misc.go
@@ -19,11 +19,6 @@ package utils
 
 import (
 	"archive/zip"
-	"errors"
-	"fmt"
-	"github.com/apache/incubator-openwhisk-client-go/whisk"
-	"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
-	"github.com/hokaccha/go-prettyjson"
 	"io"
 	"io/ioutil"
 	"net/http"
@@ -31,8 +26,10 @@ import (
 	"os/user"
 	"path"
 	"path/filepath"
-	"reflect"
 	"strings"
+
+	"github.com/apache/incubator-openwhisk-client-go/whisk"
+	"github.com/hokaccha/go-prettyjson"
 )
 
 const (
@@ -100,15 +97,6 @@ func PrettyJSON(j interface{}) (string, error) {
 	return string(bytes), nil
 }
 
-var kindToJSON []string = []string{"", "boolean", "integer", "integer", "integer", "integer", "integer", "integer", "integer", "integer",
-	"integer", "integer", "integer", "number", "number", "number", "number", "array", "", "", "", "object", "", "", "string", "", ""}
-
-// Gets JSON type name
-func GetJSONType(j interface{}) string {
-	fmt.Print(reflect.TypeOf(j).Kind())
-	return kindToJSON[reflect.TypeOf(j).Kind()]
-}
-
 func NewZipWritter(src, des string) *ZipWritter {
 	zw := &ZipWritter{src: src, des: des}
 	return zw
@@ -165,28 +153,6 @@ func (zw *ZipWritter) Zip() error {
 	return nil
 }
 
-func zipKindError() error {
-	errMsg := wski18n.T("creating an action from a .zip artifact requires specifying the action kind explicitly")
-
-	return errors.New(errMsg)
-}
-
-func extensionError(extension string) error {
-	errMsg := wski18n.T(
-		"'{{.name}}' is not a supported action runtime",
-		map[string]interface{}{
-			"name": extension,
-		})
-
-	return errors.New(errMsg)
-}
-
-func javaEntryError() error {
-	errMsg := wski18n.T("Java actions require --main to specify the fully-qualified name of the main class")
-
-	return errors.New(errMsg)
-}
-
 func deleteKey(key string, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
 	for i := 0; i < len(keyValueArr); i++ {
 		if keyValueArr[i].Key == key {
@@ -259,7 +225,7 @@ func (localReader *LocalReader) ReadLocal(path string) ([]byte, error) {
 }
 
 func Read(url string) ([]byte, error) {
-	if strings.HasPrefix(url, "http") {
+	if strings.HasPrefix(url, HTTP_FILE_EXTENSION) {
 		return new(ContentReader).URLReader.ReadUrl(url)
 	} else {
 		return new(ContentReader).LocalReader.ReadLocal(url)
diff --git a/utils/webaction.go b/utils/webaction.go
index 0d6c9c60..087a7732 100644
--- a/utils/webaction.go
+++ b/utils/webaction.go
@@ -24,9 +24,12 @@ import (
 )
 
 //for web action support, code from wsk cli with tiny adjustments
-const WEB_EXPORT_ANNOT = "web-export"
-const RAW_HTTP_ANNOT = "raw-http"
-const FINAL_ANNOT = "final"
+const (
+	WEB_EXPORT_ANNOT = "web-export"
+	RAW_HTTP_ANNOT   = "raw-http"
+	FINAL_ANNOT      = "final"
+	TRUE             = "true"
+)
 
 var webExport map[string]string = map[string]string{
 	"TRUE":  "true",
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index 3677f90f..1ede72a7 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -175,7 +175,6 @@ const (
 	ID_ERR_RUNTIME_ACTION_SOURCE_NOT_SUPPORTED_X_ext_X_action_X      = "msg_err_runtime_action_source_not_supported"
 	ID_ERR_URL_INVALID_X_urltype_X_url_X_filetype_X                  = "msg_err_url_invalid"
 	ID_ERR_URL_MALFORMED_X_urltype_X_url_X                           = "msg_err_url_malformed"
-	ID_ERR_API_MISSING_WEB_ACTION_X_action_X_api_X                   = "msg_err_api_missing_web_action"
 	ID_ERR_API_MISSING_ACTION_X_action_X_api_X                       = "msg_err_api_missing_action"
 	ID_ERR_ACTION_INVALID_X_action_X                                 = "msg_err_action_invalid"
 	ID_ERR_ACTION_MISSING_RUNTIME_WITH_CODE_X_action_X               = "msg_err_action_missing_runtime_with_code"
@@ -206,6 +205,8 @@ const (
 	ID_WARN_DEPLOYMENT_NAME_NOT_FOUND_X_key_X_name_X          = "msg_warn_deployment_name_not_found"
 	ID_WARN_PROJECT_NAME_OVERRIDDEN                           = "msg_warn_project_name_overridden"
 	ID_WARN_PACKAGE_IS_PUBLIC_X_package_X                     = "msg_warn_package_is_public"
+	ID_WARN_ACTION_WEB_X_action_X                             = "msg_warn_action_web_export_ignored"
+	ID_WARN_API_MISSING_WEB_ACTION_X_action_X_api_X           = "msg_warn_api_missing_web_action"
 
 	// Verbose (Debug/Trace) messages
 	ID_DEBUG_PROJECT_SEARCH_X_path_X_key_X                = "msg_dbg_searching_project_directory"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 2f6894bb..7bc2343b 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -97,7 +97,7 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
 	return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x6d\x8f\xdb\x36\xf2\x7f\x9f\x4f\x31\x08\xfe\x40\x5a\xc0\x51\xd2\xfe\x71\xc0\x21\x40\x5e\xe4\x9a\xb4\xdd\x6b\x93\x0d\x76\xb3\x17\x14\xb9\x85\x42\x4b\x63\x9b\xb5\x44\x0a\x24\x65\xc7\x35\xfc\xdd\x0f\x33\xa4\x1e\xec\x5d\x4a\x5a\xa7\xbd\xeb\x9b\xf3\x2d\x87\x33\xbf\x79\xe0\x70\x66\xa8\x7c\x7a\x04\xb0\x7f\x04\x00\xf0\x58\xe6\x8f\x5f\xc0\xe3\xd2\x2e\xd3\xca\xe0\x42\x7e\x49\xd1\x18\x6d\x1e\xcf\xfc\xaa\x33\x42\xd9\x42\x38\xa9\x15\x91\xbd\xe1\xb5\x47\x00\x87\xd9\x00\x07\xa9\x16\x3a\xc2\xe0\x82\x96\xc6\xf6\xdb\x3a\xcb\xd0\xda\x08\x8b\xeb\xb0\x3a\xc6\x65\x2b\x8c\x92\x6a\x19\xe1\xf2\x31\xac\x46\xb9\x64\x65\x9e\xe6\x68\xb3\xb4\xd0\x6a\x99\x1a\xac\xb4\x71\x11\x5e\x57\xbc\x68\x41\x2b\xc8\xb1\x2a\xf4\x0e\x73\x40\xe5\xa4\x93\x68\xe1\x1b\x99\x60\x32\x83\xf7\x22\x5b\x8b\x25\xda\x19\xbc\xca\x68\x9f\x9d\xc1\x07\x23\x97\x4b\x34\x76\x06\x57\x75\x41\x2b\xe8\xb2\xe4\x5b\x10\x16\xb6\x58\x14\xf4\xbf\x06\x33\x54\x8e\x77\x6c\x58\x9a\x05\xa9\xc0\xad\x10\x6c\x85\x99\x5c\x48\xcc\x41\x89\x12\x6d\x25\x32\x4c\x26\xeb\xa2\x75\x4c\x93\x57\xe0\xb4\x2e\xc0\xe9\xa0\xc8\x0c\x6a\xe5\x7f\x81\x50\x39\xd8\x9d\xca\x40\x57\xa8\xb6\x2b\x69\xd7\x50\x05\x9d\xa0\xb6\x52\x2d\x41\x40\x29\x94\x5c\xa0\x75\x4c\xac\x2b\xe2\x2a\x8a\xc0\xaa\x24\x4d\x16\xb2\x68\xc9\x7f\x7b\xf5\xf6\xd7\x29\x98\xed\x4a\x1b\x37\xec\x80\xf7\x46\x6f\x64\x8e\x16\x04\xd8\xba\x2c\x85\xd9\x81\xa7\x07\xbd\x80\xed\x4a\xb8\x27\x16\xe6\x88\x3d\xf7\x7c\x9d\x19\x03\xa4\x51\x3b\x5a\x74\x64\xcb\x15\x16\x55\x10\x0d\x3b\x5d\x9b\x49\x26\x24\x53\x4d\xc7\xb2\x41\x63\x49\x76\xcc\x3e\x52\x39\x56\x38\xd0\x81\xaa\xcb\x39\x1a\x36\x8f\x5d\x7b\x68\x93\x65\x51\x14\x8c\xc6\x0f\x87\x0a\x2b\x7b\x59\xa1\xfa\x78\xac\xec\x1c\xdd\x96\xdc\x91\x15\x92\xa2\x82\x43\x0b\xcd\x06\xcd\xe4\x18\x9e\x8e\xa1\x17\x7d\x24\xa7\x89\x67\xfe\x83\x5e\xfc\x37\xa3\x79\x51\x88\x65\x2a\x2a\x99\xae\xb4\x8d\x05\x8e\x87\xf2\xea\xfd\x05\x7c\xfe\xf9\xf2\xfa\xc3\xe7\x89\x1c\x87\xdd\xdf\x63\xfa\xaf\x37\x57\xd7\x17\x97\xef\x26\xf1\xad\xdd\x2a\x5d\xe3\x2e\xc2\x94\x96\xb5\x91\x7f\xf0\x1f\xe0\xf3\x2f\x6f\x7e\x9b\xc2\x34\x43\xe3\x52\xb2\x5b\x84\x6b\x25\xdc\x8a\xdc\x42\xb1\x9a\x10\x31\x1b\x79\x0a\x63\xad\x16\x32\x96\xec\xfd\x22\xb3\x82\x6f\x72\x5c\x88\xba\x70\x20\x2d\xfc\xdf\xcf\x97\x6f\xdf\x3c\x4b\xb6\x76\x5d\x19\x5d\xd9\x6f\xa7\x58\xa5\x28\xf4\x36\x0d\x3c\x62\x57\x14\x13\x41\x4b\x34\xce\xb5\x0b\xaa\x21\xbb\xb4\x69\xb9\x8d\xbe\x09\xac\x2b\x83\x1b\x89\xdb\x08\x5f\xbb\x62\xa0\x0d\xd3\x67\x47\xc7\xa3\x2a\x84\x9a\x20\x61\x8d\xbb\xc9\x2e\x5d\xe3\x6e\x2a\x70\x6f\xe9\x52\x28\xb1\xc4\x7c\xd0\xd0\x95\xd1\xbf\x63\xe6\xba\x3b\xd7\x69\x98\x23\x94\xc2\xac\x31\x87\x86\xc3\x14\x53\x31\x9f\x94\xee\x82\x98\x32\x41\x14\x93\x8c\x73\x6c\x52\xc8\x88\x57\x8f\x92\xfe\x04\xb6\xed\x65\x15\xe1\xdb\xad\x4f\x56\x7a\x04\xa1\x4f\xcf\x05\x5a\xdb\x58\x7b\x02\x6b\xeb\x8c\x8c\x72\xf6\xae\xab\x2d\x1a\x3a\x28\x52\x61\x0e\xa6\x56\x4e\x96\xed\x25\x35\x41\x82\x33\x71\x23\xf0\x1a\xe8\xda\x55\xf5\x14\xb0\x3e\xdc\x36\x68\xe6\xda\xc6\x58\x86\xd5\x71\xa6\x9c\x6f\xd2\x52\x5a\xba\x1b\x38\x93\xc6\x13\xe9\x87\x15\x02\x51\x50\xf4\x66\x3e\x9b\xd2\x29\x91\x16\x94\x76\xe0\x59\xd5\x06\xf3\xe4\xdf\x43\x16\x39\x91\x58\xc9\x81\x4b\x86\x24\xd2\x6d\x40\x24\x5f\x27\x67\x2c\x10\x49\x52\x4b\x73\x9e\xa8\xa0\xca\x50\x53\x71\xaa\xcf\xa7\xfd\x3e\xa1\xdf\x87\xc3\xed\x0c\x16\x46\x97\xb0\xdf\x27\x56\xd7\x26\xc3\xc3\x61\x92\x4c\xef\xb0\x31\x99\x44\xd6\xf8\xca\xa2\x3b\x4f\x56\x6b\x9e\x31\x69\x47\x76\x24\x15\xdb\x3f\x9c\xaf\x67\x25\x97\xdb\x54\x70\x3f\x95\x3a\xbd\x46\x35\xaa\x32\xed\x00\xbf\x03\x78\xc7\x79\xca\xd7\xaa\x14\xc6\xae\x44\x91\x16\x3a\x13\x45\x44\xe2\x4d\x43\xd5\x2b\x22\x43\x92\xb0\x5e\x1e\xef\x86\x8d\x28\x6a\xb4\x13\x05\x2a\x74\x5b\x6d\xd6\x67\x8b\x94\xca\xa1\x51\xe8\x40\x38\x52\xb7\x36\xc5\x88\xae\xdd\x8d\x9a\x66\x42\x65\x58\x14\xd1\xfb\xec\xf2\x97\x04\x7e\xf0\x34\x54\x54\x76\x3b\xa7\x0a\x58\x08\x19\xe7\xfe\xba\xbb\xda\x73\x99\x87\xb3\x58\x56\x05\x3a\x04\x5b\x93\x4b\x17\x75\x51\xec\x12\xb8\xaa\x15\x7c\x6e\x1b\x83\xb6\x66\xfe\x4c\x37\x81\xc1\x52\x6f\x10\x2a\x61\x9c\x14\x45\xb1\xeb\x7a\x2a\x61\x2d\xba\x61\x2f\xf4\x90\xfa\x06\x2d\xb5\x4e\xb8\x3a\x56\x47\x3d\x7d\xfa\xf4\xe9\xcb\x97\x2f\x5f\xf6\x7c\xd1\xd3\xe1\x9a\xb7\x02\x11\x10\xe1\x24\xa9\x3c\x5a\xc0\x7c\x8a\x89\x1a\xd3\xe4\x10\xe6\x11\xde\x38\xc3\x41\x76\xbe\xaf\xfb\x7b\xa7\x0b\x19\xf4\xf7\x4d\xbf\x98\x1b\xf4\xf8\x64\x79\x63\xf6\x3b\x12\x79\x86\x05\x33\x5d\x96\x42\xe5\x29\x37\x55\x5c\x55\x52\x96\x4b\x85\x4b\xa9\x12\x89\x08\xdd\xef\x93\xac\xcc\x0f\x87\xd0\x8a\xed\xf7\x09\x6d\x74\xbb\x0a\x0f\x07\xce\x94\xb4\xf7\x70\xb8\x4d\x92\x41\xd9\x5c\x3e\xee\xd2\x26\x9e\x47\xc6\x50\xfb\x3d\x15\xb3\x41\x00\x81\x3c\x1c\x6e\x61\x25\xc2\xa0\xa1\xaf\x70\x7b\x42\xa6\x4b\x8f\xcf\xad\x5e\x37\xeb\x70\x2f\x80\x24\x19\x68\x42\x83\x88\xc6\xa1\x7f\xa6\x8a\x1d\xcf\x29\x4a\x36\xd4\x71\x35\x6f\x3a\x8a\x7b\x15\x1d\xd4\x33\xc7\x0a\x55\x8e\x2a\x7b\x88\x39\xbb\x4d\xe7\xcb\xe9\x8e\x48\xd4\xa6\xaf\xef\x15\xf3\x35\x81\x73\x3f\x0a\x4a\x0c\xb5\x89\xd5\x65\xaf\x8f\x66\x20\xf7\xab\xfe\x3f\xbc\x23\x1a\x7d\x1e\x16\x27\x5f\xe7\xc1\xbb\x69\xee\xcf\xf1\xe1\xc4\x93\x11\x43\x32\xec\xc7\x9b\x93\x69\xd6\x39\x9e\x1c\x42\x15\x7a\xe7\x73\xef\x1c\x46\xe4\x6f\x80\xb6\x37\x1f\xc2\x02\x79\x6d\xc8\x93\x41\x6c\xbf\xfe\xf9\xeb\xe2\xad\xd1\x71\xa1\x6b\x95\xa7\x01\x6f\xc8\x54\xd1\x00\x28\xd0\x45\x73\xf0\x76\x25\xb3\x15\x6c\x79\x7e\x4f\xb8\x72\x5f\x37\xba\x15\x42\x56\x1b\x43\x86\x69\x14\x6c\xc6\x09\x7c\x49\xf9\xdf\xc4\x41\x58\xd6\x85\xec\x37\xb9\x2c\x08\xd3\xa6\x34\x8c\x31\x63\x93\x60\xbf\xca\xcd\x04\xf4\x26\x61\x06\xb9\xc3\xcf\x67\x20\x8a\x7e\xe9\xdb\xba\x8d\x70\x98\x76\x47\x10\x02\xc2\x60\x6b\xeb\x67\x5d\xa4\x43\x2e\x0d\x66\x2e\x44\xbf\xf1\x73\xe0\xb1\x09\xfb\x9b\xab\xab\xcb\xab\xeb\x08\xee\x97\xa7\xff\x81\x27\x87\x3b\x0b\x2f\x5f\x0e\x5c\x3f\xc6\x1c\x1f\xb4\xb5\xd2\x5b\x95\x52\xa5\x30\x7e\xd4\x89\x8a\x4c\x15\x76\x25\xd0\x8d\xce\x41\xab\x62\x07\xb6\xae\xfc\x3b\xd0\x33\x1e\xb8\x26\x76\x67\x1d\x96\x30\x97\x2a\x97\x6a\x69\x41\x1b\x58\x4a\xb7\xaa\xe7\x49\xa6\xcb\x76\xdc\x3c\x7c\x5f\x1a\xd3\xdc\x99\x99\x41\xe1\x62\x30\xf9\x5d\x0e\x98\xe4\x28\x2c\xb7\xd2\xad\x80\x1f\xf4\xa0\x44\x6b\xc5\x12\x5f\xd0\x22\x1a\x73\x38\xf0\x58\xdb\xaf\x65\x3a\xf7\x0b\xf4\x63\xa4\x9b\xe9\x41\xf2\x67\x65\x10\x52\x7e\xe7\xa4\xfc\x45\x90\x16\x88\x79\x2a\xd5\x46\xaf\x63\x80\x7e\xe4\xb4\x45\xe9\xc2\x93\xf1\x81\xa4\x6d\xb0\x5d\xf1\xd3\x50\x40\xea\xfc\xb3\x5c\x58\xfa\x6b\xd0\xae\x71\xd7\xce\x50\xa8\xde\x15\x4e\x9b\xa1\xf9\x50\x4b\xc3\xe3\x86\x4f\x8d\x31\x6f\x29\x1e\x03\x9f\x51\x99\xcd\x90\x31\x55\xda\xf9\x64\x17\x11\xf8\xb6\x3f\x8d\xe4\x5c\xcd\xd4\xd4\xef\xf2\x38\xb0\x5f\x51\x8f\x09\xe5\xea\xbd\x94\xb6\x14\x2e\x8b\x95\xef\xa4\x60\x1b\x1e\xb4\x21\x67\x11\x79\x93\x4f\xa5\x3a\x1d\x7b\xfb\xf5\x80\x01\x72\x8d\x7e\xb0\xc4\x42\xd8\xad\x9c\xde\x88\xa8\xec\x31\x39\x9a\xb2\xfa\xd5\x46\x8d\x61\x25\x42\xff\x4f\xe1\x25\x0a\x19\x33\xdb\x85\x5f\xa5\x63\x1e\x5c\xd2\x0e\x34\x49\x56\xf8\x4d\x58\xba\x57\xc7\x23\x54\xda\x30\x76\xc1\xef\xc3\xbc\xc7\xff\x9c\x62\xe7\x06\xe2\x88\xa9\xaf\x1e\x02\xe8\xc4\xae\x7c\x14\x3c\xa2\x27\x16\xfc\x94\xc7\x9b\x12\xbf\x38\x54\xb6\x01\x8d\x5f\xf8\x0e\x23\x75\xbe\x46\x15\x9b\x2e\x31\x36\xc0\xec\x8e\xf2\x12\xfd\xbb\x66\xc8\xbd\xdd\x10\x39\x0c\x6b\xba\x9b\x8c\xee\x37\x99\xf5\x8e\xef\x64\x9b\x7a\xe8\xa9\xd7\x98\x4f\x4f\x2b\x2d\x82\xef\x48\x61\xae\x0b\xc9\x8c\x9d\x95\x85\xda\xb5\xb1\x41\x49\xa4\xe7\xf6\x51\xbb\x86\x21\x6a\x0b\x61\x54\x8d\xda\x14\x0f\x8f\x5c\x3f\xd8\x0a\x2d\xf4\xcd\xd5\xaf\x8c\x80\x47\x5d\x7c\x94\x3e\x1d\xf5\xd8\xb7\xfe\xb1\x7a\x0a\x90\x52\x14\x0b\x6d\xca\xa8\xe5\xde\x36\xeb\x43\x08\x12\xf8\x60\x76\x20\x96\x42\xaa\xb1\x96\xde\x98\xf4\x77\xab\x55\x9b\x6c\xb3\x32\x1f\x78\xd3\xfc\xe7\xf5\xe5\x3b\x90\xaa\xaa\x1d\xe4\xc2\x09\x78\x1b\xac\xf1\x24\x2b\xf3\x27\x94\x7a\x87\x25\x89\x4a\xb6\x82\xb6\x38\x0f\x81\x13\x7b\xa6\xbe\xe7\x6c\x34\xce\x15\xb0\xc5\x79\x88\x88\x19\x8f\xb6\x99\xac\x92\x44\x93\x09\xe5\xeb\x8d\x39\xfa\x1b\x1f\xf3\x30\xf8\xe8\x36\x25\xf0\xbe\x40\x61\x11\xea\x2a\x17\x0e\x4f\x52\x9f\xd3\x90\x69\xb5\x41\xe3\x4e\xc4\x3b\xdd\xe7\x31\x66\xd8\xbe\xba\x67\xa9\xda\x04\x1b\x9f\xd4\x23\x88\x93\x94\x9e\x0b\x8b\x39\x68\xd5\x3f\x3e\x77\x59\x8d\x9a\x42\xaa\xac\xa8\x73\x3c\x81\x27\xec\x91\x17\xc6\x8d\xe1\x93\xc4\xf0\x41\x8b\x19\x22\xec\x4a\xe0\xc2\xf9\x2e\x52\xbb\x15\xd7\x14\x9c\x1d\x16\xb5\x0a\xb9\xa1\x49\x20\x33\x6f\x0b\xad\x30\x3c\xac\x96\xc4\x05\xbf\x54\x98\x4d\xc9\x08\x01\x6b\xe3\xbb\x26\xcf\x51\x82\x4f\x49\xea\x57\xa2\x67\xe0\x5d\xb2\x23\xb6\xba\x76\xfd\xa4\x97\xc0\xc7\xee\x32\x69\x52\x1e\x6d\x9b\xb5\x69\x91\xc2\xa3\x29\x7a\x46\xae\xe7\xa0\x4e\x63\xa6\x94\xba\x2e\x87\x69\x2e\xcd\xa4\x64\x7d\xaf\x5a\xa4\x47\x6b\xf7\x4a\x4b\xe5\x4b\x43\xdf\x6a\x3a\x0c\x0d\x0e\x15\x64\x5d\x5a\x9a\x51\x2b\xdb\x68\x65\xb9\x37\x3a\xce\xd4\xc3\x6a\x64\x42\xb9\xd4\x8a\x0d\xa6\xb9\xce\xd6\x18\xfb\x04\xef\x07\xa1\x98\xab\xd8\x20\xbc\x66\x42\x90\x25\x37\x12\x23\x05\xb2\x2c\x30\x15\x85\x41\x91\xef\x52\xfc\x22\x6d\xf4\xeb\x85\x1f\xe9\x60\x04\x4a\xf0\x94\x11\xde\x1f\x5f\x5d\xbd\xbb\x78\xf7\xd3\xf4\xa6\xad\xd9\xf0\xb0\xb6\x6d\x2b\x8c\x6a\x27\xc3\x06\x5d\xb4\x54\xbe\xa2\x35\x72\xd4\xa7\x66\x24\x7c\x0b\x62\xe1\xd0\xf8\x32\xfd\x85\xbf\x47\xe9\xf2\xbf\x1d\x3a\x23\x41\x1e\x3f\x91\x3d\xf8\xe6\xec\x7f\x6b\xd2\xab\x94\x21\x47\x37\x7e\x3a\x59\x32\x35\x07\x39\x56\x06\x33\x4a\x73\xa9\xc1\xaa\x10\x59\x34\x7c\xa9\x7a\x26\x39\xba\xc8\x43\x4f\xc0\x2f\x92\x3e\x2b\x1e\x8f\xc2\xb7\xb2\x28\xc0\x6a\xad\x28\x8b\x76\x12\x66\x50\x85\x0c\x69\x7d\x53\xc4\xc3\x0c\xdc\x1e\xb1\xb3\x0e\xc5\x44\xec\xc1\x12\xe7\xb4\x33\x76\xa5\xeb\x22\x27\x78\x16\x5d\x02\x37\xd6\xcf\xf5\xfc\xd0\x81\x5f\xf9\x98\x9a\x7f\x8d\x0f\xf4\x5b\x44\x4c\x3f\xe2\x4a\xc2\xe5\x25\x50\xe5\x7a\xb7\xcd\xa2\x43\xe7\xf3\xdc\x03\x44\x72\xfe\x11\x9b\x41\xe7\x8d\x09\xe5\xfd\x8d\x43\x9b\x01\x52\xf3\x1d\x5f\xff\x03\xbe\x71\x60\x85\x2c\xa5\x4b\xe5\x52\x69\x13\x85\xd4\x84\x74\x48\xce\xbc\x85\x51\xf1\xaf\xd3\x56\x8a\xd2\xbf\x67\x37\x55\x7a\xb6\x12\x6a\x89\x62\x1e\xfd\x5e\xe8\xd7\x56\x62\xdb\xbb\xd9\x46\xef\x62\xe7\x67\x87\x2d\x8f\x04\x2e\x48\x3c\xf5\xbf\x13\x62\x81\x11\xd8\xb4\xd0\xcb\xd4\xca\x3f\x62\x00\x0a\xbd\xbc\x96\x7f\xf0\xd5\xea\x37\x1c\x69\xdc\x85\xa8\x50\xfc\x16\xbc\x44\xd3\x7e\xd0\xf8\x9c\x2f\xec\xef\x9e\x4f\x86\x52\x62\xa9\xcd\x6e\x08\x8d\xa7\x38\x17\xd0\x77\xdf\xff\x9d\x21\xfd\xed\xbb\xef\x27\x63\xa2\xfb\x57\xd7\xb1\xde\x2b\xac\x9e\x05\xe6\xb9\xb7\xcf\xff\x3f\xa7\xff\xc6\xf1\xf0\x18\x2d\xad\x8c\xae\xd0\x38\x89\xb1\xfb\xaa\xc9\x80\xbd\x7c\xe5\x87\xaf\xce\x48\x6c\xc7\xaf\x7e\x26\xd7\x31\x6b\xc6\xb4\xf7\xe7\xc4\x26\x25\xe6\x9a\x03\x8e\x32\xa3\x74\xa0\x6b\x67\x65\xce\x8e\xf8\x60\xc4\x46\x5a\x98\xd7\xb2\xc8\x87\x67\x78\xac\x8a\x4f\x07\x86\xc2\x76\x52\x2a\x68\xa3\xff\x28\x21\xa8\x93\x84\x1e\xac\xcd\x93\xc9\xfd\x3e\x09\x7f\x6d\xcc\xbd\xdf\x27\xa5\x54\x61\x4e\x45\xff\x47\x64\x23\x5d\x2f\x43\x6d\xca\x41\x7f\xc8\x62\x69\xa2\x99\x24\x04\x2a\x2a\x8d\x4e\x86\x0a\xf7\x94\xe7\xd1\xb9\xc1\x59\xc3\x02\x46\x1b\x46\x91\x3c\x67\x1a\xac\x6a\xee\x4c\x99\x8e\x52\xcc\x49\xb9\xd3\xf4\x0c\x16\x0b\xcc\xa8\x74\xd5\x6e\x85\x7e\x84\x3d\x0e\xa9\x99\xec\x8e\x0e\xda\xc2\x55\x78\x32\x94\x6a\x0a\x86\x4c\x2b\x27\xf8\xbb\x38\xa5\xa7\x4d\x8b\x59\x7a\xef\xa1\x86\x8d\x32\x05\xc4\xbd\xcf\x18\xe1\xc6\x39\x1d\xbd\x6d\xc3\x34\xc3\xcf\x04\x03\xd1\x71\xc7\x35\x6e\xa1\xde\x87\x96\xa9\xde\xa0\x31\x32\xcf\x31\xd6\x3e\x12\xc2\xfe\x77\x97\xdd\x43\x5b\xb7\xb5\xa9\x15\xfa\xef\x28\x53\x1d\x95\x4a\x9b\x56\xf5\xbc\x90\xb1\x2f\xca\xbd\x57\x98\xb6\xe9\x5c\xfd\xa7\xa5\xc2\x82\xdf\x78\x67\xbc\x38\xa3\x74\xc1\xb9\x65\x8e\xb0\x91\x56\xce\x0b\xdf\xcc\x51\x23\x4b\xd9\x91\x5f\x08\xa9\x89\xdd\x51\x63\xa4\x55\xe4\x53\xcd\xd7\x6f\xfe\x71\xf3\xd3\xe4\xf2\x9a\xa9\x1f\x56\x5b\xe7\xf3\x65\x6a\x51\x98\x6c\x45\xad\x60\xe3\x98\xb6\xbd\x89\xfd\x1b\x9c\x66\x47\xeb\x98\xe3\x86\xa8\x89\x61\x3a\xd7\x5d\x02\x1b\xb9\xa2\x09\xca\x69\xf4\xfe\xd9\x91\x7b\x66\xd4\x12\xb4\xf6\x58\xfb\x87\xc2\x81\x7f\xfd\xf1\xfa\x9e\x69\x75\xb0\xc8\x0b\xf8\x91\x11\x74\xff\xd8\x80\x1f\xc8\x88\xd9\x43\x01\x0c\x7f\xb8\xfb\x70\x0c\xfd\xb7\xc8\xe6\xed\x3c\x40\x7a\x74\xfb\xe8\x3f\x01\x00\x00\xff\xff\x9a\x8b\xa3\x0e\x32\x36\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x6d\x8f\xdb\x36\xf2\x7f\x9f\x4f\x31\x08\xfe\x40\x5a\xc0\x51\xd2\xfe\x71\xc0\x21\xc0\xbe\xc8\x75\xd3\x76\xaf\x4d\x36\xd8\xcd\x5e\x50\xe4\x16\x0a\x2d\x8d\x6d\xd6\x12\x29\x90\x94\x1d\x77\xe1\xef\x7e\x98\x21\xf5\x60\xef\x52\xd2\x3a\xed\x5d\xdf\xd4\x09\x87\x33\xbf\x19\x0e\xe7\x89\xca\xa7\x27\x00\x77\x4f\x00\x00\x9e\xca\xfc\xe9\x2b\x78\x5a\xda\x65\x5a\x19\x5c\xc8\x2f\x29\x1a\xa3\xcd\xd3\x99\x5f\x75\x46\x28\x5b\x08\x27\xb5\x22\xb2\x37\xbc\xf6\x04\x60\x3f\x1b\xe0\x20\xd5\x42\x47\x18\x5c\xd0\xd2\xd8\x7e\x5b\x67\x19\x5a\x1b\x61\x71\x1d\x56\xc7\xb8\x6c\x85\x51\x52\x2d\x23\x5c\x3e\x86\xd5\x28\x97\xac\xcc\xd3\x1c\x6d\x96\x16\x5a\x2d\x53\x83\x95\x36\x2e\xc2\xeb\x8a\x17\x2d\x68\x05\x39\x56\x85\xde\x61\x0e\xa8\x9c\x74\x12\x2d\x7c\x23\x13\x4c\x66\xf0\x5e\x64\x6b\xb1\x44\x3b\x83\xd7\x19\xed\xb3\x33\xf8\x60\xe4\x72\x89\xc6\xce\xe0\xaa\x2e\x68\x05\x5d\x96\x7c\x0b\xc2\xc2\x16\x8b\x82\xfe\x6f\x30\x43\xe5\x78\xc7\x86\xa5\x59\x90\x0a\xdc\x0a\xc1\x56\x98\xc9\x85\xc4\x1c\x94\x28\xd1\x56\x22\xc3\x64\xb2\x2e\x5a\xc7\x34\x79\x0d\x4e\xeb\x02\x9c\x0e\x8a\xcc\xa0\x56\xfe\x17\x08\x95\x83\xdd\xa9\x0c\x74\x85\x6a\xbb\x92\x76\x0d\x55\xd0\x09\x6a\x2b\xd5\x12\x04\x94\x42\xc9\x05\x5a\xc7\xc4\xba\x22\xae\xa2\x08\xac\x4a\xd2\x64\x21\x8b\x96\xfc\xb7\xd7\x6f\x7f\x9d\x82\xd9\xae\xb4\x71\xc3\x07\xf0\xde\xe8\x8d\xcc\xd1\x82\x00\x5b\x97\xa5\x30\x3b\xf0\xf4\xa0\x17\xb0\x5d\x09\xf7\xcc\xc2\x1c\xb1\x77\x3c\x5f\x67\xc6\x00\x69\xd4\x8e\x16\x1d\xd9\x72\x85\x45\x15\x44\xc3\x4e\xd7\x66\x92\x09\xc9\x54\xd3\xb1\x6c\xd0\x58\x92\x1d\xb3\x8f\x54\x8e\x15\x0e\x74\xa0\xea\x72\x8e\x86\xcd\x63\xd7\x1e\xda\x64\x59\xe4\x05\xa3\xfe\xc3\xae\xc2\xca\x5e\x56\xa8\x3e\x1e\x2a\x3b\x47\xb7\xa5\xe3\xc8\x0a\x49\x5e\xc1\xae\x85\x66\x83\x66\xb2\x0f\x4f\xc7\xd0\xf3\x3e\x92\xd3\xf8\x33\xff\x85\x5e\xfc\x37\xbd\x79\x51\x88\x65\x2a\x2a\x99\xae\xb4\x8d\x39\x8e\x87\xf2\xfa\xfd\x05\x7c\xfe\xf9\xf2\xfa\xc3\xe7\x89\x1c\x87\x8f\xbf\xc7\xf4\x5f\x6f\xae\xae\x2f\x2e\xdf\x4d\xe2\x5b\xbb\x55\xba\xc6\x5d\x84\x29\x2d\x6b\x23\xff\xe0\xbf\x80\xcf\xbf\xbc\xf9\x6d\x0a\xd3\x0c\x8d\x4b\xc9\x6e\x11\xae\x95\x70\x2b\x3a\x16\xf2\xd5\x84\x88\xd9\xc8\x53\x18\x6b\xb5\x90\xb1\x60\xef\x17\x99\x15\x7c\x93\xe3\x42\xd4\x85\x03\x69\xe1\xff\x7e\xbe\x7c\xfb\xe6\x45\xb2\xb5\xeb\xca\xe8\xca\x7e\x3b\xc5\x2a\x45\xa1\xb7\x69\xe0\x11\x4b\x51\x4c\x04\x2d\xd1\x38\xd7\xce\xa9\x86\xec\xd2\x86\xe5\xd6\xfb\x26\xb0\xae\x0c\x6e\x24\x6e\x23\x7c\xed\x8a\x81\x36\x4c\x5f\x1c\x5c\x8f\xaa\x10\x6a\x82\x84\x35\xee\x26\x1f\xe9\x1a\x77\x53\x81\x7b\x4b\x97\x42\x89\x25\xe6\x83\x86\xae\x8c\xfe\x1d\x33\xd7\xe5\x5c\xa7\x61\x8e\x50\x0a\xb3\xc6\x1c\x1a\x0e\x53\x4c\xc5\x7c\x52\xca\x05\x31\x65\x82\x28\x26\x19\xe7\xd8\x84\x90\x91\x53\x3d\x08\xfa\x13\xd8\xb6\xc9\x2a\xc2\xb7\x5b\x9f\xac\xf4\x08\x42\x1f\x9e\x0b\xb4\xb6\xb1\xf6\x04\xd6\xd6\x19\x19\xe5\xec\x8f\xae\xb6\x68\xe8\xa2\x48\x85\x39\x98\x5a\x39\x59\xb6\x49\x6a\x82\x04\x67\xe2\x46\xe0\x35\xd0\xb5\xab\xea\x29\x60\xbd\xbb\x6d\xd0\xcc\xb5\x8d\xb1\x0c\xab\xe3\x4c\x39\xde\xa4\xa5\xb4\x94\x1b\x38\x92\xc6\x03\xe9\x87\x15\x02\x51\x90\xf7\x66\x3e\x9a\xd2\x2d\x91\x16\x94\x76\xe0\x59\xd5\x06\xf3\xe4\xdf\x43\x16\x39\x92\x58\xc9\x81\x24\x43\x12\x29\x1b\x10\xc9\xd7\xc9\x19\x73\x44\x92\xd4\xd2\x9c\x26\x2a\xa8\x32\xd4\x54\x1c\xeb\xf3\xe9\xee\x2e\xa1\xdf\xfb\xfd\xed\x0c\x16\x46\x97\x70\x77\x97\x58\x5d\x9b\x0c\xf7\xfb\x49\x32\xfd\x81\x8d\xc9\x24\xb2\xe6\xac\x2c\xba\xd3\x64\xb5\xe6\x19\x93\x76\x60\x47\x52\xb1\xfd\x8b\xd3\xf5\xac\xe4\x72\x9b\x0a\xee\xa7\x52\xa7\xd7\xa8\x46\x55\xa6\x1d\xe0\x77\x00\xef\x38\x4d\xf9\x5a\x95\xc2\xd8\x95\x28\xd2\x42\x67\xa2\x88\x48\xbc\x69\xa8\x7a\x45\x64\x08\x12\xd6\xcb\xe3\xdd\xb0\x11\x45\x8d\x76\xa2\x40\x85\x6e\xab\xcd\xfa\x64\x91\x52\x39\x34\x0a\x1d\x08\x47\xea\xd6\xa6\x18\xd1\xb5\xcb\xa8\x69\x26\x54\x86\x45\x11\xcd\x67\x97\xbf\x24\xf0\x83\xa7\xa1\xa2\xb2\xdb\x39\x55\xc0\x42\xc8\x38\xf7\xf3\x2e\xb5\xe7\x32\x0f\x77\xb1\xac\x0a\x74\x08\xb6\xa6\x23\x5d\xd4\x45\xb1\x4b\xe0\xaa\x56\xf0\xb9\x6d\x0c\xda\x9a\xf9\x33\x65\x02\x83\xa5\xde\x20\x54\xc2\x38\x29\x8a\x62\xd7\xf5\x54\xc2\x5a\x74\xc3\xa7\xd0\x43\xea\x1b\xb4\xd4\x3a\xe1\xea\x58\x1d\xf5\xfc\xf9\xf3\xe7\x67\x67\x67\x67\xbd\xb3\xe8\xe9\x70\xcd\x5b\x81\x08\x88\x70\x92\x54\x1e\x2d\x60\x3e\xc5\x44\x8d\x69\x72\x08\xf3\x08\x6f\x9c\x61\x27\x3b\xfd\xac\xfb\x7b\xa7\x0b\x19\x3c\xef\x9b\x7e\x31\x37\x78\xe2\x93\xe5\x8d\xd9\xef\x40\xe4\x09\x16\xcc\x74\x59\x0a\x95\xa7\xdc\x54\x71\x55\x49\x51\x2e\x15\x2e\xa5\x4a\x24\x22\xf4\xee\x2e\xc9\xca\x7c\xbf\x0f\xad\xd8\xdd\x5d\x42\x1b\xdd\xae\xc2\xfd\x9e\x23\x25\xed\xdd\xef\x6f\x93\x64\x50\x36\x97\x8f\xbb\xb4\xf1\xe7\x91\x31\xd4\xdd\x1d\x15\xb3\x41\x00\x81\xdc\xef\x6f\x61\x25\xc2\xa0\xa1\xaf\x70\x7b\x43\xa6\x4b\x8f\xcf\xad\xce\x9b\x75\x78\x10\x40\x92\x0c\x34\xa1\x41\x44\x73\xa0\x7f\xa6\x8a\x1d\xcf\x29\x4a\x36\xd4\x71\x35\x6f\x3a\x8a\x07\x15\x1d\xd4\x33\xc7\x0a\x55\x8e\x2a\x7b\x8c\x39\xbb\x4d\xa7\xcb\xe9\xae\x48\xd4\xa6\xe7\x0f\x8a\xf9\x1a\xc7\x79\x18\x05\x05\x86\xda\xc4\xea\xb2\xf3\x83\x19\xc8\xc3\xaa\xff\x0f\x73\x44\xa3\xcf\xe3\xfc\xe4\xeb\x4e\xf0\x7e\x98\xfb\x73\xce\x70\xe2\xcd\x88\x21\x19\x3e\xc7\x9b\xa3\x69\xd6\x29\x27\x39\x84\x2a\xf4\xce\xa7\xe6\x1c\x46\xe4\x33\x40\xdb\x9b\x0f\x61\x81\xbc\x36\x74\x92\x41\x6c\xbf\xfe\xf9\xeb\xfc\xad\xd1\x71\xa1\x6b\x95\xa7\x01\x6f\x88\x54\x51\x07\x28\xd0\x45\x63\xf0\x76\x25\xb3\x15\x6c\x79\x7e\x4f\xb8\x72\x5f\x37\xba\x15\x42\x56\x1b\x43\x86\x69\x14\x6c\xc6\x09\x9c\xa4\xfc\x6f\xe2\x20\x2c\xeb\x42\xf6\x9b\x5c\x16\x84\x69\x53\x1a\xc6\x98\xb1\x49\xb0\x5f\xe5\x66\x02\x7a\x93\x30\x83\xdc\xe1\xe7\x33\x10\x45\xbf\xf4\x6d\x8f\x8d\x70\x98\x76\x47\x10\x02\xc2\x60\x6b\xeb\x17\x9d\xa7\x43\x2e\x0d\x66\x2e\x78\xbf\xf1\x73\xe0\xb1\x09\xfb\x9b\xab\xab\xcb\xab\xeb\x08\xee\xb3\xe3\xff\xc0\x93\xc3\xbd\x85\xb3\xb3\x81\xf4\x63\xcc\xe1\x45\x5b\x2b\xbd\x55\x29\x55\x0a\xe3\x57\x9d\xa8\xc8\x54\x61\x57\x02\xdd\xe8\x1c\xb4\x2a\x76\x60\xeb\xca\xbf\x03\xbd\xe0\x81\x6b\x62\x77\xd6\x61\x09\x73\xa9\x72\xa9\x96\x16\xb4\x81\xa5\x74\xab\x7a\x9e\x64\xba\x6c\xc7\xcd\xc3\xf9\xd2\x98\x26\x67\x66\x06\x85\x8b\xc1\xe4\x77\x39\x60\x92\x03\xb7\xdc\x4a\xb7\x02\x7e\xd0\x83\x12\xad\x15\x4b\x7c\x45\x8b\x68\xcc\x7e\xcf\x63\x6d\xbf\x96\xe9\xdc\x2f\xd0\x8f\x91\x6e\xa6\x07\xc9\xdf\x95\x41\x48\xf9\xbd\x9b\xf2\x17\x41\x5a\x20\xe6\xa9\x54\x1b\xbd\x8e\x01\xfa\x91\xc3\x16\x85\x0b\x4f\xc6\x17\x92\xb6\xc1\x76\xc5\x4f\x43\x01\xa9\xf3\xcf\x72\x61\xe9\xaf\x41\xbb\xc6\x5d\x3b\x43\xa1\x7a\x57\x38\x6d\x86\xe6\x43\x2d\x0d\x8f\x1b\x3e\x35\xc6\xbc\x25\x7f\x0c\x7c\x46\x65\x36\x43\xc6\x54\x69\xe7\x83\x5d\x44\xe0\xdb\xfe\x34\x92\x63\x35\x53\x53\xbf\xcb\xe3\xc0\x7e\x45\x3d\x26\x94\xab\xf7\x52\xda\x52\xb8\x2c\x56\xbe\x93\x82\xad\x7b\xd0\x86\x9c\x45\xe4\x4d\x3c\x95\xea\x78\xec\xed\xd7\x03\x06\xc8\x35\xfa\xc1\x12\x0b\xe1\x63\xe5\xf0\x46\x44\x65\x8f\xc9\xc1\x94\xd5\xaf\x36\x6a\x0c\x2b\x11\xfa\x7f\x72\x2f\x51\xc8\x98\xd9\x2e\xfc\x2a\x5d\xf3\x70\x24\xed\x40\x93\x64\x85\xdf\x84\xa5\x7b\x75\x3c\x40\xa5\x0d\x63\x17\xfc\x3e\xcc\x7b\xfc\xcf\x29\x76\x6e\x20\x8e\x98\xfa\xea\x31\x80\x8e\xec\xca\x57\xc1\x23\x7a\x66\xc1\x4f\x79\xbc\x29\xf1\x8b\x43\x65\x1b\xd0\xf8\x85\x73\x18\xa9\xf3\x35\xaa\xd8\x74\x89\xb1\x01\x66\x77\x95\x97\xe8\xdf\x35\x43\xec\xed\x86\xc8\x61\x58\xd3\x65\x32\xca\x6f\x32\xeb\x5d\xdf\xc9\x36\xf5\xd0\x53\xaf\x31\xdf\x9e\x56\x5a\x04\xdf\x81\xc2\x5c\x17\x92\x19\x3b\x2b\x0b\xb5\x6b\x7d\x83\x82\x48\xef\xd8\x47\xed\x1a\x86\xa8\x2d\x84\x51\x35\x6a\x53\x3c\xde\x73\xfd\x60\x2b\xb4\xd0\x37\x57\xbf\x32\x02\x1e\x75\xf1\x55\xfa\x74\xd0\x63\xdf\xfa\xc7\xea\x29\x40\x4a\x51\x2c\xb4\x29\xa3\x96\x7b\xdb\xac\x0f\x21\x48\xe0\x83\xd9\x81\x58\x0a\xa9\xc6\x5a\x7a\x63\xd2\xdf\xad\x56\x6d\xb0\xcd\xca\x7c\xe0\x4d\xf3\x9f\xd7\x97\xef\x40\xaa\xaa\x76\x90\x0b\x27\xe0\x6d\xb0\xc6\xb3\xac\xcc\x9f\x51\xe8\x1d\x96\x24\x2a\xd9\x4d\xe0\xf9\x38\x63\x4f\xd4\x0f\xdc\x8b\x5e\x28\xf7\xae\x7b\x10\xae\x66\x3c\xe0\xe6\x0d\x95\x24\xea\x4c\x28\x5f\x75\xcc\xd1\xe7\x7d\xcc\x61\x2e\x2c\xe6\xa0\x55\xdf\x9f\xee\xb3\x4a\xe0\x7d\x81\xc2\x22\xd4\x55\x2e\x1c\x1e\x85\x45\x4e\x8f\x59\x51\xe7\x78\x04\x4f\x58\x10\xb0\xc5\x79\x60\x3c\x6a\xf6\x70\x6b\x86\x3d\x2f\x66\x88\xb0\x2b\x81\x0b\xe7\xdb\x2a\xed\x56\x9c\x64\xf9\xba\x2c\x6a\x15\x2e\x4b\x73\xa3\x66\xde\x16\x5a\x61\x78\x69\x2c\x89\x0b\x7e\xa9\x30\x9b\x72\x45\x02\xd6\xe6\xec\x9a\x8b\x4f\x11\x2f\x25\xa9\x5f\x89\x9e\x81\x77\xb7\x9f\xd8\xea\xda\xf5\xa3\x40\x02\x1f\xbb\xe8\xda\xc4\x00\xda\x36\x6b\xe3\x04\xb9\x47\x53\x05\x8c\xe4\xab\xa0\x4e\x63\xa6\x94\xda\x10\x87\x69\x2e\xcd\xa4\xe8\xf5\xa0\x5a\xa4\x47\x6b\xf7\x4a\x4b\xe5\x6b\x25\xdf\x7b\x39\x0c\x15\x3f\x55\x28\xdd\x3d\x9d\x51\x6f\xd7\x68\x65\xb9\x59\x38\x0c\x5d\xc3\x6a\x64\x82\x3a\x71\xb1\xc1\x34\xd7\xd9\x1a\x63\xdf\xa4\xfd\x20\x14\x73\x15\x1b\x84\x73\x26\x04\x59\x72\x65\x3d\x52\x31\xca\x02\x53\x51\x18\x14\xf9\x2e\xc5\x2f\xd2\x46\x9f\xf3\x7f\xa4\x8b\x11\x28\xc1\x53\x46\x78\x7f\x7c\x7d\xf5\xee\xe2\xdd\x4f\xd3\xbb\x98\x66\xc3\xe3\xfa\x98\xad\x30\xaa\x1d\x95\x1a\x74\xd1\xda\xf1\x8a\xd6\xe8\xa0\x3e\x35\x33\xd2\x5b\x10\x0b\x87\xc6\xd7\xad\xaf\x7c\x62\xa1\x6c\x78\x3b\x74\x47\x82\x3c\x7e\x33\x7a\x74\x2a\xe9\x7f\x7c\xd1\x2b\x1d\x21\x47\x37\x7e\x3b\x59\x32\x55\xcb\x39\x56\x06\x33\x0a\x73\xa9\xc1\xaa\x10\x59\xd4\x7d\xa9\x9c\x24\x39\xba\xc8\x43\x91\xcc\x4f\x74\x3e\x2a\x1e\xce\x86\xb7\xb2\x28\xc0\x6a\xad\x28\x8a\x76\x12\x66\x50\x85\x08\x69\x7d\x97\xc0\xdd\x3d\x6e\x0f\xd8\x59\x87\x62\x22\xf6\x60\x89\x53\xea\x7b\xbb\xd2\x75\x91\x13\x3c\x8b\x2e\x81\x1b\xeb\x07\x5d\xbe\x0b\xe7\x67\x2f\xa6\xe6\x5f\xe3\x13\xee\x16\x11\xd3\x8f\x1c\x25\xe1\xf2\x12\xa8\x94\xbb\xdf\x77\xd0\xa5\xf3\x71\xee\x11\x22\x39\xfe\x88\xcd\xe0\xe1\x8d\x09\xe5\xfd\xcd\x81\x36\x13\x95\xe6\xc3\xb6\xfe\x17\x6d\xe3\xc0\x0a\x59\x4a\x97\xca\xa5\xd2\x26\x0a\xa9\x71\xe9\x10\x9c\x79\x0b\xa3\xe2\x5f\xc7\xbd\x05\x85\x7f\xcf\x6e\xaa\xf4\x6c\x25\xd4\x12\xc5\x3c\xfa\x01\xcd\xaf\xad\xc4\xb6\x99\xb1\x8d\xde\xc5\xce\x0f\xd3\x5a\x1e\x09\x5c\x90\x78\x6a\x08\x27\xf8\x02\x23\xb0\x69\xa1\x97\xa9\x95\x7f\xc4\x00\x14\x7a\x79\x2d\xff\xe0\xd4\xea\x37\x1c\x68\xdc\xb9\xa8\x50\xfc\x38\x4a\xcd\x73\xf3\x85\xdf\x4b\x4e\xd8\xdf\xbd\x9c\x0c\xa5\xc4\x52\x9b\xdd\x10\x1a\x4f\x71\x2a\xa0\xef\xbe\xff\x3b\x43\xfa\xdb\x77\xdf\x4f\xc6\x44\xf9\x57\xd7\xb1\x66\x24\xac\x9e\x04\xe6\xa5\xb7\xcf\xff\xbf\xa4\xff\xc6\xf1\xf0\x5c\x29\xad\x8c\xae\xd0\x38\x89\xb1\x7c\xd5\x44\xc0\x5e\xbc\xf2\xd3\x48\x67\x24\xb6\xf3\x48\x3f\xa4\xea\x98\x35\x73\xcb\x87\x63\x62\x13\x12\x73\xcd\x0e\x47\x91\x51\x3a\xd0\xb5\xb3\x32\xe7\x83\xf8\x60\xc4\x46\x5a\x98\xd7\xb2\xc8\x87\x87\x5a\xac\x8a\x0f\x07\x86\xdc\x76\x52\x28\x68\xbd\xff\x20\x20\xa8\xa3\x80\x1e\xac\xcd\xa3\xba\xbb\xbb\x24\xfc\x6d\x63\x6e\xea\xf8\xa5\x0a\x83\x1b\xfa\x83\xc8\x46\xda\x40\x86\xda\x94\x83\xfe\x92\xc5\xc2\x44\xd3\x5a\x07\x2a\x2a\x8d\x8e\xba\xec\x07\xca\xf3\x68\x23\x7d\x52\xf7\xcc\x68\xc3\x6c\x8e\x07\x2f\x83\x55\xcd\xbd\xb1\xcb\x41\x88\x39\x2a\x77\x9a\x9e\xc1\x62\x81\x19\x95\xae\xda\xad\xd0\xcf\x74\xc7\x21\x35\xa3\xce\xd1\xc9\x53\x48\x85\x47\x53\x9a\xa6\x60\xc8\xb4\x72\x82\x3f\x14\x53\x7a\xda\xf8\x94\xa5\xf7\x5e\x2e\xd8\x28\x53\x40\x3c\x38\xd7\x0f\x19\xe7\x78\x16\xb5\x0d\xed\xbd\x1f\x92\x05\xa2\xc3\x8e\x6b\xdc\x42\xbd\x2f\x0f\x53\xbd\x41\x63\x64\x9e\x63\xac\x7d\x24\x84\xfd\x0f\x11\xbb\x97\xa7\x6e\x6b\x53\x2b\xf4\x1f\x16\xa6\x1e\x54\x2a\x6d\x5a\xd5\xf3\x42\xc6\x3e\xb1\xf6\xa7\xc2\xb4\x4d\xe7\xea\xbf\xb5\x14\x16\xfc\xc6\x7b\xf3\xb6\x19\x85\x0b\x8e\x2d\x73\x84\x8d\xb4\x72\x5e\xf8\x66\x8e\x1a\x59\x8a\x8e\xfc\x64\x46\x4d\xec\x8e\x1a\x23\xad\x06\xbe\x5d\x64\xac\xa1\xc9\xd9\xe2\x3c\xc5\x2f\xfc\x29\xc9\x70\x1a\xbf\xdf\xce\x70\x53\xc9\x1d\xad\xca\xe9\xff\xcf\x3d\x9f\x7b\x5d\x25\x5d\x04\x32\xe5\x16\xe7\x33\x9f\xdc\xc3\x9f\xc2\x86\x81\x3e\xc3\x23\xed\x8d\x05\x08\xee\x49\xa3\x01\xf2\xb0\x7e\xff\x3d\x69\x20\xe0\xbf\x87\xe8\x35\xed\xf0\x83\x56\x1b\x0a\xf7\xa1\x25\xe8\x44\x38\x3d\xad\xbd\x3f\x7f\xf3\x8f\x9b\x9f\x26\xb7\x37\x4c\xfd\xb8\xde\x26\x9f\x2f\x53\x8b\xc2\x64\x2b\xb2\x57\x73\x31\xda\xf6\x32\xf6\x8f\x82\x9a\x1d\xed\xc5\x38\x6c\x48\x9b\x18\x42\x71\xb5\x4b\x20\x23\x25\x12\x41\x39\x8e\x1e\x7f\x76\xe4\x38\x31\x6a\x10\xb4\x36\xac\xfa\x97\xcb\x81\x7f\x8e\x72\xfe\xc0\xf8\x3c\x58\xe4\x15\xfc\xc8\x08\xba\x7f\xfd\xc0\x2f\x76\xc4\xec\xb1\x00\x86\xbf\x24\x7e\x3c\x86\xfe\xe3\x68\xf3\x98\x1f\x20\x3d\xb9\x7d\xf2\x9f\x00\x00\x00\xff\xff\xd1\x4e\x2d\xf4\xc3\x36\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -112,7 +112,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 13874, mode: os.FileMode(420), modTime: time.Unix(1522158494, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 14019, mode: os.FileMode(420), modTime: time.Unix(1522283010, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index 9824ddbc..b03692ad 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -291,10 +291,6 @@
     "id": "msg_err_json_missing_cmd_key",
     "translation": "JSON input data Missing 'cmd' key"
   },
-  {
-    "id": "msg_err_api_missing_web_action",
-    "translation": "Action [{{.action}}] is not a web action, API [{{.api}}] can only be created using web action. Please update manifest file to convert [{{.action}}] to web action.\n"
-  },
   {
     "id": "msg_err_api_missing_action",
     "translation": "Action [{{.action}}] is missing from manifest file, API [{{.api}}] can only be created based on the action from manifest file. Please update manifest file to include [{{.action}}] as a web action.\n"
@@ -399,6 +395,14 @@
     "id": "msg_warn_package_is_public",
     "translation": "[{{.package}}] is marked as public in manifest file, it will be visible and can be accessed by anyone"
   },
+  {
+    "id": "msg_warn_action_web_export_ignored",
+    "translation": "[{{.action}}] has both web and web-export specified, only reading web, ignoring web-export."
+  },
+  {
+    "id": "msg_warn_api_missing_web_action",
+    "translation": "Action [{{.action}}] is not a web action, API [{{.api}}] can only be created using web action. Converting [{{.action}}] to a web action.\n"
+  },
   {
     "id": "DEBUG",
     "translation": "================= DEBUG ==================="


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services