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/06/07 21:13:18 UTC
[GitHub] mrutkows closed pull request #946: runtimes
mrutkows closed pull request #946: runtimes
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/946
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/cmd/export.go b/cmd/export.go
index 746854c0..5135dba6 100644
--- a/cmd/export.go
+++ b/cmd/export.go
@@ -27,6 +27,7 @@ import (
"github.com/apache/incubator-openwhisk-client-go/whisk"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
"github.com/spf13/cobra"
@@ -389,7 +390,7 @@ func saveCode(action whisk.Action, directory string) (string, error) {
filename = action.Name + getBinaryKindExtension(runtime)
} else {
- filename = action.Name + "." + utils.FileRuntimeExtensionsMap[action.Exec.Kind]
+ filename = action.Name + "." + runtimes.FileRuntimeExtensionsMap[action.Exec.Kind]
}
os.MkdirAll(directory, os.ModePerm)
diff --git a/cmd/root.go b/cmd/root.go
index 2af84240..7ceaf2a2 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -24,7 +24,9 @@ import (
"strings"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
@@ -118,14 +120,16 @@ func initConfig() {
}
// TODO() add Trace of runtimes found at apihost
-func setSupportedRuntimes(apiHost string) {
- op, error := utils.ParseOpenWhisk(apiHost)
- if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
- utils.FileRuntimeExtensionsMap = utils.FileRuntimeExtensions(op)
+func setSupportedRuntimes(apiHost string) error {
+ op, err := runtimes.ParseOpenWhisk(apiHost)
+ if err != nil {
+ return err
}
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
+ runtimes.FileRuntimeExtensionsMap = runtimes.FileRuntimeExtensions(op)
+ return nil
}
func displayCommandUsingFilenameMessage(command string, filetype string, path string) {
@@ -206,7 +210,7 @@ func Deploy() error {
deployer.Report = utils.Flags.Report
// master record of any dependency that has been downloaded
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
// Read credentials from Configuration file, manifest file or deployment file
clientConfig, error := deployers.NewWhiskConfig(
@@ -226,10 +230,13 @@ func Deploy() error {
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
// Construct Deployment Plan
- err := deployer.ConstructDeploymentPlan()
+ err = deployer.ConstructDeploymentPlan()
if err != nil {
return err
}
@@ -275,9 +282,12 @@ func Undeploy() error {
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
- err := deployer.UnDeployProject()
+ err = deployer.UnDeployProject()
if err != nil {
return err
}
@@ -327,7 +337,10 @@ func Undeploy() error {
deployer.ClientConfig = clientConfig
// The auth, apihost and namespace have been chosen, so that we can check the supported runtimes here.
- setSupportedRuntimes(clientConfig.Host)
+ err := setSupportedRuntimes(clientConfig.Host)
+ if err != nil {
+ return err
+ }
verifiedPlan, err := deployer.ConstructUnDeploymentPlan()
if err != nil {
diff --git a/utils/conductor.go b/conductor/conductor.go
similarity index 98%
rename from utils/conductor.go
rename to conductor/conductor.go
index 8688d81f..8f833d14 100644
--- a/utils/conductor.go
+++ b/conductor/conductor.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package conductor
import "github.com/apache/incubator-openwhisk-client-go/whisk"
diff --git a/utils/conductor_test.go b/conductor/conductor_test.go
similarity index 98%
rename from utils/conductor_test.go
rename to conductor/conductor_test.go
index ffaab6b6..0a007fbf 100644
--- a/utils/conductor_test.go
+++ b/conductor/conductor_test.go
@@ -17,7 +17,7 @@
* limitations under the License.
*/
-package utils
+package conductor
import (
"testing"
diff --git a/utils/dependencies.go b/dependencies/dependencies.go
similarity index 99%
rename from utils/dependencies.go
rename to dependencies/dependencies.go
index eba29b8a..062b2d6c 100644
--- a/utils/dependencies.go
+++ b/dependencies/dependencies.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"strings"
diff --git a/utils/dependencies_test.go b/dependencies/dependencies_test.go
similarity index 99%
rename from utils/dependencies_test.go
rename to dependencies/dependencies_test.go
index 7ed5c24a..2f4ccb04 100644
--- a/utils/dependencies_test.go
+++ b/dependencies/dependencies_test.go
@@ -17,7 +17,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"testing"
diff --git a/utils/gitreader.go b/dependencies/gitreader.go
similarity index 99%
rename from utils/gitreader.go
rename to dependencies/gitreader.go
index 741da885..09a62a2f 100644
--- a/utils/gitreader.go
+++ b/dependencies/gitreader.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package dependencies
import (
"archive/zip"
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index 29fbd941..64349076 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -22,6 +22,7 @@ import (
"fmt"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
@@ -161,7 +162,7 @@ func (reader *ManifestReader) SetPackages(packages map[string]*whisk.Package, in
return nil
}
-func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRecord) error {
+func (reader *ManifestReader) SetDependencies(deps map[string]dependencies.DependencyRecord) error {
dep := reader.serviceDeployer
@@ -176,7 +177,7 @@ func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRe
}
if !dependency.IsBinding && !reader.IsUndeploy {
if _, exists := dep.DependencyMaster[depName]; exists {
- if !utils.CompareDependencyRecords(dep.DependencyMaster[depName], dependency) {
+ if !dependencies.CompareDependencyRecords(dep.DependencyMaster[depName], dependency) {
location := strings.Join([]string{dep.DependencyMaster[depName].Location, dependency.Location}, ",")
errmsg := wski18n.T(wski18n.ID_ERR_DEPENDENCIES_WITH_SAME_LABEL_X_dependency_X_location_X,
map[string]interface{}{wski18n.KEY_DEPENDENCY: depName,
@@ -184,7 +185,7 @@ func (reader *ManifestReader) SetDependencies(deps map[string]utils.DependencyRe
return wskderrors.NewYAMLParserErr(dep.ManifestPath, errmsg)
}
}
- gitReader := utils.NewGitReader(depName, dependency)
+ gitReader := dependencies.NewGitReader(depName, dependency)
err := gitReader.CloneDependency()
if err != nil {
return err
diff --git a/deployers/manifestreader_test.go b/deployers/manifestreader_test.go
index c0ea0d75..475608a9 100644
--- a/deployers/manifestreader_test.go
+++ b/deployers/manifestreader_test.go
@@ -24,7 +24,9 @@ import (
"testing"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"github.com/stretchr/testify/assert"
@@ -63,7 +65,7 @@ func buildServiceDeployer(manifestFile string) (*ServiceDeployer, error) {
deployer.DeploymentPath = deploymentFile
deployer.Preview = utils.Flags.Preview
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
config := whisk.Config{
Namespace: "test",
@@ -73,12 +75,12 @@ func buildServiceDeployer(manifestFile string) (*ServiceDeployer, error) {
}
deployer.ClientConfig = &config
- op, error := utils.ParseOpenWhisk(deployer.ClientConfig.Host)
+ op, error := runtimes.ParseOpenWhisk(deployer.ClientConfig.Host)
if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
- utils.FileRuntimeExtensionsMap = utils.FileRuntimeExtensions(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
+ runtimes.FileRuntimeExtensionsMap = runtimes.FileRuntimeExtensions(op)
}
return deployer, nil
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index d5447c05..a0e84e7c 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -29,6 +29,7 @@ import (
"time"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/parsers"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
@@ -61,7 +62,7 @@ func NewDeploymentProject() *DeploymentProject {
type DeploymentPackage struct {
Package *whisk.Package
- Dependencies map[string]utils.DependencyRecord
+ Dependencies map[string]dependencies.DependencyRecord
Actions map[string]utils.ActionRecord
Sequences map[string]utils.ActionRecord
Inputs parsers.PackageInputs
@@ -69,7 +70,7 @@ type DeploymentPackage struct {
func NewDeploymentPackage() *DeploymentPackage {
var dep DeploymentPackage
- dep.Dependencies = make(map[string]utils.DependencyRecord)
+ dep.Dependencies = make(map[string]dependencies.DependencyRecord)
dep.Actions = make(map[string]utils.ActionRecord)
dep.Sequences = make(map[string]utils.ActionRecord)
dep.Inputs = parsers.PackageInputs{}
@@ -94,7 +95,7 @@ type ServiceDeployer struct {
ProjectPath string
DeploymentPath string
ClientConfig *whisk.Config
- DependencyMaster map[string]utils.DependencyRecord
+ DependencyMaster map[string]dependencies.DependencyRecord
ManagedAnnotation whisk.KeyValue
}
@@ -103,7 +104,7 @@ func NewServiceDeployer() *ServiceDeployer {
var dep ServiceDeployer
dep.Deployment = NewDeploymentProject()
dep.Preview = true
- dep.DependencyMaster = make(map[string]utils.DependencyRecord)
+ dep.DependencyMaster = make(map[string]dependencies.DependencyRecord)
dep.ProjectInputs = make(map[string]parsers.Parameter, 0)
return &dep
}
@@ -1594,7 +1595,7 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentProject
}
-func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord utils.DependencyRecord) (*ServiceDeployer, error) {
+func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord dependencies.DependencyRecord) (*ServiceDeployer, error) {
depServiceDeployer := NewServiceDeployer()
projectPath := path.Join(depRecord.ProjectPath, depName+"-"+depRecord.Version)
if len(depRecord.SubFolder) > 0 {
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index b41a7bee..f7853be6 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -20,15 +20,20 @@ package parsers
import (
"encoding/base64"
"errors"
- "gopkg.in/yaml.v2"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
+ "gopkg.in/yaml.v2"
+
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/conductor"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/webaction"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wskenv"
"github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
@@ -184,8 +189,8 @@ func (dm *YAMLParser) composeAnnotations(annotations map[string]interface{}) whi
return listOfAnnotations
}
-func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, managedAnnotations whisk.KeyValue, packageInputs map[string]PackageInputs) (map[string]utils.DependencyRecord, error) {
- dependencies := make(map[string]utils.DependencyRecord)
+func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, projectPath string, filePath string, managedAnnotations whisk.KeyValue, packageInputs map[string]PackageInputs) (map[string]dependencies.DependencyRecord, error) {
+ dependencies := make(map[string]dependencies.DependencyRecord)
packages := make(map[string]Package)
if len(manifest.Packages) != 0 {
@@ -207,9 +212,9 @@ func (dm *YAMLParser) ComposeDependenciesFromAllPackages(manifest *YAML, project
return dependencies, nil
}
-func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, managedAnnotations whisk.KeyValue, packageInputs PackageInputs) (map[string]utils.DependencyRecord, error) {
+func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, filePath string, packageName string, managedAnnotations whisk.KeyValue, packageInputs PackageInputs) (map[string]dependencies.DependencyRecord, error) {
- depMap := make(map[string]utils.DependencyRecord)
+ depMap := make(map[string]dependencies.DependencyRecord)
for key, dependency := range pkg.Dependencies {
version := dependency.Version
if len(version) == 0 {
@@ -219,12 +224,12 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
location := dependency.Location
isBinding := false
- if utils.LocationIsBinding(location) {
+ if dependencies.LocationIsBinding(location) {
if !strings.HasPrefix(location, PATH_SEPARATOR) {
location = PATH_SEPARATOR + dependency.Location
}
isBinding = true
- } else if utils.LocationIsGithub(location) {
+ } else if dependencies.LocationIsGithub(location) {
// TODO() define const for the protocol prefix, etc.
if !strings.HasPrefix(location, HTTPS) && !strings.HasPrefix(location, HTTP) {
@@ -250,7 +255,7 @@ func (dm *YAMLParser) ComposeDependencies(pkg Package, projectPath string, fileP
packDir := path.Join(projectPath, strings.Title(YAML_KEY_PACKAGES))
depName := packageName + ":" + key
- depMap[depName] = utils.NewDependencyRecord(packDir, packageName, location, version, inputs, annotations, isBinding)
+ depMap[depName] = dependencies.NewDependencyRecord(packDir, packageName, location, version, inputs, annotations, isBinding)
}
return depMap, nil
@@ -504,7 +509,7 @@ func (dm *YAMLParser) ComposeSequences(namespace string, sequences map[string]Se
// 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)
+ wskaction.Annotations, errorParser = webaction.WebAction(manifestFilePath, wskaction.Name, sequence.Web, wskaction.Annotations, false)
if errorParser != nil {
return nil, errorParser
}
@@ -566,10 +571,10 @@ func (dm *YAMLParser) readActionCode(manifestFilePath string, action Action) (*w
// even if runtime is invalid, deploy action with specified runtime in strict mode
if utils.Flags.Strict {
exec.Kind = action.Runtime
- } else if utils.CheckExistRuntime(action.Runtime, utils.SupportedRunTimes) {
+ } else if runtimes.CheckExistRuntime(action.Runtime, runtimes.SupportedRunTimes) {
exec.Kind = action.Runtime
- } else if len(utils.DefaultRunTimes[action.Runtime]) != 0 {
- exec.Kind = utils.DefaultRunTimes[action.Runtime]
+ } else if len(runtimes.DefaultRunTimes[action.Runtime]) != 0 {
+ exec.Kind = runtimes.DefaultRunTimes[action.Runtime]
} else {
err := wski18n.T(wski18n.ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X,
map[string]interface{}{
@@ -590,16 +595,16 @@ func (dm *YAMLParser) validateActionFunction(manifestFileName string, action Act
// and its not explicitly specified in the manifest YAML file
// and action source is not a zip file
if len(action.Runtime) == 0 && len(action.Docker) == 0 && !action.Native {
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X,
map[string]interface{}{
- wski18n.KEY_RUNTIME: utils.RUNTIME_NOT_SPECIFIED,
+ wski18n.KEY_RUNTIME: runtimes.RUNTIME_NOT_SPECIFIED,
wski18n.KEY_ACTION: action.Name})
return wskderrors.NewInvalidRuntimeError(errMessage,
manifestFileName,
action.Name,
- utils.RUNTIME_NOT_SPECIFIED,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.RUNTIME_NOT_SPECIFIED,
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
} else if len(kind) == 0 {
errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_ACTION_SOURCE_NOT_SUPPORTED_X_ext_X_action_X,
map[string]interface{}{
@@ -608,8 +613,8 @@ func (dm *YAMLParser) validateActionFunction(manifestFileName string, action Act
return wskderrors.NewInvalidRuntimeError(errMessage,
manifestFileName,
action.Name,
- utils.RUNTIME_NOT_SPECIFIED,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.RUNTIME_NOT_SPECIFIED,
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
}
}
return nil
@@ -639,7 +644,7 @@ func (dm *YAMLParser) readActionFunction(manifestFilePath string, manifestFileNa
}
if utils.IsDirectory(actionFilePath) {
- zipFileName = actionFilePath + "." + utils.ZIP_FILE_EXTENSION
+ zipFileName = actionFilePath + "." + runtimes.ZIP_FILE_EXTENSION
err := utils.NewZipWritter(actionFilePath, zipFileName).Zip()
if err != nil {
return actionFilePath, nil, err
@@ -659,8 +664,8 @@ func (dm *YAMLParser) readActionFunction(manifestFilePath string, manifestFileNa
// determine default runtime for the given file extension
var kind string
- r := utils.FileExtensionRuntimeKindMap[ext]
- kind = utils.DefaultRunTimes[r]
+ r := runtimes.FileExtensionRuntimeKindMap[ext]
+ kind = runtimes.DefaultRunTimes[r]
if err := dm.validateActionFunction(manifestFileName, action, ext, kind); err != nil {
return actionFilePath, nil, err
}
@@ -671,7 +676,7 @@ func (dm *YAMLParser) readActionFunction(manifestFilePath string, manifestFileNa
return actionFilePath, nil, err
}
code := string(dat)
- if ext == utils.ZIP_FILE_EXTENSION || ext == utils.JAR_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION || ext == runtimes.JAR_FILE_EXTENSION {
code = base64.StdEncoding.EncodeToString([]byte(dat))
}
exec.Code = &code
@@ -684,13 +689,13 @@ func (dm *YAMLParser) readActionFunction(manifestFilePath string, manifestFileNa
* Set the action runtime to match with the source file extension, if wskdeploy is not invoked in strict mode
*/
if len(action.Runtime) != 0 {
- if utils.CheckExistRuntime(action.Runtime, utils.SupportedRunTimes) {
+ if runtimes.CheckExistRuntime(action.Runtime, runtimes.SupportedRunTimes) {
// for zip actions, rely on the runtimes from the manifest file as it can not be derived from the action source file extension
// pick runtime from manifest file if its supported by OpenWhisk server
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
exec.Kind = action.Runtime
} else {
- if utils.CheckRuntimeConsistencyWithFileExtension(ext, action.Runtime) {
+ if runtimes.CheckRuntimeConsistencyWithFileExtension(ext, action.Runtime) {
exec.Kind = action.Runtime
} else {
warnStr := wski18n.T(wski18n.ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X,
@@ -719,20 +724,24 @@ func (dm *YAMLParser) readActionFunction(manifestFilePath string, manifestFileNa
wski18n.KEY_ACTION: action.Name})
wskprint.PrintOpenWhiskWarning(warnStr)
- if ext == utils.ZIP_FILE_EXTENSION {
+ if ext == runtimes.ZIP_FILE_EXTENSION {
// for zip action, error out if specified runtime is not supported by
// OpenWhisk server
return actionFilePath, nil, wskderrors.NewInvalidRuntimeError(warnStr,
manifestFileName,
action.Name,
action.Runtime,
- utils.ListOfSupportedRuntimes(utils.SupportedRunTimes))
+ runtimes.ListOfSupportedRuntimes(runtimes.SupportedRunTimes))
} else {
- warnStr := wski18n.T(wski18n.ID_WARN_RUNTIME_CHANGED_X_runtime_X_action_X,
- map[string]interface{}{
- wski18n.KEY_RUNTIME: exec.Kind,
- wski18n.KEY_ACTION: action.Name})
- wskprint.PrintOpenWhiskWarning(warnStr)
+ if utils.Flags.Strict {
+ exec.Kind = action.Runtime
+ } else {
+ warnStr := wski18n.T(wski18n.ID_WARN_RUNTIME_CHANGED_X_runtime_X_action_X,
+ map[string]interface{}{
+ wski18n.KEY_RUNTIME: exec.Kind,
+ wski18n.KEY_ACTION: action.Name})
+ wskprint.PrintOpenWhiskWarning(warnStr)
+ }
}
}
@@ -769,7 +778,7 @@ func (dm *YAMLParser) composeActionExec(manifestFilePath string, manifestFileNam
// when an action Native is set to true,
// set exec.Image to openwhisk/skeleton
if len(action.Docker) != 0 || action.Native {
- exec.Kind = utils.BLACKBOX
+ exec.Kind = runtimes.BLACKBOX
if action.Native {
exec.Image = NATIVE_DOCKER_IMAGE
} else {
@@ -900,7 +909,7 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
// when web-export is set to no | false, treat action as a standard action
dm.validateActionWebFlag(action)
if len(action.GetWeb()) != 0 {
- wskaction.Annotations, errorParser = utils.WebAction(manifestFilePath, action.Name, action.GetWeb(), wskaction.Annotations, false)
+ wskaction.Annotations, errorParser = webaction.WebAction(manifestFilePath, action.Name, action.GetWeb(), wskaction.Annotations, false)
if errorParser != nil {
return listOfActions, errorParser
}
@@ -914,7 +923,7 @@ func (dm *YAMLParser) ComposeActions(manifestFilePath string, actions map[string
}
// Conductor Action
if action.Conductor {
- wskaction.Annotations = append(wskaction.Annotations, utils.ConductorAction())
+ wskaction.Annotations = append(wskaction.Annotations, conductor.ConductorAction())
}
wskaction.Name = actionName
@@ -1154,7 +1163,7 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
// verify that the action is defined as web action
// web or web-export set to any of [true, yes, raw]
a := pkg.Actions[actionName]
- if !utils.IsWebAction(a.GetWeb()) {
+ if !webaction.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,
@@ -1163,7 +1172,7 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
if a.Annotations == nil {
a.Annotations = make(map[string]interface{}, 0)
}
- a.Annotations[utils.WEB_EXPORT_ANNOT] = true
+ a.Annotations[webaction.WEB_EXPORT_ANNOT] = true
pkg.Actions[actionName] = a
}
// verify that the sequence is defined under sequences sections
@@ -1171,7 +1180,7 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
// verify that the sequence is defined as web sequence
// web set to any of [true, yes, raw]
a := pkg.Sequences[actionName]
- if !utils.IsWebSequence(a.Web) {
+ if !webaction.IsWebSequence(a.Web) {
warningString := wski18n.T(wski18n.ID_WARN_API_MISSING_WEB_SEQUENCE_X_sequence_X_api_X,
map[string]interface{}{
wski18n.KEY_SEQUENCE: actionName,
@@ -1180,7 +1189,7 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
if a.Annotations == nil {
a.Annotations = make(map[string]interface{}, 0)
}
- a.Annotations[utils.WEB_EXPORT_ANNOT] = true
+ a.Annotations[webaction.WEB_EXPORT_ANNOT] = true
pkg.Sequences[actionName] = a
}
// return failure since action or sequence are not defined in the manifest
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index 8cbe6443..b4a3cc80 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -30,7 +30,7 @@ import (
"testing"
"github.com/apache/incubator-openwhisk-client-go/whisk"
- "github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"github.com/stretchr/testify/assert"
@@ -49,7 +49,7 @@ const (
TEST_MSG_PARAMETER_NUMBER_MISMATCH = "Number of Paramaters mismatched."
TEST_MSG_MANIFEST_UNMARSHALL_ERROR_EXPECTED = "Manifest [%s]: Expected Unmarshal error."
TEST_MSG_ACTION_FUNCTION_RUNTIME_ERROR_EXPECTED = "Manifest [%s]: Expected runtime error."
- TEST_MSG_ACTION_DOCKER_KIND_MISMATCH = "Docker action kind is set to [%s] instead of " + utils.BLACKBOX
+ TEST_MSG_ACTION_DOCKER_KIND_MISMATCH = "Docker action kind is set to [%s] instead of " + runtimes.BLACKBOX
TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH = "Docker action image had a value mismatch."
TEST_MSG_ACTION_CODE_MISSING = "Action code is missing."
TEST_MSG_ACTION_FUNCTION_PATH_MISSING = "Action function path missing"
@@ -66,11 +66,11 @@ const (
)
func init() {
- op, error := utils.ParseOpenWhisk("")
+ op, error := runtimes.ParseOpenWhisk("")
if error == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
}
}
@@ -507,13 +507,13 @@ func TestComposeActionsForImplicitRuntimes(t *testing.T) {
var expectedResult string
for i := 0; i < len(actions); i++ {
if actions[i].Action.Name == "helloNodejs" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["js"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["js"]]
} else if actions[i].Action.Name == "helloJava" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["jar"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["jar"]]
} else if actions[i].Action.Name == "helloPython" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["py"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["py"]]
} else if actions[i].Action.Name == "helloSwift" {
- expectedResult = utils.DefaultRunTimes[utils.FileExtensionRuntimeKindMap["swift"]]
+ expectedResult = runtimes.DefaultRunTimes[runtimes.FileExtensionRuntimeKindMap["swift"]]
}
actualResult := actions[i].Action.Exec.Kind
assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_RUNTIME_MISMATCH)
@@ -916,23 +916,23 @@ func TestComposeActionsForDocker(t *testing.T) {
switch action.Action.Name {
case "OpenWhiskSkeleton":
case "OpenWhiskSkeletonWithNative":
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction1":
case "CustomDockerAction2":
expectedResult, _ = filepath.Abs(actionFile)
actualResult, _ = filepath.Abs(action.Filepath)
assert.Equal(t, expectedResult, actualResult, TEST_MSG_ACTION_FUNCTION_PATH_MISMATCH)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction3":
case "CustomDockerAction4":
assert.NotNil(t, action.Action.Exec.Code, TEST_MSG_ACTION_CODE_MISSING)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, NATIVE_DOCKER_IMAGE, action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
case "CustomDockerAction5":
assert.NotNil(t, action.Action.Exec.Code, TEST_MSG_ACTION_CODE_MISSING)
- assert.Equal(t, utils.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
+ assert.Equal(t, runtimes.BLACKBOX, action.Action.Exec.Kind, fmt.Sprintf(TEST_MSG_ACTION_DOCKER_KIND_MISMATCH, action.Action.Exec.Kind))
assert.Equal(t, "mydockerhub/myimage", action.Action.Exec.Image, TEST_MSG_ACTION_DOCKER_IMAGE_MISMATCH)
}
}
diff --git a/utils/runtimes.go b/runtimes/runtimes.go
similarity index 71%
rename from utils/runtimes.go
rename to runtimes/runtimes.go
index 15399efb..361c614d 100644
--- a/utils/runtimes.go
+++ b/runtimes/runtimes.go
@@ -15,18 +15,23 @@
* limitations under the License.
*/
-package utils
+package runtimes
import (
"crypto/tls"
"encoding/json"
- "github.com/apache/incubator-openwhisk-client-go/whisk"
- "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
- "github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
"io/ioutil"
"net/http"
"strings"
"time"
+
+ "github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/utils"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
+ "github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
+ "path/filepath"
+ "runtime"
)
const (
@@ -41,14 +46,15 @@ const (
HTTP_CONTENT_TYPE_VALUE = "application/json; charset=UTF-8"
RUNTIME_NOT_SPECIFIED = "NOT SPECIFIED"
BLACKBOX = "blackbox"
- HTTP_FILE_EXTENSION = "http"
+ RUNTIMES_FILE_NAME = "runtimes.json"
+ HTTPS = "https://"
)
// Structs used to denote the OpenWhisk Runtime information
type Limit struct {
- Apm uint16 `json:"actions_per_minute"`
- Tpm uint16 `json:"triggers_per_minute"`
- ConAction uint16 `json:"concurrent_actions"`
+ Apm uint `json:"actions_per_minute"`
+ Tpm uint `json:"triggers_per_minute"`
+ ConAction uint `json:"concurrent_actions"`
}
type Runtime struct {
@@ -82,7 +88,7 @@ var FileRuntimeExtensionsMap map[string]string
// `curl -k https://openwhisk.ng.bluemix.net`
// hard coding it here in case of network unavailable or failure.
func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
- url := "https://" + apiHost
+ url := HTTPS + apiHost
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set(HTTP_CONTENT_TYPE_KEY, HTTP_CONTENT_TYPE_VALUE)
tlsConfig := &tls.Config{
@@ -94,7 +100,7 @@ func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
}
var netClient = &http.Client{
- Timeout: time.Second * DEFAULT_HTTP_TIMEOUT,
+ Timeout: time.Second * utils.DEFAULT_HTTP_TIMEOUT,
Transport: netTransport,
}
@@ -104,6 +110,12 @@ func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
errString := wski18n.T(wski18n.ID_ERR_RUNTIMES_GET_X_err_X,
map[string]interface{}{"err": err.Error()})
whisk.Debug(whisk.DbgWarn, errString)
+ if utils.Flags.Strict {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ return
+ }
}
if res != nil {
@@ -114,7 +126,15 @@ func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
if err != nil || !strings.Contains(HTTP_CONTENT_TYPE_VALUE, res.Header.Get(HTTP_CONTENT_TYPE_KEY)) {
stdout := wski18n.T(wski18n.ID_MSG_UNMARSHAL_LOCAL)
wskprint.PrintOpenWhiskInfo(stdout)
- err = json.Unmarshal(RUNTIME_DETAILS, &op)
+ runtimeDetails := readRuntimes()
+ if runtimeDetails != nil {
+ err = json.Unmarshal(runtimeDetails, &op)
+ if err != nil {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ }
+ }
} else {
b, _ := ioutil.ReadAll(res.Body)
if b != nil && len(b) > 0 {
@@ -122,6 +142,11 @@ func ParseOpenWhisk(apiHost string) (op OpenWhiskInfo, err error) {
map[string]interface{}{"url": url})
wskprint.PrintOpenWhiskInfo(stdout)
err = json.Unmarshal(b, &op)
+ if err != nil {
+ errMessage := wski18n.T(wski18n.ID_ERR_RUNTIME_PARSER_ERROR,
+ map[string]interface{}{wski18n.KEY_ERR: err.Error()})
+ err = wskderrors.NewRuntimeParserError(errMessage)
+ }
}
}
return
@@ -226,101 +251,14 @@ func ListOfSupportedRuntimes(runtimes map[string][]string) (rt []string) {
return
}
-var RUNTIME_DETAILS = []byte(`{
- "support":{
- "github":"https://github.com/apache/incubator-openwhisk/issues",
- "slack":"http://slack.openwhisk.org"
- },
- "description":"OpenWhisk",
- "api_paths":["/api/v1"],
- "runtimes":{
- "nodejs":[{
- "image":"openwhisk/nodejsaction:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"nodejs"
- },{
- "image":"openwhisk/nodejs6action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"nodejs:6"
- },{
- "image":"openwhisk/action-nodejs-v8:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"nodejs:8"
- }],
- "java":[{
- "image":"openwhisk/java8action:latest",
- "deprecated":false,
- "requireMain":true,
- "default":true,
- "attached":true,
- "kind":"java"
- }],
- "php":[{
- "image":"openwhisk/action-php-v7.1:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"php:7.1"
- }],
- "python":[{
- "image":"openwhisk/python2action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"python"
- },{
- "image":"openwhisk/python2action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"python:2"
- },{
- "image":"openwhisk/python3action:latest",
- "deprecated":false,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"python:3"
- }],
- "swift":[{
- "image":"openwhisk/swiftaction:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"swift"
- },{
- "image":"openwhisk/swift3action:latest",
- "deprecated":true,
- "requireMain":false,
- "default":false,
- "attached":false,
- "kind":"swift:3"
- },{
- "image":"openwhisk/action-swift-v3.1.1:latest",
- "deprecated":false,
- "requireMain":false,
- "default":true,
- "attached":false,
- "kind":"swift:3.1.1"
- }]
- },
- "limits":{
- "actions_per_minute":5000,
- "triggers_per_minute":5000,
- "concurrent_actions":1000
- }
+func readRuntimes() []byte {
+ _, b, _, _ := runtime.Caller(0)
+ basepath := filepath.Dir(b)
+ runtimesFileWithPath := filepath.Join(basepath, RUNTIMES_FILE_NAME)
+ file, readErr := ioutil.ReadFile(runtimesFileWithPath)
+ if readErr != nil {
+ wskprint.PrintlnOpenWhiskWarning(readErr.Error())
+ return nil
}
-`)
+ return file
+}
diff --git a/runtimes/runtimes.json b/runtimes/runtimes.json
new file mode 100644
index 00000000..857331ff
--- /dev/null
+++ b/runtimes/runtimes.json
@@ -0,0 +1,131 @@
+{
+ "support": {
+ "github": "https://github.com/apache/incubator-openwhisk/issues",
+ "slack": "http://slack.openwhisk.org"
+ },
+ "description": "OpenWhisk",
+ "api_paths": [
+ "/api/v1"
+ ],
+ "runtimes": {
+ "nodejs": [
+ {
+ "image": "openwhisk/nodejsaction:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "nodejs"
+ },
+ {
+ "image": "openwhisk/nodejs6action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "nodejs:6"
+ },
+ {
+ "image": "ibmfunctions/action-nodejs-v8:1.13.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "nodejs:8"
+ }
+ ],
+ "java": [
+ {
+ "image": "openwhisk/java8action:latest",
+ "deprecated": false,
+ "requireMain": true,
+ "default": true,
+ "attached": true,
+ "kind": "java"
+ }
+ ],
+ "php": [
+ {
+ "image": "openwhisk/action-php-v7.1:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "php:7.1"
+ }
+ ],
+ "python": [
+ {
+ "image": "openwhisk/python2action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python"
+ },
+ {
+ "image": "openwhisk/python2action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "python:2"
+ },
+ {
+ "image": "openwhisk/python3action:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python:3"
+ },
+ {
+ "image": "ibmfunctions/action-python-v3:1.6.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "python-jessie:3"
+ }
+ ],
+ "swift": [
+ {
+ "image": "openwhisk/swiftaction:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift"
+ },
+ {
+ "image": "openwhisk/swift3action:latest",
+ "deprecated": true,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift:3"
+ },
+ {
+ "image": "openwhisk/action-swift-v3.1.1:latest",
+ "deprecated": false,
+ "requireMain": false,
+ "default": true,
+ "attached": false,
+ "kind": "swift:3.1.1"
+ },
+ {
+ "image": "ibmfunctions/action-swift-v4.1:1.5.0",
+ "deprecated": false,
+ "requireMain": false,
+ "default": false,
+ "attached": false,
+ "kind": "swift:4.1"
+ }
+ ]
+ },
+ "limits": {
+ "actions_per_minute": 5000,
+ "triggers_per_minute": 5000,
+ "concurrent_actions": 1000
+ }
+}
diff --git a/runtimes/runtimes_test.go b/runtimes/runtimes_test.go
new file mode 100644
index 00000000..f7650e3c
--- /dev/null
+++ b/runtimes/runtimes_test.go
@@ -0,0 +1,35 @@
+/*
+ * 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 runtimes
+
+import (
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestParseOpenWhisk(t *testing.T) {
+ openwhiskHost := "https://openwhisk.ng.bluemix.net"
+ openwhisk, err := ParseOpenWhisk(openwhiskHost)
+ assert.Equal(t, nil, err, "parse openwhisk info error happened.")
+ converted := ConvertToMap(openwhisk)
+ assert.Equal(t, 2, len(converted["nodejs"]), "not expected length")
+ assert.Equal(t, 1, len(converted["php"]), "not expected length")
+ assert.Equal(t, 1, len(converted["java"]), "not expected length")
+ assert.Equal(t, 4, len(converted["python"]), "not expected length")
+ assert.Equal(t, 2, len(converted["swift"]), "not expected length")
+}
diff --git a/tests/src/integration/common/wskdeploy.go b/tests/src/integration/common/wskdeploy.go
index 32938a23..5dddf563 100644
--- a/tests/src/integration/common/wskdeploy.go
+++ b/tests/src/integration/common/wskdeploy.go
@@ -28,7 +28,9 @@ import (
"strings"
"github.com/apache/incubator-openwhisk-client-go/whisk"
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/apache/incubator-openwhisk-wskdeploy/deployers"
+ "github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
"github.com/apache/incubator-openwhisk-wskdeploy/utils"
"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
"github.com/fatih/color"
@@ -197,7 +199,7 @@ func (wskdeploy *Wskdeploy) GetDeploymentObjects(manifestPath string, deployment
deployer.ProjectPath = filepath.Dir(manifestPath)
deployer.ManifestPath = manifestPath
deployer.DeploymentPath = deploymentPath
- deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+ deployer.DependencyMaster = make(map[string]dependencies.DependencyRecord)
//create client config with namespace, apihost, authkey and etc.
//these values might be mock values because it's only for testing
@@ -211,11 +213,11 @@ func (wskdeploy *Wskdeploy) GetDeploymentObjects(manifestPath string, deployment
//setSupportedRuntimes(apiHost string)
//only for testing, mock values
- op, err := utils.ParseOpenWhisk(clientConfig.Host)
+ op, err := runtimes.ParseOpenWhisk(clientConfig.Host)
if err == nil {
- utils.SupportedRunTimes = utils.ConvertToMap(op)
- utils.DefaultRunTimes = utils.DefaultRuntimes(op)
- utils.FileExtensionRuntimeKindMap = utils.FileExtensionRuntimes(op)
+ runtimes.SupportedRunTimes = runtimes.ConvertToMap(op)
+ runtimes.DefaultRunTimes = runtimes.DefaultRuntimes(op)
+ runtimes.FileExtensionRuntimeKindMap = runtimes.FileExtensionRuntimes(op)
}
//invoke ConstructDeploymentPlan to create the in memory objects for deployment
diff --git a/utils/misc.go b/utils/misc.go
index 5280f7bf..177fe105 100644
--- a/utils/misc.go
+++ b/utils/misc.go
@@ -36,6 +36,7 @@ import (
const (
DEFAULT_HTTP_TIMEOUT = 30
DEFAULT_PROJECT_PATH = "."
+ HTTP_FILE_EXTENSION = "http"
// name of manifest and deployment files
ManifestFileNameYaml = "manifest.yaml"
ManifestFileNameYml = "manifest.yml"
@@ -154,26 +155,6 @@ func (zw *ZipWritter) Zip() error {
return nil
}
-func deleteKey(key string, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
- for i := 0; i < len(keyValueArr); i++ {
- if keyValueArr[i].Key == key {
- keyValueArr = append(keyValueArr[:i], keyValueArr[i+1:]...)
- break
- }
- }
-
- return keyValueArr
-}
-
-func addKeyValue(key string, value interface{}, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
- keyValue := whisk.KeyValue{
- Key: key,
- Value: value,
- }
-
- return append(keyValueArr, keyValue)
-}
-
func GetManifestFilePath(projectPath string) string {
if _, err := os.Stat(path.Join(projectPath, ManifestFileNameYaml)); err == nil {
return path.Join(projectPath, ManifestFileNameYaml)
diff --git a/utils/misc_test.go b/utils/misc_test.go
index d4841e23..72d518b0 100644
--- a/utils/misc_test.go
+++ b/utils/misc_test.go
@@ -20,6 +20,7 @@
package utils
import (
+ "github.com/apache/incubator-openwhisk-wskdeploy/dependencies"
"github.com/stretchr/testify/assert"
"os"
"testing"
@@ -44,31 +45,19 @@ func TestURLReader_ReadUrl(t *testing.T) {
}
func TestDependencies(t *testing.T) {
- var record = NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo", "master", nil, nil, false)
+ var record = dependencies.NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo", "master", nil, nil, false)
assert.Equal(t, "projectPath", record.ProjectPath, "ProjectPath is wrong")
assert.Equal(t, "http://github.com/user/repo", record.Location, "URL is wrong")
assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
assert.Equal(t, "", record.SubFolder, "SubFolder is wrong")
- record = NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo/subfolder1/subfolder2", "master", nil, nil, false)
+ record = dependencies.NewDependencyRecord("projectPath", "packageName", "http://github.com/user/repo/subfolder1/subfolder2", "master", nil, nil, false)
assert.Equal(t, "projectPath", record.ProjectPath, "ProjectPath is wrong")
assert.Equal(t, "http://github.com/user/repo/subfolder1/subfolder2", record.Location, "URL is wrong")
assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
assert.Equal(t, "/subfolder1/subfolder2", record.SubFolder, "SubFolder is wrong")
}
-func TestParseOpenWhisk(t *testing.T) {
- openwhiskHost := "https://openwhisk.ng.bluemix.net"
- openwhisk, err := ParseOpenWhisk(openwhiskHost)
- assert.Equal(t, nil, err, "parse openwhisk info error happened.")
- converted := ConvertToMap(openwhisk)
- assert.Equal(t, 2, len(converted["nodejs"]), "not expected length")
- assert.Equal(t, 1, len(converted["php"]), "not expected length")
- assert.Equal(t, 1, len(converted["java"]), "not expected length")
- assert.Equal(t, 3, len(converted["python"]), "not expected length")
- assert.Equal(t, 1, len(converted["swift"]), "not expected length")
-}
-
func TestNewZipWritter(t *testing.T) {
filePath := "../tests/src/integration/zipaction/actions/cat"
zipName := filePath + ".zip"
diff --git a/utils/webaction.go b/webaction/webaction.go
similarity index 89%
rename from utils/webaction.go
rename to webaction/webaction.go
index 64fe346c..b339eaeb 100644
--- a/utils/webaction.go
+++ b/webaction/webaction.go
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package utils
+package webaction
import (
"github.com/apache/incubator-openwhisk-client-go/whisk"
@@ -39,6 +39,26 @@ var webExport map[string]string = map[string]string{
"RAW": "raw",
}
+func deleteKey(key string, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
+ for i := 0; i < len(keyValueArr); i++ {
+ if keyValueArr[i].Key == key {
+ keyValueArr = append(keyValueArr[:i], keyValueArr[i+1:]...)
+ break
+ }
+ }
+
+ return keyValueArr
+}
+
+func addKeyValue(key string, value interface{}, keyValueArr whisk.KeyValueArr) whisk.KeyValueArr {
+ keyValue := whisk.KeyValue{
+ Key: key,
+ Value: value,
+ }
+
+ return append(keyValueArr, keyValue)
+}
+
func WebAction(filePath string, action string, webMode string, annotations whisk.KeyValueArr, fetch bool) (whisk.KeyValueArr, error) {
switch strings.ToLower(webMode) {
case webExport["TRUE"]:
diff --git a/wskderrors/wskdeployerror.go b/wskderrors/wskdeployerror.go
index baa39560..978d1d37 100644
--- a/wskderrors/wskdeployerror.go
+++ b/wskderrors/wskdeployerror.go
@@ -64,6 +64,7 @@ const (
ERROR_YAML_INVALID_RUNTIME = "ERROR_YAML_INVALID_RUNTIME"
ERROR_YAML_INVALID_WEB_EXPORT = "ERROR_YAML_INVALID_WEB_EXPORT"
ERROR_YAML_INVALID_API_GATEWAY_METHOD = "ERROR_YAML_INVALID_API_GATEWAY_METHOD"
+ ERROR_RUNTIME_PARSER_FAILURE = "ERROR_RUNTIME_PARSER_FAILURE"
)
/*
@@ -436,6 +437,21 @@ func NewInvalidAPIGatewayMethodError(fpath string, api string, method string, su
return err
}
+/*
+ * Failed to Retrieve/Parse Runtime
+ */
+type RuntimeParserError struct {
+ WskDeployBaseErr
+}
+
+func NewRuntimeParserError(errorMsg string) *RuntimeParserError {
+ var err = &RuntimeParserError{}
+ err.SetErrorType(ERROR_RUNTIME_PARSER_FAILURE)
+ err.SetCallerByStackFrameSkip(2)
+ err.SetMessage(errorMsg)
+ return err
+}
+
func IsCustomError(err error) bool {
switch err.(type) {
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index 4d519089..dc978720 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -199,6 +199,7 @@ const (
ID_ERR_ARG_MISSING_KEY_VALUE_X_arg_X = "msg_err_arg_missing_key_value"
ID_ERR_INVALID_PARAM_FILE_X_file_X = "msg_err_invalid_param_file"
ID_ERR_REQUIRED_INPUTS_MISSING_VALUE_X_inputs_X = "msg_err_required_inputs_missing_value"
+ ID_ERR_RUNTIME_PARSER_ERROR = "msg_err_runtime_parser_error"
// Server-side Errors (wskdeploy as an Action)
ID_ERR_JSON_MISSING_KEY_CMD = "msg_err_json_missing_cmd_key"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index 34596187..eb033ff0 100755
--- 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\x5f\x6f\x1b\x39\x92\x7f\xcf\xa7\x28\x0c\x0e\x98\x19\x40\x91\x33\x7b\x38\xe0\x10\x20\x0f\xb9\xc4\xd9\xf5\x6d\x12\x07\x76\xbc\xc1\x22\x67\xb4\xa9\xee\x92\xc4\x55\x37\xd9\x43\xb2\xa5\x68\x0c\x7d\xf7\x43\x15\xc9\xee\x96\xac\xfe\x23\x25\x73\x97\x97\x48\x26\x59\xf5\xab\x62\xb1\x58\x7f\xa8\xaf\xcf\x00\x1e\x9f\x01\x00\xfc\x24\xb3\x9f\x5e\xc2\x4f\x85\x5d\x24\xa5\xc1\xb9\xfc\x96\xa0\x31\xda\xfc\x34\xf1\xa3\xce\x08\x65\x73\xe1\xa4\x56\x34\xed\x92\xc7\x9e\x01\xec\x26\x3d\x14\xa4\x9a\xeb\x0e\x02\x57\x34\x34\xb4\xde\x56\x69\x8a\xd6\x76\x90\xb8\x0d\xa3\x43\x54\x36\xc2\x28\xa9\x16\x1d\x54\xbe\x84\xd1\x4e\x2a\x69\x91\x25\x19\xda\x34\xc9\xb5\x5a\x24\x06\x4b\x6d\x5c\x07\xad\x1b\x1e\xb4\xa0\x15\x64\x58\xe6\x7a\x8b\x19\xa0\x72\xd2\x49\xb4\xf0\x8b\x9c\xe2\x74\x02\x9f\x44\xba\x12\x0b\xb4\x13\x78\x9d\xd2\x3a\x3b\x81\xcf\x46\x2e\x16\x68\xec\x04\x6e\xaa\x9c\x46\xd0\xa5\xd3\x5f\x41\x58\xd8\x60\x9e\xd3\xff\x06\x53\x54\x8e\x57\xac\x99\x9b\x05\xa9\xc0\x2d\x11\x6c\x89\xa9\x9c\x4b\xcc\x40\x89\x02\x6d\x29\x52\x9c\x8e\x96\x45\xeb\x2e\x49\x5e\x83\xd3\x3a\x07\xa7\x83\x20\x13\xa8\x94\xff\x04\x42\x65\x60\xb7\x2a\x05\x5d\xa2\xda\x2c\xa5\x5d\x41\x19\x64\x82\xca\x4a\xb5\x00\x01\x85\x50\x72\x8e\xd6\xf1\x64\x5d\x12\x55\x91\x07\x52\x05\x49\x32\x97\x79\x3d\xfd\x9f\xaf\x3f\xbc\x1f\x83\xd9\x2e\xb5\x71\xfd\x1b\xf0\xc9\xe8\xb5\xcc\xd0\x82\x00\x5b\x15\x85\x30\x5b\xf0\xf3\x41\xcf\x61\xb3\x14\xee\x67\x0b\x33\xc4\xd6\xf6\x7c\x9f\x1a\x03\xa4\x41\x3d\x5a\x74\xa4\xcb\x25\xe6\x65\x60\x0d\x5b\x5d\x99\x51\x2a\x24\x55\x8d\xc7\xb2\x46\x63\x89\x77\x97\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2a\x66\x68\x58\x3d\x76\xe5\xa1\x8d\xe6\x45\x56\x30\x68\x3f\x6c\x2a\x2c\xec\x75\x89\xea\xcb\xbe\xb0\x33\x74\x1b\xda\x8e\x34\x97\x64\x15\x6c\x5a\x68\xd6\x68\x46\xdb\xf0\x78\x0c\x2d\xeb\x23\x3e\xd1\x9e\xf9\x0f\x7a\xfe\x7f\x69\xcd\xf3\x5c\x2c\x12\x51\xca\x64\xa9\x6d\x97\xe1\x78\x28\xaf\x3f\x5d\xc1\xc3\xdf\xae\x6f\x3f\x3f\x8c\xa4\xd8\xbf\xfd\x2d\xa2\xff\xb8\xbc\xb9\xbd\xba\xfe\x38\x8a\x6e\xe5\x96\xc9\x0a\xb7\x1d\x44\x69\x58\x1b\xf9\x07\xff\x01\x1e\xfe\x7e\xf9\xcf\x31\x44\x53\x34\x2e\x21\xbd\x75\x50\x2d\x85\x5b\xd2\xb6\x90\xad\x4e\x69\x32\x2b\x79\x0c\x61\xad\xe6\xb2\xcb\xd9\xfb\x41\x26\x05\xbf\x64\x38\x17\x55\xee\x40\x5a\xf8\xb7\xbf\x5d\x7f\xb8\xbc\x98\x6e\xec\xaa\x34\xba\xb4\xbf\x8e\xd1\x4a\x9e\xeb\x4d\x12\x68\x74\x5d\x51\x3c\x09\xea\x49\xc3\x54\x1b\xa3\xea\xd3\x4b\xed\x96\x6b\xeb\x1b\x41\xba\x34\xb8\x96\xb8\xe9\xa0\x6b\x97\x0c\x34\x12\xbd\xd8\x3b\x1e\x65\x2e\xd4\x08\x0e\x2b\xdc\x8e\xde\xd2\x15\x6e\xc7\x02\xf7\x9a\x2e\x84\x12\x0b\xcc\x7a\x15\x5d\x1a\xfd\x2f\x4c\x5d\x73\xe7\x3a\x0d\x33\x84\x42\x98\x15\x66\x10\x29\x8c\x51\x15\xd3\x49\xe8\x2e\xe8\x12\x26\xb0\xe2\x29\xc3\x14\xa3\x0b\x19\xd8\xd5\x3d\xa7\x3f\x82\x6c\x7d\x59\x75\xd0\x6d\xc6\x47\x0b\x3d\x80\xd0\xbb\xe7\x1c\xad\x8d\xda\x1e\x41\xda\x3a\x23\x3b\x29\xfb\xad\xab\x2c\x1a\x3a\x28\x52\x61\x06\xa6\x52\x4e\x16\xf5\x25\x35\x82\x83\x33\xdd\x4a\xe0\x31\xd0\x95\x2b\xab\x31\x60\xbd\xb9\xad\xd1\xcc\xb4\xed\x22\x19\x46\x4f\x25\x5a\x0a\x23\x8a\x4e\x05\x1b\x51\xa0\x43\x03\x6b\x91\x57\xc8\x01\x1e\x39\x53\xf8\xc7\xeb\xf7\x77\x97\x0f\x30\xd7\xa6\x10\x27\xb2\xea\x3b\x8d\x0f\xef\xae\xde\x5f\x3e\x40\xaa\x95\x13\x92\x22\x60\x38\x86\xe0\xbf\x6f\xaf\x3f\x0e\xb3\x66\xaf\x9a\x14\xd2\xd2\x0d\xc8\xf7\x45\xf7\x75\xf1\x79\x89\x40\x33\xe8\x8c\xa6\xfe\xce\x20\x5f\x20\x2d\x28\xed\xc0\x93\xaa\x0c\x66\xd3\xff\xe9\xdb\xf7\x03\x8e\xa5\xec\xb9\x4a\x89\x23\xdd\x79\x34\xe5\xfb\xf8\x0c\x1d\x37\xe2\x54\xcf\x39\x8f\x55\x10\xa5\x2f\x75\x3a\x94\xe7\xeb\xe3\xe3\x94\x3e\xef\x76\xf7\x13\x98\x1b\x5d\xc0\xe3\xe3\xd4\xea\xca\xa4\xb8\xdb\x8d\xe2\xe9\x37\x6c\x88\x27\x4d\x8b\x7b\x65\xd1\x9d\xc7\xab\x56\xcf\x10\xb7\x3d\x3d\x92\x88\xf5\x1f\xce\x97\xb3\x94\x8b\x4d\x22\x38\x6b\x4c\x9c\x5e\xa1\x1a\x14\x99\x56\x80\x5f\x01\xbc\xe2\x3c\xe1\x2b\x55\x08\x63\x97\x22\x4f\x72\x9d\x8a\xbc\x83\xe3\x5d\x9c\xd5\x0a\x95\x83\x2b\xb4\x9e\x1f\xaf\x0e\xc7\x73\x24\x43\x85\x6e\xa3\xcd\xea\x6c\x96\x52\x39\x34\x0a\x1d\x08\x47\xe2\x56\x26\x1f\x90\xb5\x89\x1b\x92\x54\xa8\x14\xf3\xbc\xf3\xd6\xbe\xfe\xfb\x14\xde\xf8\x39\xe4\x80\x9a\x95\x63\x19\xcc\x85\xec\xa6\xfe\xb6\x09\x60\x32\x99\x85\xb3\x58\x94\x39\x3a\x04\x5b\xd1\x96\xce\xab\x3c\xdf\x4e\xe1\xa6\x52\xf0\x50\xa7\x3f\x75\x66\xf0\x40\xf7\x9d\xc1\x42\xaf\x91\x7c\xa3\x93\x22\xcf\xb7\x4d\xe6\x28\xac\x45\xd7\xbf\x0b\x2d\xa4\x3e\x0d\x4d\xac\x13\xae\xea\x8a\x16\x9f\x3f\x7f\xfe\xfc\xd5\xab\x57\xaf\x5a\x7b\xd1\x92\xe1\x96\x97\x02\x4d\xa0\x89\xa3\xb8\x72\x01\x05\xb3\x31\x2a\x8a\xaa\xc9\x20\x54\x5d\xbc\x72\xfa\x8d\xec\xfc\xbd\x6e\xaf\x1d\xcf\xa4\x77\xbf\xef\xda\x21\x6b\xef\x8e\x8f\xe6\x37\xa4\xbf\x3d\x96\x67\x68\x30\xd5\x45\x21\x54\x96\x70\xea\xc8\xb7\x35\x79\xb9\x44\xb8\x84\xe2\xad\x0e\xa6\x8f\x8f\xd3\xb4\xc8\x76\xbb\x90\x70\x3e\x3e\x4e\x69\xa1\xdb\x96\xb8\xdb\xb1\xa7\xa4\xb5\xbb\xdd\xfd\x74\xda\xcb\x9b\x83\xe4\x6d\x12\xed\x79\xa0\xd8\xf6\xf8\x48\x21\x7b\x60\x40\x20\x77\xbb\x7b\x58\x8a\x50\x4e\x69\x0b\x5c\x9f\x90\xf1\xdc\xbb\xab\x73\x6f\xe3\x38\x1c\x05\x30\x9d\xf6\xa4\xda\x81\x45\xdc\xd0\x1f\x29\x62\x43\x73\x8c\x90\x71\x76\xb7\x98\x77\xcd\x8c\xa3\x82\xf6\xca\x99\x61\x89\x2a\x43\x95\x9e\xa2\xce\x66\xd1\xf9\x7c\x9a\x23\xd2\xa9\xd3\xb7\x47\xd9\x7c\x8f\xe1\x1c\x47\x41\x8e\xa1\x32\x5d\x71\xd9\xdb\xbd\x4a\xcf\x71\xd1\xff\x1f\xef\x88\x28\xcf\x69\x76\xf2\x7d\x3b\xf8\xd4\xcd\xfd\x98\x3d\x1c\x79\x32\xba\x90\xf4\xef\xe3\xdd\x41\xcd\xee\x9c\x9d\xec\x43\x15\x2a\x04\xe7\xde\x39\x8c\xc8\xdf\x00\x75\x05\xa2\x0f\x0b\x64\x95\xa1\x9d\x0c\x6c\xdb\xf1\xcf\x9f\x67\x6f\x51\xc6\xb9\xae\x54\x96\x04\xbc\xc1\x53\x75\x1a\x40\x8e\xae\xd3\x07\x6f\x96\x32\x5d\xc2\x86\xbb\x14\x84\x2b\xf3\x71\xa3\x5b\x22\xa4\x95\x31\xa4\x98\x28\x60\x2c\x9a\xf0\x25\xe5\x3f\x13\x05\x61\x59\x16\xd2\xdf\xe8\xb0\x20\xd4\xd4\x92\x50\xac\xed\xaa\x77\xfb\x51\x4e\x26\xa0\x55\xef\x33\xc8\x75\x8c\x6c\x02\x22\x6f\x87\xbe\xf5\xb6\x11\x0e\x53\xaf\x08\x4c\x40\x18\xac\x75\x7d\xd1\x58\x3a\x64\xd2\x60\xea\x82\xf5\x1b\x5f\xed\x1e\xea\x23\x5c\xde\xdc\x5c\xdf\xdc\x76\xe0\x7e\x75\xf8\x0f\xfc\x74\x78\x32\xf0\xea\x55\xcf\xf5\x63\xcc\xfe\x41\x5b\x29\xbd\x51\x09\x45\x0a\xc3\x47\x9d\x66\x91\xaa\xc2\xaa\x29\x34\x0d\x02\xd0\x2a\xdf\x82\xad\x4a\xdf\xed\xba\xe0\xb2\xf2\xd4\x6e\xad\xc3\x02\x66\x52\x65\x52\x2d\x2c\x68\x03\x0b\xe9\x96\xd5\x6c\x9a\xea\xa2\x2e\xaa\xf7\xdf\x97\xc6\xc4\x3b\x33\x35\x28\x5c\x17\x4c\xee\x3e\x02\x4f\xd9\x33\xcb\x8d\x74\x4b\xe0\xb6\x25\x14\x68\xad\x58\xe0\x4b\x1a\x44\x63\x76\x3b\x2e\xde\xfb\xb1\x54\x67\x7e\x80\x3e\x0c\x64\x33\x2d\x48\xfe\xac\xf4\x42\xca\x9e\x9c\x94\x3f\x09\xd2\x1c\x31\x4b\xa4\x5a\xeb\x55\x17\xa0\x77\xec\xb6\xc8\x5d\xf8\x69\x7c\x20\x69\x19\x6c\x96\xdc\x00\x0b\x48\x9d\x6f\x3e\x86\xa1\x3f\x07\xed\x0a\xb7\x75\x0d\x85\xe2\x5d\xe1\xb4\xe9\xab\x0f\xd5\x73\xb8\xdc\xf0\x35\x2a\xf3\x9e\xec\x31\xd0\x19\xe4\x19\x4b\xa9\x89\xd2\xce\x3b\xbb\x0e\x86\x1f\xda\x35\x57\xf6\xd5\x3c\x9b\xf2\x5d\x2e\x7a\xb6\x23\xea\x21\xa6\x1c\xbd\x17\xd2\x16\xc2\xa5\x5d\xe1\x3b\x09\x58\x9b\x07\x2d\xc8\x98\x45\x16\xfd\xa9\x54\x87\xc5\x7d\x3f\x1e\x30\x40\xa6\xd1\x17\x96\x98\x09\x6f\x2b\xbb\x37\x9a\x54\xb4\x88\xec\xd5\x92\xfd\x68\x14\xa3\x5f\x88\x90\xff\x93\x79\x89\x5c\x76\xa9\xed\xca\x8f\xd2\x31\x0f\x5b\x52\x97\x6d\x89\x57\xf8\x4c\x58\x9a\xde\xea\x1e\x2a\x6d\x18\xbb\xe0\x2e\x38\xaf\xf1\x1f\xc7\xe8\x39\x42\x1c\x50\xf5\xcd\x29\x80\x0e\xf4\xca\x47\xc1\x23\xfa\xd9\x82\xaf\xf2\x78\x55\xe2\x37\x87\xca\x46\xd0\xf8\x8d\xef\x30\x12\xe7\x7b\x44\xb1\xc9\x02\xbb\x0a\x98\xcd\x51\x5e\xa0\xef\xde\x06\xdf\xdb\x94\xca\x43\xb1\xa6\xb9\xc9\xe8\x7e\x93\x69\xeb\xf8\x8e\xd6\xa9\x87\x9e\x78\x89\xf9\xf4\xd4\xdc\x3a\xf0\xed\x09\xcc\x71\x21\xa9\xb1\xd1\xb2\x50\xdb\xda\x36\xc8\x89\xb4\xb6\x7d\x50\xaf\xa1\x88\x5a\x43\x18\x14\xa3\x32\xf9\xe9\x96\xeb\x0b\x5b\x21\x85\xbe\xbb\x79\xcf\x08\xb8\xd4\xc5\x47\xe9\xeb\x5e\x8e\x7d\xef\x5b\xf2\x63\x80\x14\x22\x9f\x6b\x53\x74\x6a\xee\x43\x1c\xef\x43\x30\x85\xcf\x66\x0b\x62\x21\xa4\x1a\x4a\xe9\x8d\x49\xfe\x65\xb5\xaa\x9d\x6d\x5a\x64\x3d\x9d\x5b\x2e\xee\x4b\x55\x56\x0e\x32\xe1\x04\x7c\x08\xda\xf8\x39\x2d\xb2\x9f\xc9\xf5\xf6\x73\x12\xa5\x6c\x2a\xf0\xde\x68\xb4\x49\x2c\xfe\x5e\xa1\xea\x2c\x91\xfb\x47\x2f\x17\xb7\x61\xd6\xfe\x61\x69\xf9\x77\x6f\xcf\x7b\x3e\x6c\xc2\x55\x6f\x5e\x50\x4a\x9a\x9d\x0a\xe5\x43\x91\x19\xfa\x60\x00\x33\x98\x09\x8b\x19\x68\xd5\x32\xb2\x8b\x08\xe9\x08\xcd\x29\x7c\xca\x51\x58\x84\xaa\xcc\x84\xc3\x03\xa7\xc9\x97\x67\x9a\x57\xd9\x21\x4e\x61\x41\xc0\x06\x67\x87\x1c\x06\x77\x27\xe8\xa9\xdf\x40\x5f\x1f\xf1\x23\xa4\x9a\xb0\x6a\x0a\x57\xce\x67\x5f\xda\x2d\xf9\x2e\xe6\x53\x35\xaf\x54\x38\x53\xf1\xe0\x4d\xbc\x76\xb4\xc2\xd0\x76\x2d\x88\x0a\x7e\x2b\x31\x1d\x73\x92\x02\xd6\xb8\xc5\xd1\x3f\x90\x63\x4c\x88\xeb\x77\xa2\x67\xe0\x8d\x93\x20\xb2\xba\x72\x6d\x67\x31\x85\x2f\x8d\x13\x8e\xae\x82\x96\x4d\x6a\x77\x42\x06\x13\x83\x85\x81\x6b\x2d\x88\x13\xd5\x94\x50\xb6\xe2\x30\xc9\xa4\x19\xe5\xe4\x8e\x8a\x45\x72\xd4\x7a\x2f\xb5\x54\x3e\xa4\xf2\x29\x9a\xc3\x90\x18\x50\x20\xd3\x1c\xe7\x09\xa5\x80\x51\x2a\xcb\x39\xc5\xbe\x87\xeb\x17\x23\x15\x94\xb0\x8b\x35\x26\x99\x4e\x57\xd8\xf5\x40\xef\x8d\x50\x4c\x55\xac\x11\xde\xf2\x44\x90\x05\x07\xe0\x03\x81\xa5\xcc\x31\x11\xb9\x41\x91\x6d\x13\xfc\x26\x6d\xe7\xdb\x86\x77\x74\x42\xc2\x4c\xf0\x33\x07\x68\x67\x72\x3e\x47\x4a\x08\x9b\xac\x44\xa2\xf5\x06\x65\x29\x72\xca\xc5\x0c\xbb\x9a\x23\xd7\x0a\x81\xec\x30\xc7\xc3\xb4\xbf\xf9\x1a\xb7\xc4\x6d\x34\xd4\xcc\xb8\x69\xe2\x75\x4d\xb3\xe3\x37\xef\x58\x97\xd2\xc2\x4a\xaa\x8c\x0e\x48\xb0\xc5\xd0\x94\x7c\x72\xf1\x1c\x78\x0a\xf2\x2f\x2d\x20\x0c\xfd\x08\x9c\xf0\xbe\xec\x89\x5f\x61\x63\xe1\x86\x3a\xc5\x6e\x11\x14\xc4\xb4\x06\x59\x06\x8b\xa5\x30\xf4\x85\xa9\x5b\x1f\x33\x1d\x97\x6d\x9c\xf1\x87\x43\x96\x90\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xeb\xbc\x0f\xf0\x8b\xde\x37\x59\x8a\x35\x79\x2a\xb6\x25\x5f\x48\xb7\x01\x4c\xd7\x13\xd2\xf6\x35\x14\xc9\x04\x7f\x15\x4d\x3b\x3e\x4a\x20\x9f\xaf\xa2\x33\xf2\x89\x3e\x87\x62\xb4\x7f\x21\xbb\x9d\xc6\x37\x9d\xe1\x25\x9b\xa7\x67\xf9\xa2\x22\x63\x5a\xd2\x69\xe4\x05\x1c\xb1\x4b\x05\x22\xda\x74\xa4\x30\x70\xf8\xb5\x9a\xe7\x32\x25\x2f\x93\x84\xc4\x8d\x24\x34\xda\xda\x58\x09\xe9\x3a\xae\xad\xf3\x13\x53\x3e\x12\x3a\x7c\x0e\x32\x47\x59\x39\xf8\x2d\xaa\xdc\xc9\x32\xf7\x59\xa3\x3f\x3c\xf4\x29\x44\x24\x9e\x39\xbb\xaf\x78\xf7\x1e\x94\x41\x5c\xbb\x8b\x3b\x01\xe9\xfc\x89\x2a\xb5\xb5\x72\xe6\x4f\x01\x2b\x24\x0a\xe2\xb9\x36\xea\x99\x51\x5c\x52\x5b\x3a\x83\x78\x72\x08\x83\x24\xcc\xe6\x49\xd2\x73\x82\x32\x4d\x95\xe3\x19\x9a\xa4\x65\x21\xbb\xc8\xf1\x98\x0e\x1b\xfc\xd1\xdf\x1f\x04\x12\x2a\xbb\xa0\x43\x1d\x55\xb0\xbf\x25\x53\xff\x20\xf8\x47\x28\x99\x05\x3c\xa6\x61\x61\xad\x4e\x25\x93\x3e\x8e\xf8\x22\x82\x3b\x54\x3e\x0b\x7f\x96\xe6\x85\x69\xde\x54\x70\x33\xbb\xf3\x05\x67\x68\x90\x41\x2e\x15\x82\x30\x8b\x8a\x93\x62\x52\xa1\x59\xec\x76\xed\x78\x91\xe9\x4c\xa0\xf4\x10\xbd\x2f\xdf\xb2\x3e\x78\xe4\x04\x44\x2b\xdc\xfe\x30\x54\x2b\xdc\x5e\x30\x2d\x28\x85\x34\x4f\xe0\xed\x0f\xb3\x7f\xc7\x6f\xa2\x28\x29\xd8\xad\xc9\xad\x70\x3b\x4a\x86\x10\x60\x0d\x3f\xfd\xe9\x12\xe0\x97\xc8\xf2\x57\xf6\xc1\x81\x9e\x7f\x17\xe4\x2f\xae\xba\x14\x32\xf1\x05\xc9\x56\x7a\x19\x8d\x23\x8a\x26\xc0\xaf\xe6\x24\xa3\x21\x31\x54\x7b\xc0\xdf\x2b\x69\xb8\xb6\x55\x56\xce\x8e\xb2\x92\x9b\xb0\xc6\xa7\x32\xfe\xb4\xec\x59\x85\x05\x5c\xa3\x02\x31\x77\x68\x40\x94\x65\xce\xfd\x13\x7e\xd8\x50\x6a\x4f\x27\xf4\x52\x51\xad\xa7\xb0\x16\x46\x8a\x59\x8e\x8d\xc1\x5b\x74\x35\xc5\xfd\x29\xf1\x00\xfb\x2c\xaa\x79\x37\x15\x4f\xc3\xc5\x61\x29\x47\x1b\x4a\x4e\xde\xbc\xbf\xe2\xcd\x9e\xeb\x3c\xd7\x1b\x8f\x86\xb0\xb3\x3e\xfd\xc7\xdd\x2e\x68\xea\x50\x55\x5f\x5e\xdf\x7c\xbc\xfa\xf8\xd7\xf1\xa5\xe3\xb8\xe0\xb4\xe2\xf1\x46\x18\x55\xf7\xa7\x0d\xba\xce\x82\xdd\x0d\x8d\x91\x08\x5f\x63\x63\xfa\x3e\xa8\x9a\x8b\x85\x2f\x7d\x36\x4f\x36\x72\xdf\x97\x71\x04\x7e\xfc\x50\xe7\xe4\xfc\xbd\xfd\xae\xb7\x55\xaf\x83\x0c\xdd\x70\xae\xc3\x9c\xe9\xd0\x67\x58\x1a\x4c\xc9\x15\x26\x06\xcb\x5c\xa4\x9d\xc9\xc0\xe7\xa5\xe7\xa3\xf3\x2c\x54\x26\xf9\x5d\x94\x8f\xf5\xf6\x1b\xf2\x1b\x99\xe7\x60\xb5\x56\x94\xa5\x36\x1c\x6a\x57\x50\x59\x1f\x4b\x72\x4b\x05\x37\x7b\xe4\xac\x43\x31\x12\x7b\xd0\xc4\x39\x45\x55\xbb\xd4\x55\x9e\x11\x3c\x0a\xed\xe0\xce\xfa\xee\xa2\x6f\x7d\x78\xef\x44\xb3\xf9\xd3\xf0\xb3\x82\x1a\x11\xcf\x1f\xd8\x4a\xc2\xe5\x39\xd0\x69\x78\x5a\xec\xa5\xab\xcc\x67\x8d\x27\xb0\xe4\x6c\x4e\xac\x7b\x37\x6f\x88\x29\xaf\x8f\x1b\x1a\xdb\x58\xf1\x37\x13\xed\x1f\x4b\x0c\x03\xcb\x65\x21\x5d\x22\x17\x4a\x9b\x4e\x48\xd1\xa4\x43\x74\xc9\x4b\x7c\xb6\x42\x9f\x0e\x0b\xba\x94\x4c\x7b\x72\x63\xb9\xa7\x4b\xa1\x16\x48\x1e\xab\x03\xc0\xfb\x9a\x63\x5d\x41\xb6\x51\xee\x7c\xeb\x3b\x98\x35\x8d\x29\x5c\x11\x7b\xa9\x16\x63\x6c\x81\x11\xd8\x24\xd7\x8b\xc4\xca\x3f\xba\x00\xe4\x7a\x71\x2b\xff\xe0\x42\x85\x5f\xb0\x27\x71\x63\xa2\x42\xb1\xe3\xa6\xa0\x2f\xfe\x78\xe4\x05\x47\xdb\xbf\xbd\x18\x0d\xa5\xc0\x42\x9b\x6d\x1f\x1a\x3f\xe3\x5c\x40\xbf\xfd\xe5\x3f\x19\xd2\x7f\xfc\xf6\x97\xd1\x98\x9c\x2c\x50\x57\x5d\x15\xe0\x30\x7a\x16\x98\x17\x5e\x3f\xff\xfe\x82\xfe\x0d\xe3\xe1\x66\x5e\x52\x1a\x5d\xa2\x71\xb2\x33\x08\x8e\x1e\xb0\xe5\xaf\x7c\x0b\xd8\x19\x89\x75\x13\xd8\x77\x06\x1b\x62\xb1\x59\x7c\xdc\x27\x46\x97\x98\x69\x36\x38\xf2\x8c\xd2\x81\xae\x9c\x95\x19\x6f\xc4\x67\x23\xd6\xd2\xc2\xac\x92\x79\xd6\xdf\x49\x64\x51\xbc\x3b\x30\x64\xb6\xa3\x5c\x41\x6d\xfd\x7b\x0e\x41\x1d\x38\xf4\xa0\x6d\xee\x8f\x52\xb4\xee\xff\x1a\xd5\xfd\xf8\x38\x2d\xa4\x0a\xdd\x32\xfa\x22\xd2\x81\xda\x3b\x43\x8d\xc5\x35\x7f\xc8\xba\xdc\x44\xec\x67\x84\x59\x14\xdc\x1f\xb4\x36\x8e\x94\x3f\x3b\xbb\x17\x67\xb5\x2c\x18\x6d\x68\x88\x72\x8a\xdd\x5b\x23\x7a\xd2\xeb\xda\x73\x31\x07\xc5\xa3\x26\xda\xca\x31\x75\x20\x94\x76\xcb\x90\xdb\x0d\x43\x8a\x39\xdb\x60\xbb\xef\xf3\x93\x6a\x4c\x3b\x60\x08\xcf\xe1\x31\x03\xa5\xc7\xf5\xac\x99\x7b\xeb\xb9\x08\x2b\x65\x0c\x88\xa3\x8f\x29\xc2\x8d\x73\x18\x35\x6e\x42\x4f\xc5\x77\x26\x8f\xd5\x94\x46\x68\xa8\xf5\xa3\x96\x44\xaf\xd1\x18\x99\x65\xd8\x55\x19\x21\x84\xed\xdf\xb8\x34\xcf\x7d\x9a\xa5\x31\x56\x68\xbf\xe6\x18\xbb\x51\x89\xb4\x49\x59\xcd\x72\xd9\xf5\xeb\x3d\xbf\x2b\x3c\x37\x76\x06\xfc\xcf\x78\x84\x05\xbf\xf0\x49\xd6\x49\xe9\xaf\xf7\x2d\x33\x84\xb5\xf4\x09\x30\x9d\xc3\x54\xb0\xa7\xf1\xef\xb8\x31\x83\xd9\x16\x84\xda\x6a\xd5\xf3\xb3\x18\xc6\x1a\x0b\x59\x38\x4b\xf0\x1b\xbf\xdf\xed\xbf\xc6\x9f\xd6\xb1\xb8\x44\xcf\x8d\x02\x95\xd1\xff\xcf\x3d\x9d\x27\x35\x7a\x3a\x08\xa4\xca\x0d\xce\x26\xfe\x72\x0f\xdf\xc2\x82\x9e\xb4\xc9\x23\x6d\xf5\x62\x08\x6e\x6f\xd5\xab\xab\x42\x4f\x16\xd6\x6e\x6b\x8c\x6a\xb8\xf8\xc4\xa9\x59\x34\x85\x37\x5a\xad\xc9\xdd\x87\x94\xa0\x61\xe1\xf4\x1e\xf9\x61\x93\x3d\x94\x6a\xa0\xb7\xd4\x57\xcd\x6b\x64\x8b\x03\x27\x4a\x57\xb7\x78\x0e\xe5\x6b\x33\xaa\x25\x1c\x6c\x08\xbd\xbd\xfc\xaf\xbb\xbf\x8e\x4e\xe1\x78\xf6\x69\xf9\x5b\x36\x5b\x24\x16\x85\x49\x97\xa4\xbd\x78\xf8\xeb\x86\x44\xa7\x0a\xc3\x8a\xfa\xf0\xef\xb7\x30\xa2\x9f\xa4\xbb\xa3\xb9\x24\x07\xc2\x40\x82\x72\xe8\x21\x7f\xb4\x77\x3c\xd3\x33\x12\xb4\xfa\xea\xf0\x4f\xe2\x7a\x7e\xcd\xfd\xf6\xc8\xbb\x8c\xa0\x91\x97\xf0\x8e\x11\x34\x3f\x1e\xe6\xf2\x1c\x11\x3b\x15\x40\xff\x0f\xf1\x4e\xc7\xd0\x7e\x75\x17\x5f\x89\x06\x48\xcf\xee\x9f\xfd\x6f\x00\x00\x00\xff\xff\x8f\xdc\xdb\x56\x02\x42\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x6f\x1b\x39\x92\x7f\xcf\xa7\x28\x0c\x0e\x98\x19\x40\x91\x33\x7b\x38\xe0\x10\x20\x0f\xb9\xc4\xd9\xf5\x6d\x12\x07\x76\xbc\xc1\x22\x67\xb4\xa9\xee\x92\xc4\x55\x37\xd9\x43\xb2\xa5\x68\x0c\x7d\xf7\x43\x15\xc9\xee\x96\xac\xfe\x23\x25\x73\x97\x97\x48\x26\x59\xf5\xab\x62\xb1\x58\x7f\xa8\xaf\xcf\x00\x1e\x9f\x01\x00\xfc\x24\xb3\x9f\x5e\xc2\x4f\x85\x5d\x24\xa5\xc1\xb9\xfc\x96\xa0\x31\xda\xfc\x34\xf1\xa3\xce\x08\x65\x73\xe1\xa4\x56\x34\xed\x92\xc7\x9e\x01\xec\x26\x3d\x14\xa4\x9a\xeb\x0e\x02\x57\x34\x34\xb4\xde\x56\x69\x8a\xd6\x76\x90\xb8\x0d\xa3\x43\x54\x36\xc2\x28\xa9\x16\x1d\x54\xbe\x84\xd1\x4e\x2a\x69\x91\x25\x19\xda\x34\xc9\xb5\x5a\x24\x06\x4b\x6d\x5c\x07\xad\x1b\x1e\xb4\xa0\x15\x64\x58\xe6\x7a\x8b\x19\xa0\x72\xd2\x49\xb4\xf0\x8b\x9c\xe2\x74\x02\x9f\x44\xba\x12\x0b\xb4\x13\x78\x9d\xd2\x3a\x3b\x81\xcf\x46\x2e\x16\x68\xec\x04\x6e\xaa\x9c\x46\xd0\xa5\xd3\x5f\x41\x58\xd8\x60\x9e\xd3\xff\x06\x53\x54\x8e\x57\xac\x99\x9b\x05\xa9\xc0\x2d\x11\x6c\x89\xa9\x9c\x4b\xcc\x40\x89\x02\x6d\x29\x52\x9c\x8e\x96\x45\xeb\x2e\x49\x5e\x83\xd3\x3a\x07\xa7\x83\x20\x13\xa8\x94\xff\x04\x42\x65\x60\xb7\x2a\x05\x5d\xa2\xda\x2c\xa5\x5d\x41\x19\x64\x82\xca\x4a\xb5\x00\x01\x85\x50\x72\x8e\xd6\xf1\x64\x5d\x12\x55\x91\x07\x52\x05\x49\x32\x97\x79\x3d\xfd\x9f\xaf\x3f\xbc\x1f\x83\xd9\x2e\xb5\x71\xfd\x1b\xf0\xc9\xe8\xb5\xcc\xd0\x82\x00\x5b\x15\x85\x30\x5b\xf0\xf3\x41\xcf\x61\xb3\x14\xee\x67\x0b\x33\xc4\xd6\xf6\x7c\x9f\x1a\x03\xa4\x41\x3d\x5a\x74\xa4\xcb\x25\xe6\x65\x60\x0d\x5b\x5d\x99\x51\x2a\x24\x55\x8d\xc7\xb2\x46\x63\x89\x77\x97\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2a\x66\x68\x58\x3d\x76\xe5\xa1\x8d\xe6\x45\x56\x30\x68\x3f\x6c\x2a\x2c\xec\x75\x89\xea\xcb\xbe\xb0\x33\x74\x1b\xda\x8e\x34\x97\x64\x15\x6c\x5a\x68\xd6\x68\x46\xdb\xf0\x78\x0c\x2d\xeb\x23\x3e\xd1\x9e\xf9\x0f\x7a\xfe\x7f\x69\xcd\xf3\x5c\x2c\x12\x51\xca\x64\xa9\x6d\x97\xe1\x78\x28\xaf\x3f\x5d\xc1\xc3\xdf\xae\x6f\x3f\x3f\x8c\xa4\xd8\xbf\xfd\x2d\xa2\xff\xb8\xbc\xb9\xbd\xba\xfe\x38\x8a\x6e\xe5\x96\xc9\x0a\xb7\x1d\x44\x69\x58\x1b\xf9\x07\xff\x01\x1e\xfe\x7e\xf9\xcf\x31\x44\x53\x34\x2e\x21\xbd\x75\x50\x2d\x85\x5b\xd2\xb6\x90\xad\x4e\x69\x32\x2b\x79\x0c\x61\xad\xe6\xb2\xcb\xd9\xfb\x41\x26\x05\xbf\x64\x38\x17\x55\xee\x40\x5a\xf8\xb7\xbf\x5d\x7f\xb8\xbc\x98\x6e\xec\xaa\x34\xba\xb4\xbf\x8e\xd1\x4a\x9e\xeb\x4d\x12\x68\x74\x5d\x51\x3c\x09\xea\x49\xc3\x54\x1b\xa3\xea\xd3\x4b\xed\x96\x6b\xeb\x1b\x41\xba\x34\xb8\x96\xb8\xe9\xa0\x6b\x97\x0c\x34\x12\xbd\xd8\x3b\x1e\x65\x2e\xd4\x08\x0e\x2b\xdc\x8e\xde\xd2\x15\x6e\xc7\x02\xf7\x9a\x2e\x84\x12\x0b\xcc\x7a\x15\x5d\x1a\xfd\x2f\x4c\x5d\x73\xe7\x3a\x0d\x33\x84\x42\x98\x15\x66\x10\x29\x8c\x51\x15\xd3\x49\xe8\x2e\xe8\x12\x26\xb0\xe2\x29\xc3\x14\xa3\x0b\x19\xd8\xd5\x3d\xa7\x3f\x82\x6c\x7d\x59\x75\xd0\x6d\xc6\x47\x0b\x3d\x80\xd0\xbb\xe7\x1c\xad\x8d\xda\x1e\x41\xda\x3a\x23\x3b\x29\xfb\xad\xab\x2c\x1a\x3a\x28\x52\x61\x06\xa6\x52\x4e\x16\xf5\x25\x35\x82\x83\x33\xdd\x4a\xe0\x31\xd0\x95\x2b\xab\x31\x60\xbd\xb9\xad\xd1\xcc\xb4\xed\x22\x19\x46\x4f\x25\x5a\x0a\x23\x8a\x4e\x05\x1b\x51\xa0\x43\x03\x6b\x91\x57\xc8\x01\x1e\x39\x53\xf8\xc7\xeb\xf7\x77\x97\x0f\x30\xd7\xa6\x10\x27\xb2\xea\x3b\x8d\x0f\xef\xae\xde\x5f\x3e\x40\xaa\x95\x13\x92\x22\x60\x38\x86\xe0\xbf\x6f\xaf\x3f\x0e\xb3\x66\xaf\x9a\x14\xd2\xd2\x0d\xc8\xf7\x45\xf7\x75\xf1\x79\x89\x40\x33\xe8\x8c\xa6\xfe\xce\x20\x5f\x20\x2d\x28\xed\xc0\x93\xaa\x0c\x66\xd3\xff\xe9\xdb\xf7\x03\x8e\xa5\xec\xb9\x4a\x89\x23\xdd\x79\x34\xe5\xfb\xf8\x0c\x1d\x37\xe2\x54\xcf\x39\x8f\x55\x10\xa5\x2f\x75\x3a\x94\xe7\xeb\xe3\xe3\x94\x3e\xef\x76\xf7\x13\x98\x1b\x5d\xc0\xe3\xe3\xd4\xea\xca\xa4\xb8\xdb\x8d\xe2\xe9\x37\x6c\x88\x27\x4d\x8b\x7b\x65\xd1\x9d\xc7\xab\x56\xcf\x10\xb7\x3d\x3d\x92\x88\xf5\x1f\xce\x97\xb3\x94\x8b\x4d\x22\x38\x6b\x4c\x9c\x5e\xa1\x1a\x14\x99\x56\x80\x5f\x01\xbc\xe2\x3c\xe1\x2b\x55\x08\x63\x97\x22\x4f\x72\x9d\x8a\xbc\x83\xe3\x5d\x9c\xd5\x0a\x95\x83\x2b\xb4\x9e\x1f\xaf\x0e\xc7\x73\x24\x43\x85\x6e\xa3\xcd\xea\x6c\x96\x52\x39\x34\x0a\x1d\x08\x47\xe2\x56\x26\x1f\x90\xb5\x89\x1b\x92\x54\xa8\x14\xf3\xbc\xf3\xd6\xbe\xfe\xfb\x14\xde\xf8\x39\xe4\x80\x9a\x95\x63\x19\xcc\x85\xec\xa6\xfe\xb6\x09\x60\x32\x99\x85\xb3\x58\x94\x39\x3a\x04\x5b\xd1\x96\xce\xab\x3c\xdf\x4e\xe1\xa6\x52\xf0\x50\xa7\x3f\x75\x66\xf0\x40\xf7\x9d\xc1\x42\xaf\x91\x7c\xa3\x93\x22\xcf\xb7\x4d\xe6\x28\xac\x45\xd7\xbf\x0b\x2d\xa4\x3e\x0d\x4d\xac\x13\xae\xea\x8a\x16\x9f\x3f\x7f\xfe\xfc\xd5\xab\x57\xaf\x5a\x7b\xd1\x92\xe1\x96\x97\x02\x4d\xa0\x89\xa3\xb8\x72\x01\x05\xb3\x31\x2a\x8a\xaa\xc9\x20\x54\x5d\xbc\x72\xfa\x8d\xec\xfc\xbd\x6e\xaf\x1d\xcf\xa4\x77\xbf\xef\xda\x21\x6b\xef\x8e\x8f\xe6\x37\xa4\xbf\x3d\x96\x67\x68\x30\xd5\x45\x21\x54\x96\x70\xea\xc8\xb7\x35\x79\xb9\x44\xb8\x84\xe2\xad\x0e\xa6\x8f\x8f\xd3\xb4\xc8\x76\xbb\x90\x70\x3e\x3e\x4e\x69\xa1\xdb\x96\xb8\xdb\xb1\xa7\xa4\xb5\xbb\xdd\xfd\x74\xda\xcb\x9b\x83\xe4\x6d\x12\xed\x79\xa0\xd8\xf6\xf8\x48\x21\x7b\x60\x40\x20\x77\xbb\x7b\x58\x8a\x50\x4e\x69\x0b\x5c\x9f\x90\xf1\xdc\xbb\xab\x73\x6f\xe3\x38\x1c\x05\x30\x9d\xf6\xa4\xda\x81\x45\xdc\xd0\x1f\x29\x62\x43\x73\x8c\x90\x71\x76\xb7\x98\x77\xcd\x8c\xa3\x82\xf6\xca\x99\x61\x89\x2a\x43\x95\x9e\xa2\xce\x66\xd1\xf9\x7c\x9a\x23\xd2\xa9\xd3\xb7\x47\xd9\x7c\x8f\xe1\x1c\x47\x41\x8e\xa1\x32\x5d\x71\xd9\xdb\xbd\x4a\xcf\x71\xd1\xff\x1f\xef\x88\x28\xcf\x69\x76\xf2\x7d\x3b\xf8\xd4\xcd\xfd\x98\x3d\x1c\x79\x32\xba\x90\xf4\xef\xe3\xdd\x41\xcd\xee\x9c\x9d\xec\x43\x15\x2a\x04\xe7\xde\x39\x8c\xc8\xdf\x00\x75\x05\xa2\x0f\x0b\x64\x95\xa1\x9d\x0c\x6c\xdb\xf1\xcf\x9f\x67\x6f\x51\xc6\xb9\xae\x54\x96\x04\xbc\xc1\x53\x75\x1a\x40\x8e\xae\xd3\x07\x6f\x96\x32\x5d\xc2\x86\xbb\x14\x84\x2b\xf3\x71\xa3\x5b\x22\xa4\x95\x31\xa4\x98\x28\x60\x2c\x9a\xf0\x25\xe5\x3f\x13\x05\x61\x59\x16\xd2\xdf\xe8\xb0\x20\xd4\xd4\x92\x50\xac\xed\xaa\x77\xfb\x51\x4e\x26\xa0\x55\xef\x33\xc8\x75\x8c\x6c\x02\x22\x6f\x87\xbe\xf5\xb6\x11\x0e\x53\xaf\x08\x4c\x40\x18\xac\x75\x7d\xd1\x58\x3a\x64\xd2\x60\xea\x82\xf5\x1b\x5f\xed\x1e\xea\x23\x5c\xde\xdc\x5c\xdf\xdc\x76\xe0\x7e\x75\xf8\x0f\xfc\x74\x78\x32\xf0\xea\x55\xcf\xf5\x63\xcc\xfe\x41\x5b\x29\xbd\x51\x09\x45\x0a\xc3\x47\x9d\x66\x91\xaa\xc2\xaa\x29\x34\x0d\x02\xd0\x2a\xdf\x82\xad\x4a\xdf\xed\xba\xe0\xb2\xf2\xd4\x6e\xad\xc3\x02\x66\x52\x65\x52\x2d\x2c\x68\x03\x0b\xe9\x96\xd5\x6c\x9a\xea\xa2\x2e\xaa\xf7\xdf\x97\xc6\xc4\x3b\x33\x35\x28\x5c\x17\x4c\xee\x3e\x02\x4f\xd9\x33\xcb\x8d\x74\x4b\xe0\xb6\x25\x14\x68\xad\x58\xe0\x4b\x1a\x44\x63\x76\x3b\x2e\xde\xfb\xb1\x54\x67\x7e\x80\x3e\x0c\x64\x33\x2d\x48\xfe\xac\xf4\x42\xca\x9e\x9c\x94\x3f\x09\xd2\x1c\x31\x4b\xa4\x5a\xeb\x55\x17\xa0\x77\xec\xb6\xc8\x5d\xf8\x69\x7c\x20\x69\x19\x6c\x96\xdc\x00\x0b\x48\x9d\x6f\x3e\x86\xa1\x3f\x07\xed\x0a\xb7\x75\x0d\x85\xe2\x5d\xe1\xb4\xe9\xab\x0f\xd5\x73\xb8\xdc\xf0\x35\x2a\xf3\x9e\xec\x31\xd0\x19\xe4\x19\x4b\xa9\x89\xd2\xce\x3b\xbb\x0e\x86\x1f\xda\x35\x57\xf6\xd5\x3c\x9b\xf2\x5d\x2e\x7a\xb6\x23\xea\x21\xa6\x1c\xbd\x17\xd2\x16\xc2\xa5\x5d\xe1\x3b\x09\x58\x9b\x07\x2d\xc8\x98\x45\x16\xfd\xa9\x54\x87\xc5\x7d\x3f\x1e\x30\x40\xa6\xd1\x17\x96\x98\x09\x6f\x2b\xbb\x37\x9a\x54\xb4\x88\xec\xd5\x92\xfd\x68\x14\xa3\x5f\x88\x90\xff\x93\x79\x89\x5c\x76\xa9\xed\xca\x8f\xd2\x31\x0f\x5b\x52\x97\x6d\x89\x57\xf8\x4c\x58\x9a\xde\xea\x1e\x2a\x6d\x18\xbb\xe0\x2e\x38\xaf\xf1\x1f\xc7\xe8\x39\x42\x1c\x50\xf5\xcd\x29\x80\x0e\xf4\xca\x47\xc1\x23\xfa\xd9\x82\xaf\xf2\x78\x55\xe2\x37\x87\xca\x46\xd0\xf8\x8d\xef\x30\x12\xe7\x7b\x44\xb1\xc9\x02\xbb\x0a\x98\xcd\x51\x5e\xa0\xef\xde\x06\xdf\xdb\x94\xca\x43\xb1\xa6\xb9\xc9\xe8\x7e\x93\x69\xeb\xf8\x8e\xd6\xa9\x87\x9e\x78\x89\xf9\xf4\xd4\xdc\x3a\xf0\xed\x09\xcc\x71\x21\xa9\xb1\xd1\xb2\x50\xdb\xda\x36\xc8\x89\xb4\xb6\x7d\x50\xaf\xa1\x88\x5a\x43\x18\x14\xa3\x32\xf9\xe9\x96\xeb\x0b\x5b\x21\x85\xbe\xbb\x79\xcf\x08\xb8\xd4\xc5\x47\xe9\xeb\x5e\x8e\x7d\xef\x5b\xf2\x63\x80\x14\x22\x9f\x6b\x53\x74\x6a\xee\x43\x1c\xef\x43\x30\x85\xcf\x66\x0b\x62\x21\xa4\x1a\x4a\xe9\x8d\x49\xfe\x65\xb5\xaa\x9d\x6d\x5a\x64\x3d\x9d\x5b\x2e\xee\x4b\x55\x56\x0e\x32\xe1\x04\x7c\x08\xda\xf8\x39\x2d\xb2\x9f\xc9\xf5\xf6\x73\x12\xa5\x6c\x2a\xf0\xde\x68\xb4\x49\x2c\xfe\x5e\xa1\xea\x2c\x91\xfb\x47\x2f\x17\xb7\x61\xd6\xfe\x61\x69\xf9\x77\x6f\xcf\x7b\x3e\x6c\xc2\x55\x6f\x5e\x50\x4a\x9a\x9d\x0a\xe5\x43\x91\x19\xfa\x60\x00\x33\x98\x09\x8b\x19\x68\xd5\x32\xb2\x8b\x08\xe9\x08\xcd\x29\x7c\xca\x51\x58\x84\xaa\xcc\x84\xc3\x03\xa7\xc9\x97\x67\x9a\x57\xd9\x21\x4e\x61\x41\xc0\x06\x67\x87\x1c\x06\x77\x27\xe8\xa9\xdf\x40\x5f\x1f\xf1\x23\xa4\x9a\xb0\x6a\x0a\x57\xce\x67\x5f\xda\x2d\xf9\x2e\xe6\x53\x35\xaf\x54\x38\x53\xf1\xe0\x4d\xbc\x76\xb4\xc2\xd0\x76\x2d\x88\x0a\x7e\x2b\x31\x1d\x73\x92\x02\xd6\xb8\xc5\xd1\x3f\x90\x63\x4c\x88\xeb\x77\xa2\x67\xe0\x8d\x93\x20\xb2\xba\x72\x6d\x67\x31\x85\x2f\x8d\x13\x8e\xae\x82\x96\x4d\x6a\x77\x42\x06\x13\x83\x85\x81\x6b\x2d\x88\x13\xd5\x94\x50\xb6\xe2\x30\xc9\xa4\x19\xe5\xe4\x8e\x8a\x45\x72\xd4\x7a\x2f\xb5\x54\x3e\xa4\xf2\x29\x9a\xc3\x90\x18\x50\x20\xd3\x1c\xe7\x09\xa5\x80\x51\x2a\xcb\x39\xc5\xbe\x87\xeb\x17\x23\x15\x94\xb0\x8b\x35\x26\x99\x4e\x57\xd8\xf5\x40\xef\x8d\x50\x4c\x55\xac\x11\xde\xf2\x44\x90\x05\x07\xe0\x03\x81\xa5\xcc\x31\x11\xb9\x41\x91\x6d\x13\xfc\x26\x6d\xe7\xdb\x86\x77\x74\x42\xc2\x4c\xf0\x33\x07\x68\x67\x72\x3e\x47\x4a\x08\x9b\xac\x44\xa2\xf5\x06\x65\x29\x72\xca\xc5\x0c\xbb\x9a\x23\xd7\x0a\x81\xec\x30\xc7\xc3\xb4\xbf\xf9\x1a\xb7\xc4\x6d\x34\xd4\xcc\xb8\x69\xe2\x75\x4d\xb3\xe3\x37\xef\x58\x97\xd2\xc2\x4a\xaa\x8c\x0e\x48\xb0\xc5\xd0\x94\x7c\x72\xf1\x1c\x78\x0a\xf2\x2f\x2d\x20\x0c\xfd\x08\x9c\xf0\xbe\xec\x89\x5f\x61\x63\xe1\x86\x3a\xc5\x6e\x11\x14\xc4\xb4\x06\x59\x06\x8b\xa5\x30\xf4\x85\xa9\x5b\x1f\x33\x1d\x97\x6d\x9c\xf1\x87\x43\x96\x90\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xeb\xbc\x0f\xf0\x8b\xde\x37\x59\x8a\x35\x79\x2a\xb6\x25\x5f\x48\xb7\x01\x4c\xd7\x13\xd2\xf6\x35\x14\xc9\x04\x7f\x15\x4d\x3b\x3e\x4a\x20\x9f\xaf\xa2\x33\xf2\x89\x3e\x87\x62\xb4\x7f\x21\xbb\x9d\xc6\x37\x9d\xe1\x25\x9b\xa7\x67\xf9\xa2\x22\x63\x5a\xd2\x69\xe4\x05\x1c\xb1\x4b\x05\x22\xda\x74\xa4\x30\x70\xf8\xb5\x9a\xe7\x32\x25\x2f\x93\x84\xc4\x8d\x24\x34\xda\xda\x58\x09\xe9\x3a\xae\xad\xf3\x13\x53\x3e\x12\x3a\x7c\x0e\x32\x47\x59\x39\xf8\x2d\xaa\xdc\xc9\x32\xf7\x59\xa3\x3f\x3c\xf4\x29\x44\x24\x9e\x39\xbb\xaf\x78\xf7\x1e\x94\x41\x5c\xbb\x8b\x3b\x01\xe9\xfc\x89\x2a\xb5\xb5\x72\xe6\x4f\x01\x2b\x24\x0a\xe2\xb9\x36\xea\x99\x51\x5c\x52\x5b\x3a\x83\x78\x72\x08\x83\x24\xcc\xe6\x49\xd2\x73\x82\x32\x4d\x95\xe3\x19\x9a\xa4\x65\x21\xbb\xc8\xf1\x98\x0e\x1b\xfc\xd1\xdf\x1f\x04\x12\x2a\xbb\xa0\x43\x1d\x55\xb0\xbf\x25\x53\xff\x20\xf8\x47\x28\x99\x05\x3c\xa6\x61\x61\xad\x4e\x25\x93\x3e\x8e\xf8\x22\x82\x3b\x54\x3e\x0b\x7f\x96\xe6\x85\x69\xde\x54\x70\x33\xbb\xf3\x05\x67\x68\x90\x41\x2e\x15\x82\x30\x8b\x8a\x93\x62\x52\xa1\x59\xec\x76\xed\x78\x91\xe9\x4c\xa0\xf4\x10\xbd\x2f\xdf\xb2\x3e\x78\xe4\x04\x44\x2b\xdc\xfe\x30\x54\x2b\xdc\x5e\x30\x2d\x28\x85\x34\x4f\xe0\xed\x0f\xb3\x7f\xc7\x6f\xa2\x28\x29\xd8\xad\xc9\xad\x70\x3b\x4a\x86\x10\x60\x0d\x3f\xfd\xe9\x12\xe0\x97\xc8\xf2\x57\xf6\xc1\x81\x9e\x7f\x17\xe4\x2f\xae\xba\x14\x32\xf1\x05\xc9\x56\x7a\x19\x8d\x23\x8a\x26\xc0\xaf\xe6\x24\xa3\x21\x31\x54\x7b\xc0\xdf\x2b\x69\xb8\xb6\x55\x56\xce\x8e\xb2\x92\x9b\xb0\xc6\xa7\x32\xfe\xb4\xec\x59\x85\x05\x5c\xa3\x02\x31\x77\x68\x40\x94\x65\xce\xfd\x13\x7e\xd8\x50\x6a\x4f\x27\xf4\x52\x51\xad\xa7\xb0\x16\x46\x8a\x59\x8e\x8d\xc1\x5b\x74\x35\xc5\xfd\x29\xf1\x00\xfb\x2c\xaa\x79\x37\x15\x4f\xc3\xc5\x61\x29\x47\x1b\x4a\x4e\xde\xbc\xbf\xe2\xcd\x9e\xeb\x3c\xd7\x1b\x8f\x86\xb0\xb3\x3e\xfd\xc7\xdd\x6e\x5c\xba\x5e\x0a\x63\xd1\xf4\xfe\x58\xa3\xa9\x1f\x18\x74\x46\x22\xbb\x83\x50\x36\xa8\xf7\x2f\x70\x3b\x64\xf7\xe5\xf5\xcd\xc7\xab\x8f\x7f\x1d\x5f\xa8\x8e\x0b\x4e\x2b\x55\x6f\x84\x51\x75\x37\x9c\x50\x76\xe5\xac\x37\x34\x46\x0a\xfb\x1a\xdb\xe0\xf7\x61\x63\x59\x03\x2f\x7d\xed\x80\x24\xba\xef\xcb\x6f\x02\x3f\x7e\x16\x74\x72\xb5\xa0\xfd\x8a\xb8\x55\x1d\x84\x0c\xdd\x70\x66\xc5\x9c\xc9\xc5\x64\x58\x1a\x4c\xc9\xf1\x26\x06\xcb\x5c\xa4\x9d\xa9\xc7\xe7\xa5\xe7\xa3\xf3\x2c\xd4\x41\xf9\x15\x96\x8f\x2c\xf7\xdb\xff\x1b\x99\xe7\x60\xb5\x56\x94\x13\x37\x1c\x6a\xc7\x53\x59\x1f\xb9\x72\x03\x07\x37\x7b\xe4\xac\x43\x31\x12\x7b\xd0\xc4\x39\x25\x5c\xbb\xd4\x55\x9e\x11\x3c\x0a\x24\xe1\xce\xfa\x5e\xa6\x6f\xb4\x78\x5f\x48\xb3\xf9\xd3\xf0\x23\x86\x1a\x11\xcf\x1f\xd8\x4a\xc2\xe5\x39\xd0\xd9\x7b\x5a\x5a\xa6\x8b\xd3\xe7\xa8\x27\xb0\xe4\xdc\x51\xac\x7b\x37\x6f\x88\x29\xaf\x8f\x1b\x1a\x9b\x66\xf1\x17\x1a\xed\x9f\x66\x0c\x03\xcb\x65\x21\x5d\x22\x17\x4a\x9b\x4e\x48\xd1\xa4\x43\x2c\xcb\x4b\x7c\x6e\x44\x9f\x0e\xcb\xc7\x94\xba\x7b\x72\x63\xb9\xa7\x4b\xa1\x16\x48\xfe\xb1\x03\xc0\xfb\x9a\x63\x5d\xaf\xb6\x51\xee\x7c\xeb\xfb\xa5\x35\x8d\x29\x5c\x11\x7b\xa9\x16\x63\x6c\x81\x11\xd8\x24\xd7\x8b\xc4\xca\x3f\xba\x00\xe4\x7a\x71\x2b\xff\xe0\xb2\x88\x5f\xb0\x27\x71\x63\xa2\x42\xf1\x35\x41\x21\x66\xfc\xa9\xca\x0b\x8e\xed\x7f\x7b\x31\x1a\x4a\x81\x85\x36\xdb\x3e\x34\x7e\xc6\xb9\x80\x7e\xfb\xcb\x7f\x32\xa4\xff\xf8\xed\x2f\xa3\x31\x91\xef\xd7\x55\x57\xbd\x39\x8c\x9e\x05\xe6\x85\xd7\xcf\xbf\xbf\xa0\x7f\xc3\x78\xb8\x75\x98\x94\x46\x97\x68\x9c\xec\x0c\xb9\xa3\x07\x6c\xf9\x2b\xdf\x70\xf6\xd7\x59\x68\x39\xfb\x3e\x64\x43\x2c\xb6\xa6\x8f\xfb\xc4\xe8\x12\x33\xcd\x06\x47\x9e\x51\x3a\xd0\x95\xb3\x32\xe3\x8d\xf8\x6c\xc4\x5a\x5a\x98\x55\x32\xcf\xfa\xfb\x96\x2c\x8a\x77\x07\x86\xcc\x76\x94\x2b\xa8\xad\x7f\xcf\x21\xa8\x03\x87\x1e\xb4\xcd\xdd\x58\xca\x0d\xfc\x5f\xa3\xba\x1f\x1f\xa7\x85\x54\xa1\x37\x47\x5f\x44\x3a\x50\xe9\x67\xa8\x31\x76\xf0\x87\xac\xcb\x4d\xc4\xee\x49\x98\x45\xf1\xc3\x41\x23\xe5\x48\xb1\xb5\xb3\x57\x72\x56\x83\x84\xd1\x86\xf6\x2b\x27\xf4\xbd\x15\xa9\x27\x9d\xb5\x3d\x17\x73\x50\xaa\x6a\x62\xbb\x1c\x53\x07\x42\x69\xb7\x0c\x99\xe4\x30\xa4\x98\x21\x0e\x36\x17\x3f\x3f\xa9\xfd\xb4\x03\x86\xf0\xf8\x1e\x33\x50\x7a\x5c\x87\x9c\xb9\xb7\x1e\xa7\xb0\x52\xc6\x80\x38\xfa\x74\x23\xdc\x38\x87\x31\xea\x26\x74\x70\x7c\x1f\xf4\x58\x05\x6b\x84\x86\x5a\x3f\xa1\x49\xf4\x1a\x8d\x91\x59\x86\x5d\x75\x18\x42\xd8\xfe\x45\x4d\xf3\xb8\xa8\x59\x1a\x63\x85\xf6\xdb\x91\xb1\x1b\x95\x48\x9b\x94\xd5\x2c\x97\x5d\xbf\x15\xf4\xbb\xc2\x73\x63\x1f\xc2\xff\x68\x48\x58\xf0\x0b\x9f\xe4\xb8\x94\x6c\x7b\xdf\x32\x43\x58\x4b\x9f\x6e\xd3\x39\x4c\x05\x7b\x1a\xff\x6a\x1c\x33\x98\x6d\x41\xa8\xad\x56\x3d\x3f\xc2\x61\xac\xb1\x6c\x86\xb3\x04\xbf\xf1\x6b\xe1\xfe\x6b\xfc\x69\xd5\x8c\x1b\x02\xdc\x96\x50\x19\xfd\xff\xdc\xd3\x79\xd2\x11\xa0\x83\x40\xaa\xdc\xe0\x6c\xe2\x2f\xf7\xf0\x2d\x2c\xe8\x49\xd2\x3c\xd2\x56\xe7\x87\xe0\xf6\xd6\xd8\xba\xfa\x01\x64\x61\xed\x26\xca\xa8\xf6\x8e\x4f\xd3\x9a\x45\x53\x78\xa3\xd5\x9a\xdc\x7d\x48\x09\x1a\x16\x4e\xef\x91\x1f\x36\xd9\x43\xa9\x06\x3a\x59\x7d\xb5\xc3\x46\xb6\x38\x70\xa2\x74\x75\x43\xe9\x50\xbe\x36\xa3\x5a\xc2\xc1\xf6\xd3\xdb\xcb\xff\xba\xfb\xeb\xe8\x14\x8e\x67\x9f\x96\xbf\x65\xb3\x45\x62\x51\x98\x74\x49\xda\x8b\x87\xbf\x6e\x7f\x74\xaa\x30\xac\xa8\x0f\xff\x7e\xc3\x24\xfa\x49\xba\x3b\x9a\x4b\x72\x20\x0c\x24\x28\x87\x1e\xf2\x47\x7b\xc7\x33\x3d\x23\x41\xab\xaf\x0e\xff\x00\xaf\xe7\xb7\xe3\x6f\x8f\xbc\x02\x09\x1a\x79\x09\xef\x18\x41\xf3\x53\x65\x2e\x06\x12\xb1\x53\x01\xf4\xff\xec\xef\x74\x0c\xed\x37\x7e\xf1\x4d\x6a\x80\xf4\xec\xfe\xd9\xff\x06\x00\x00\xff\xff\x64\x87\x26\x11\x70\x42\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: 16898, mode: os.FileMode(420), modTime: time.Unix(1525997024, 0)}
+ info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 17008, mode: os.FileMode(420), modTime: time.Unix(1528157319, 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 ea6505ee..614d434d 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -363,6 +363,10 @@
"id": "msg_err_required_inputs_missing_value",
"translation": "Required inputs are missing values even after applying interpolation using env. variables. Please set missing env. variables and/or input values in manifest/deployment file or on CLI for following inputs: {{.inputs}}"
},
+ {
+ "id": "msg_err_runtime_parser_error",
+ "translation": "Failed to retrieve runtimes {{.err}}."
+ },
{
"id": "WARNINGS",
----------------------------------------------------------------
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