http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/appveyor.yml
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/appveyor.yml 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/appveyor.yml
new file mode 100644
index 0000000..3ca7afa
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/appveyor.yml
@@ -0,0 +1,16 @@
+version: "{build}"
+
+os: Windows Server 2012 R2
+
+install:
+  - go version
+  - go env
+
+build_script:
+  - cd %APPVEYOR_BUILD_FOLDER%
+  - go vet ./...
+  - go test -v ./...
+
+test: off
+
+deploy: off

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete
 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete
new file mode 100644
index 0000000..21a232f
--- /dev/null
+++ 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/bash_autocomplete
@@ -0,0 +1,14 @@
+#! /bin/bash
+
+: ${PROG:=$(basename ${BASH_SOURCE})}
+
+_cli_bash_autocomplete() {
+     local cur opts base
+     COMPREPLY=()
+     cur="${COMP_WORDS[COMP_CWORD]}"
+     opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
+     COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+     return 0
+ }
+  
+ complete -F _cli_bash_autocomplete $PROG

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
new file mode 100644
index 0000000..5430a18
--- /dev/null
+++ 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/autocomplete/zsh_autocomplete
@@ -0,0 +1,5 @@
+autoload -U compinit && compinit
+autoload -U bashcompinit && bashcompinit
+
+script_dir=$(dirname $0)
+source ${script_dir}/bash_autocomplete

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/cli.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/cli.go 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/cli.go
new file mode 100644
index 0000000..31dc912
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/cli.go
@@ -0,0 +1,40 @@
+// Package cli provides a minimal framework for creating and organizing 
command line
+// Go applications. cli is designed to be easy to understand and write, the 
most simple
+// cli application can be written as follows:
+//   func main() {
+//     cli.NewApp().Run(os.Args)
+//   }
+//
+// Of course this application does not do much, so let's make this an actual 
application:
+//   func main() {
+//     app := cli.NewApp()
+//     app.Name = "greet"
+//     app.Usage = "say a greeting"
+//     app.Action = func(c *cli.Context) {
+//       println("Greetings")
+//     }
+//
+//     app.Run(os.Args)
+//   }
+package cli
+
+import (
+       "strings"
+)
+
+type MultiError struct {
+       Errors []error
+}
+
+func NewMultiError(err ...error) MultiError {
+       return MultiError{Errors: err}
+}
+
+func (m MultiError) Error() string {
+       errs := make([]string, len(m.Errors))
+       for i, err := range m.Errors {
+               errs[i] = err.Error()
+       }
+
+       return strings.Join(errs, "\n")
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/command.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/command.go 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/command.go
new file mode 100644
index 0000000..0153713
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/command.go
@@ -0,0 +1,250 @@
+package cli
+
+import (
+       "fmt"
+       "io/ioutil"
+       "strings"
+)
+
+// Command is a subcommand for a cli.App.
+type Command struct {
+       // The name of the command
+       Name string
+       // short name of the command. Typically one character (deprecated, use 
`Aliases`)
+       ShortName string
+       // A list of aliases for the command
+       Aliases []string
+       // A short description of the usage of this command
+       Usage string
+       // Custom text to show on USAGE section of help
+       UsageText string
+       // A longer explanation of how the command works
+       Description string
+       // A short description of the arguments of this command
+       ArgsUsage string
+       // The function to call when checking for bash command completions
+       BashComplete func(context *Context)
+       // An action to execute before any sub-subcommands are run, but after 
the context is ready
+       // If a non-nil error is returned, no sub-subcommands are run
+       Before func(context *Context) error
+       // An action to execute after any subcommands are run, but before the 
subcommand has finished
+       // It is run even if Action() panics
+       After func(context *Context) error
+       // The function to call when this command is invoked
+       Action func(context *Context)
+       // Execute this function, if an usage error occurs. This is useful for 
displaying customized usage error messages.
+       // This function is able to replace the original error messages.
+       // If this function is not set, the "Incorrect usage" is displayed and 
the execution is interrupted.
+       OnUsageError func(context *Context, err error) error
+       // List of child commands
+       Subcommands []Command
+       // List of flags to parse
+       Flags []Flag
+       // Treat all flags as normal arguments if true
+       SkipFlagParsing bool
+       // Boolean to hide built-in help command
+       HideHelp bool
+
+       // Full name of command for help, defaults to full command name, 
including parent commands.
+       HelpName        string
+       commandNamePath []string
+}
+
+// Returns the full name of the command.
+// For subcommands this ensures that parent commands are part of the command 
path
+func (c Command) FullName() string {
+       if c.commandNamePath == nil {
+               return c.Name
+       }
+       return strings.Join(c.commandNamePath, " ")
+}
+
+// Invokes the command given the context, parses ctx.Args() to generate 
command-specific flags
+func (c Command) Run(ctx *Context) (err error) {
+       if len(c.Subcommands) > 0 {
+               return c.startApp(ctx)
+       }
+
+       if !c.HideHelp && (HelpFlag != BoolFlag{}) {
+               // append help to flags
+               c.Flags = append(
+                       c.Flags,
+                       HelpFlag,
+               )
+       }
+
+       if ctx.App.EnableBashCompletion {
+               c.Flags = append(c.Flags, BashCompletionFlag)
+       }
+
+       set := flagSet(c.Name, c.Flags)
+       set.SetOutput(ioutil.Discard)
+
+       if !c.SkipFlagParsing {
+               firstFlagIndex := -1
+               terminatorIndex := -1
+               for index, arg := range ctx.Args() {
+                       if arg == "--" {
+                               terminatorIndex = index
+                               break
+                       } else if arg == "-" {
+                               // Do nothing. A dash alone is not really a 
flag.
+                               continue
+                       } else if strings.HasPrefix(arg, "-") && firstFlagIndex 
== -1 {
+                               firstFlagIndex = index
+                       }
+               }
+
+               if firstFlagIndex > -1 {
+                       args := ctx.Args()
+                       regularArgs := make([]string, 
len(args[1:firstFlagIndex]))
+                       copy(regularArgs, args[1:firstFlagIndex])
+
+                       var flagArgs []string
+                       if terminatorIndex > -1 {
+                               flagArgs = args[firstFlagIndex:terminatorIndex]
+                               regularArgs = append(regularArgs, 
args[terminatorIndex:]...)
+                       } else {
+                               flagArgs = args[firstFlagIndex:]
+                       }
+
+                       err = set.Parse(append(flagArgs, regularArgs...))
+               } else {
+                       err = set.Parse(ctx.Args().Tail())
+               }
+       } else {
+               if c.SkipFlagParsing {
+                       err = set.Parse(append([]string{"--"}, 
ctx.Args().Tail()...))
+               }
+       }
+
+       if err != nil {
+               if c.OnUsageError != nil {
+                       err := c.OnUsageError(ctx, err)
+                       return err
+               } else {
+                       fmt.Fprintln(ctx.App.Writer, "Incorrect Usage.")
+                       fmt.Fprintln(ctx.App.Writer)
+                       ShowCommandHelp(ctx, c.Name)
+                       return err
+               }
+       }
+
+       nerr := normalizeFlags(c.Flags, set)
+       if nerr != nil {
+               fmt.Fprintln(ctx.App.Writer, nerr)
+               fmt.Fprintln(ctx.App.Writer)
+               ShowCommandHelp(ctx, c.Name)
+               return nerr
+       }
+       context := NewContext(ctx.App, set, ctx)
+
+       if checkCommandCompletions(context, c.Name) {
+               return nil
+       }
+
+       if checkCommandHelp(context, c.Name) {
+               return nil
+       }
+
+       if c.After != nil {
+               defer func() {
+                       afterErr := c.After(context)
+                       if afterErr != nil {
+                               if err != nil {
+                                       err = NewMultiError(err, afterErr)
+                               } else {
+                                       err = afterErr
+                               }
+                       }
+               }()
+       }
+
+       if c.Before != nil {
+               err := c.Before(context)
+               if err != nil {
+                       fmt.Fprintln(ctx.App.Writer, err)
+                       fmt.Fprintln(ctx.App.Writer)
+                       ShowCommandHelp(ctx, c.Name)
+                       return err
+               }
+       }
+
+       context.Command = c
+       c.Action(context)
+       return nil
+}
+
+func (c Command) Names() []string {
+       names := []string{c.Name}
+
+       if c.ShortName != "" {
+               names = append(names, c.ShortName)
+       }
+
+       return append(names, c.Aliases...)
+}
+
+// Returns true if Command.Name or Command.ShortName matches given name
+func (c Command) HasName(name string) bool {
+       for _, n := range c.Names() {
+               if n == name {
+                       return true
+               }
+       }
+       return false
+}
+
+func (c Command) startApp(ctx *Context) error {
+       app := NewApp()
+
+       // set the name and usage
+       app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name)
+       if c.HelpName == "" {
+               app.HelpName = c.HelpName
+       } else {
+               app.HelpName = app.Name
+       }
+
+       if c.Description != "" {
+               app.Usage = c.Description
+       } else {
+               app.Usage = c.Usage
+       }
+
+       // set CommandNotFound
+       app.CommandNotFound = ctx.App.CommandNotFound
+
+       // set the flags and commands
+       app.Commands = c.Subcommands
+       app.Flags = c.Flags
+       app.HideHelp = c.HideHelp
+
+       app.Version = ctx.App.Version
+       app.HideVersion = ctx.App.HideVersion
+       app.Compiled = ctx.App.Compiled
+       app.Author = ctx.App.Author
+       app.Email = ctx.App.Email
+       app.Writer = ctx.App.Writer
+
+       // bash completion
+       app.EnableBashCompletion = ctx.App.EnableBashCompletion
+       if c.BashComplete != nil {
+               app.BashComplete = c.BashComplete
+       }
+
+       // set the actions
+       app.Before = c.Before
+       app.After = c.After
+       if c.Action != nil {
+               app.Action = c.Action
+       } else {
+               app.Action = helpSubcommand.Action
+       }
+
+       for index, cc := range app.Commands {
+               app.Commands[index].commandNamePath = []string{c.Name, cc.Name}
+       }
+
+       return app.RunAsSubcommand(ctx)
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/context.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/context.go 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/context.go
new file mode 100644
index 0000000..0513d34
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/context.go
@@ -0,0 +1,388 @@
+package cli
+
+import (
+       "errors"
+       "flag"
+       "strconv"
+       "strings"
+       "time"
+)
+
+// Context is a type that is passed through to
+// each Handler action in a cli application. Context
+// can be used to retrieve context-specific Args and
+// parsed command-line options.
+type Context struct {
+       App            *App
+       Command        Command
+       flagSet        *flag.FlagSet
+       setFlags       map[string]bool
+       globalSetFlags map[string]bool
+       parentContext  *Context
+}
+
+// Creates a new context. For use in when invoking an App or Command action.
+func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
+       return &Context{App: app, flagSet: set, parentContext: parentCtx}
+}
+
+// Looks up the value of a local int flag, returns 0 if no int flag exists
+func (c *Context) Int(name string) int {
+       return lookupInt(name, c.flagSet)
+}
+
+// Looks up the value of a local time.Duration flag, returns 0 if no 
time.Duration flag exists
+func (c *Context) Duration(name string) time.Duration {
+       return lookupDuration(name, c.flagSet)
+}
+
+// Looks up the value of a local float64 flag, returns 0 if no float64 flag 
exists
+func (c *Context) Float64(name string) float64 {
+       return lookupFloat64(name, c.flagSet)
+}
+
+// Looks up the value of a local bool flag, returns false if no bool flag 
exists
+func (c *Context) Bool(name string) bool {
+       return lookupBool(name, c.flagSet)
+}
+
+// Looks up the value of a local boolT flag, returns false if no bool flag 
exists
+func (c *Context) BoolT(name string) bool {
+       return lookupBoolT(name, c.flagSet)
+}
+
+// Looks up the value of a local string flag, returns "" if no string flag 
exists
+func (c *Context) String(name string) string {
+       return lookupString(name, c.flagSet)
+}
+
+// Looks up the value of a local string slice flag, returns nil if no string 
slice flag exists
+func (c *Context) StringSlice(name string) []string {
+       return lookupStringSlice(name, c.flagSet)
+}
+
+// Looks up the value of a local int slice flag, returns nil if no int slice 
flag exists
+func (c *Context) IntSlice(name string) []int {
+       return lookupIntSlice(name, c.flagSet)
+}
+
+// Looks up the value of a local generic flag, returns nil if no generic flag 
exists
+func (c *Context) Generic(name string) interface{} {
+       return lookupGeneric(name, c.flagSet)
+}
+
+// Looks up the value of a global int flag, returns 0 if no int flag exists
+func (c *Context) GlobalInt(name string) int {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupInt(name, fs)
+       }
+       return 0
+}
+
+// Looks up the value of a global time.Duration flag, returns 0 if no 
time.Duration flag exists
+func (c *Context) GlobalDuration(name string) time.Duration {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupDuration(name, fs)
+       }
+       return 0
+}
+
+// Looks up the value of a global bool flag, returns false if no bool flag 
exists
+func (c *Context) GlobalBool(name string) bool {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupBool(name, fs)
+       }
+       return false
+}
+
+// Looks up the value of a global string flag, returns "" if no string flag 
exists
+func (c *Context) GlobalString(name string) string {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupString(name, fs)
+       }
+       return ""
+}
+
+// Looks up the value of a global string slice flag, returns nil if no string 
slice flag exists
+func (c *Context) GlobalStringSlice(name string) []string {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupStringSlice(name, fs)
+       }
+       return nil
+}
+
+// Looks up the value of a global int slice flag, returns nil if no int slice 
flag exists
+func (c *Context) GlobalIntSlice(name string) []int {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupIntSlice(name, fs)
+       }
+       return nil
+}
+
+// Looks up the value of a global generic flag, returns nil if no generic flag 
exists
+func (c *Context) GlobalGeneric(name string) interface{} {
+       if fs := lookupGlobalFlagSet(name, c); fs != nil {
+               return lookupGeneric(name, fs)
+       }
+       return nil
+}
+
+// Returns the number of flags set
+func (c *Context) NumFlags() int {
+       return c.flagSet.NFlag()
+}
+
+// Determines if the flag was actually set
+func (c *Context) IsSet(name string) bool {
+       if c.setFlags == nil {
+               c.setFlags = make(map[string]bool)
+               c.flagSet.Visit(func(f *flag.Flag) {
+                       c.setFlags[f.Name] = true
+               })
+       }
+       return c.setFlags[name] == true
+}
+
+// Determines if the global flag was actually set
+func (c *Context) GlobalIsSet(name string) bool {
+       if c.globalSetFlags == nil {
+               c.globalSetFlags = make(map[string]bool)
+               ctx := c
+               if ctx.parentContext != nil {
+                       ctx = ctx.parentContext
+               }
+               for ; ctx != nil && c.globalSetFlags[name] == false; ctx = 
ctx.parentContext {
+                       ctx.flagSet.Visit(func(f *flag.Flag) {
+                               c.globalSetFlags[f.Name] = true
+                       })
+               }
+       }
+       return c.globalSetFlags[name]
+}
+
+// Returns a slice of flag names used in this context.
+func (c *Context) FlagNames() (names []string) {
+       for _, flag := range c.Command.Flags {
+               name := strings.Split(flag.GetName(), ",")[0]
+               if name == "help" {
+                       continue
+               }
+               names = append(names, name)
+       }
+       return
+}
+
+// Returns a slice of global flag names used by the app.
+func (c *Context) GlobalFlagNames() (names []string) {
+       for _, flag := range c.App.Flags {
+               name := strings.Split(flag.GetName(), ",")[0]
+               if name == "help" || name == "version" {
+                       continue
+               }
+               names = append(names, name)
+       }
+       return
+}
+
+// Returns the parent context, if any
+func (c *Context) Parent() *Context {
+       return c.parentContext
+}
+
+type Args []string
+
+// Returns the command line arguments associated with the context.
+func (c *Context) Args() Args {
+       args := Args(c.flagSet.Args())
+       return args
+}
+
+// Returns the nth argument, or else a blank string
+func (a Args) Get(n int) string {
+       if len(a) > n {
+               return a[n]
+       }
+       return ""
+}
+
+// Returns the first argument, or else a blank string
+func (a Args) First() string {
+       return a.Get(0)
+}
+
+// Return the rest of the arguments (not the first one)
+// or else an empty string slice
+func (a Args) Tail() []string {
+       if len(a) >= 2 {
+               return []string(a)[1:]
+       }
+       return []string{}
+}
+
+// Checks if there are any arguments present
+func (a Args) Present() bool {
+       return len(a) != 0
+}
+
+// Swaps arguments at the given indexes
+func (a Args) Swap(from, to int) error {
+       if from >= len(a) || to >= len(a) {
+               return errors.New("index out of range")
+       }
+       a[from], a[to] = a[to], a[from]
+       return nil
+}
+
+func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet {
+       if ctx.parentContext != nil {
+               ctx = ctx.parentContext
+       }
+       for ; ctx != nil; ctx = ctx.parentContext {
+               if f := ctx.flagSet.Lookup(name); f != nil {
+                       return ctx.flagSet
+               }
+       }
+       return nil
+}
+
+func lookupInt(name string, set *flag.FlagSet) int {
+       f := set.Lookup(name)
+       if f != nil {
+               val, err := strconv.Atoi(f.Value.String())
+               if err != nil {
+                       return 0
+               }
+               return val
+       }
+
+       return 0
+}
+
+func lookupDuration(name string, set *flag.FlagSet) time.Duration {
+       f := set.Lookup(name)
+       if f != nil {
+               val, err := time.ParseDuration(f.Value.String())
+               if err == nil {
+                       return val
+               }
+       }
+
+       return 0
+}
+
+func lookupFloat64(name string, set *flag.FlagSet) float64 {
+       f := set.Lookup(name)
+       if f != nil {
+               val, err := strconv.ParseFloat(f.Value.String(), 64)
+               if err != nil {
+                       return 0
+               }
+               return val
+       }
+
+       return 0
+}
+
+func lookupString(name string, set *flag.FlagSet) string {
+       f := set.Lookup(name)
+       if f != nil {
+               return f.Value.String()
+       }
+
+       return ""
+}
+
+func lookupStringSlice(name string, set *flag.FlagSet) []string {
+       f := set.Lookup(name)
+       if f != nil {
+               return (f.Value.(*StringSlice)).Value()
+
+       }
+
+       return nil
+}
+
+func lookupIntSlice(name string, set *flag.FlagSet) []int {
+       f := set.Lookup(name)
+       if f != nil {
+               return (f.Value.(*IntSlice)).Value()
+
+       }
+
+       return nil
+}
+
+func lookupGeneric(name string, set *flag.FlagSet) interface{} {
+       f := set.Lookup(name)
+       if f != nil {
+               return f.Value
+       }
+       return nil
+}
+
+func lookupBool(name string, set *flag.FlagSet) bool {
+       f := set.Lookup(name)
+       if f != nil {
+               val, err := strconv.ParseBool(f.Value.String())
+               if err != nil {
+                       return false
+               }
+               return val
+       }
+
+       return false
+}
+
+func lookupBoolT(name string, set *flag.FlagSet) bool {
+       f := set.Lookup(name)
+       if f != nil {
+               val, err := strconv.ParseBool(f.Value.String())
+               if err != nil {
+                       return true
+               }
+               return val
+       }
+
+       return false
+}
+
+func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
+       switch ff.Value.(type) {
+       case *StringSlice:
+       default:
+               set.Set(name, ff.Value.String())
+       }
+}
+
+func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
+       visited := make(map[string]bool)
+       set.Visit(func(f *flag.Flag) {
+               visited[f.Name] = true
+       })
+       for _, f := range flags {
+               parts := strings.Split(f.GetName(), ",")
+               if len(parts) == 1 {
+                       continue
+               }
+               var ff *flag.Flag
+               for _, name := range parts {
+                       name = strings.Trim(name, " ")
+                       if visited[name] {
+                               if ff != nil {
+                                       return errors.New("Cannot use two forms 
of the same flag: " + name + " " + ff.Name)
+                               }
+                               ff = set.Lookup(name)
+                       }
+               }
+               if ff == nil {
+                       continue
+               }
+               for _, name := range parts {
+                       name = strings.Trim(name, " ")
+                       if !visited[name] {
+                               copyFlag(name, ff, set)
+                       }
+               }
+       }
+       return nil
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/flag.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/flag.go 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/flag.go
new file mode 100644
index 0000000..e951c2d
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/flag.go
@@ -0,0 +1,546 @@
+package cli
+
+import (
+       "flag"
+       "fmt"
+       "os"
+       "runtime"
+       "strconv"
+       "strings"
+       "time"
+)
+
+// This flag enables bash-completion for all commands and subcommands
+var BashCompletionFlag = BoolFlag{
+       Name: "generate-bash-completion",
+}
+
+// This flag prints the version for the application
+var VersionFlag = BoolFlag{
+       Name:  "version, v",
+       Usage: "print the version",
+}
+
+// This flag prints the help for all commands and subcommands
+// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
+// unless HideHelp is set to true)
+var HelpFlag = BoolFlag{
+       Name:  "help, h",
+       Usage: "show help",
+}
+
+// Flag is a common interface related to parsing flags in cli.
+// For more advanced flag parsing techniques, it is recommended that
+// this interface be implemented.
+type Flag interface {
+       fmt.Stringer
+       // Apply Flag settings to the given flag set
+       Apply(*flag.FlagSet)
+       GetName() string
+}
+
+func flagSet(name string, flags []Flag) *flag.FlagSet {
+       set := flag.NewFlagSet(name, flag.ContinueOnError)
+
+       for _, f := range flags {
+               f.Apply(set)
+       }
+       return set
+}
+
+func eachName(longName string, fn func(string)) {
+       parts := strings.Split(longName, ",")
+       for _, name := range parts {
+               name = strings.Trim(name, " ")
+               fn(name)
+       }
+}
+
+// Generic is a generic parseable type identified by a specific flag
+type Generic interface {
+       Set(value string) error
+       String() string
+}
+
+// GenericFlag is the flag type for types implementing Generic
+type GenericFlag struct {
+       Name   string
+       Value  Generic
+       Usage  string
+       EnvVar string
+}
+
+// String returns the string representation of the generic flag to display the
+// help text to the user (uses the String() method of the generic flag to show
+// the value)
+func (f GenericFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s %v\t%v", 
prefixedNames(f.Name), f.FormatValueHelp(), f.Usage))
+}
+
+func (f GenericFlag) FormatValueHelp() string {
+       if f.Value == nil {
+               return ""
+       }
+       s := f.Value.String()
+       if len(s) == 0 {
+               return ""
+       }
+       return fmt.Sprintf("\"%s\"", s)
+}
+
+// Apply takes the flagset and calls Set on the generic flag with the value
+// provided by the user for parsing by the flag
+func (f GenericFlag) Apply(set *flag.FlagSet) {
+       val := f.Value
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               val.Set(envVal)
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               set.Var(f.Value, name, f.Usage)
+       })
+}
+
+func (f GenericFlag) GetName() string {
+       return f.Name
+}
+
+// StringSlice is an opaque type for []string to satisfy flag.Value
+type StringSlice []string
+
+// Set appends the string value to the list of values
+func (f *StringSlice) Set(value string) error {
+       *f = append(*f, value)
+       return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f *StringSlice) String() string {
+       return fmt.Sprintf("%s", *f)
+}
+
+// Value returns the slice of strings set by this flag
+func (f *StringSlice) Value() []string {
+       return *f
+}
+
+// StringSlice is a string flag that can be specified multiple times on the
+// command-line
+type StringSliceFlag struct {
+       Name   string
+       Value  *StringSlice
+       Usage  string
+       EnvVar string
+}
+
+// String returns the usage
+func (f StringSliceFlag) String() string {
+       firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ")
+       pref := prefixFor(firstName)
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s [%v]\t%v", 
prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", 
f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f StringSliceFlag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               newVal := &StringSlice{}
+                               for _, s := range strings.Split(envVal, ",") {
+                                       s = strings.TrimSpace(s)
+                                       newVal.Set(s)
+                               }
+                               f.Value = newVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Value == nil {
+                       f.Value = &StringSlice{}
+               }
+               set.Var(f.Value, name, f.Usage)
+       })
+}
+
+func (f StringSliceFlag) GetName() string {
+       return f.Name
+}
+
+// StringSlice is an opaque type for []int to satisfy flag.Value
+type IntSlice []int
+
+// Set parses the value into an integer and appends it to the list of values
+func (f *IntSlice) Set(value string) error {
+       tmp, err := strconv.Atoi(value)
+       if err != nil {
+               return err
+       } else {
+               *f = append(*f, tmp)
+       }
+       return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f *IntSlice) String() string {
+       return fmt.Sprintf("%d", *f)
+}
+
+// Value returns the slice of ints set by this flag
+func (f *IntSlice) Value() []int {
+       return *f
+}
+
+// IntSliceFlag is an int flag that can be specified multiple times on the
+// command-line
+type IntSliceFlag struct {
+       Name   string
+       Value  *IntSlice
+       Usage  string
+       EnvVar string
+}
+
+// String returns the usage
+func (f IntSliceFlag) String() string {
+       firstName := strings.Trim(strings.Split(f.Name, ",")[0], " ")
+       pref := prefixFor(firstName)
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s [%v]\t%v", 
prefixedNames(f.Name), pref+firstName+" option "+pref+firstName+" option", 
f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f IntSliceFlag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               newVal := &IntSlice{}
+                               for _, s := range strings.Split(envVal, ",") {
+                                       s = strings.TrimSpace(s)
+                                       err := newVal.Set(s)
+                                       if err != nil {
+                                               fmt.Fprintf(os.Stderr, 
err.Error())
+                                       }
+                               }
+                               f.Value = newVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Value == nil {
+                       f.Value = &IntSlice{}
+               }
+               set.Var(f.Value, name, f.Usage)
+       })
+}
+
+func (f IntSliceFlag) GetName() string {
+       return f.Name
+}
+
+// BoolFlag is a switch that defaults to false
+type BoolFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Destination *bool
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f BoolFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", 
prefixedNames(f.Name), f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f BoolFlag) Apply(set *flag.FlagSet) {
+       val := false
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               envValBool, err := strconv.ParseBool(envVal)
+                               if err == nil {
+                                       val = envValBool
+                               }
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.BoolVar(f.Destination, name, val, f.Usage)
+                       return
+               }
+               set.Bool(name, val, f.Usage)
+       })
+}
+
+func (f BoolFlag) GetName() string {
+       return f.Name
+}
+
+// BoolTFlag this represents a boolean flag that is true by default, but can
+// still be set to false by --some-flag=false
+type BoolTFlag struct {
+       Name        string
+       Usage       string
+       EnvVar      string
+       Destination *bool
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f BoolTFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s\t%v", 
prefixedNames(f.Name), f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f BoolTFlag) Apply(set *flag.FlagSet) {
+       val := true
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               envValBool, err := strconv.ParseBool(envVal)
+                               if err == nil {
+                                       val = envValBool
+                                       break
+                               }
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.BoolVar(f.Destination, name, val, f.Usage)
+                       return
+               }
+               set.Bool(name, val, f.Usage)
+       })
+}
+
+func (f BoolTFlag) GetName() string {
+       return f.Name
+}
+
+// StringFlag represents a flag that takes as string value
+type StringFlag struct {
+       Name        string
+       Value       string
+       Usage       string
+       EnvVar      string
+       Destination *string
+}
+
+// String returns the usage
+func (f StringFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s %v\t%v", 
prefixedNames(f.Name), f.FormatValueHelp(), f.Usage))
+}
+
+func (f StringFlag) FormatValueHelp() string {
+       s := f.Value
+       if len(s) == 0 {
+               return ""
+       }
+       return fmt.Sprintf("\"%s\"", s)
+}
+
+// Apply populates the flag given the flag set and environment
+func (f StringFlag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               f.Value = envVal
+                               break
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.StringVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.String(name, f.Value, f.Usage)
+       })
+}
+
+func (f StringFlag) GetName() string {
+       return f.Name
+}
+
+// IntFlag is a flag that takes an integer
+// Errors if the value provided cannot be parsed
+type IntFlag struct {
+       Name        string
+       Value       int
+       Usage       string
+       EnvVar      string
+       Destination *int
+}
+
+// String returns the usage
+func (f IntFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", 
prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f IntFlag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               envValInt, err := strconv.ParseInt(envVal, 0, 
64)
+                               if err == nil {
+                                       f.Value = int(envValInt)
+                                       break
+                               }
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.IntVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Int(name, f.Value, f.Usage)
+       })
+}
+
+func (f IntFlag) GetName() string {
+       return f.Name
+}
+
+// DurationFlag is a flag that takes a duration specified in Go's duration
+// format: https://golang.org/pkg/time/#ParseDuration
+type DurationFlag struct {
+       Name        string
+       Value       time.Duration
+       Usage       string
+       EnvVar      string
+       Destination *time.Duration
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f DurationFlag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", 
prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f DurationFlag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               envValDuration, err := 
time.ParseDuration(envVal)
+                               if err == nil {
+                                       f.Value = envValDuration
+                                       break
+                               }
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.DurationVar(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Duration(name, f.Value, f.Usage)
+       })
+}
+
+func (f DurationFlag) GetName() string {
+       return f.Name
+}
+
+// Float64Flag is a flag that takes an float value
+// Errors if the value provided cannot be parsed
+type Float64Flag struct {
+       Name        string
+       Value       float64
+       Usage       string
+       EnvVar      string
+       Destination *float64
+}
+
+// String returns the usage
+func (f Float64Flag) String() string {
+       return withEnvHint(f.EnvVar, fmt.Sprintf("%s \"%v\"\t%v", 
prefixedNames(f.Name), f.Value, f.Usage))
+}
+
+// Apply populates the flag given the flag set and environment
+func (f Float64Flag) Apply(set *flag.FlagSet) {
+       if f.EnvVar != "" {
+               for _, envVar := range strings.Split(f.EnvVar, ",") {
+                       envVar = strings.TrimSpace(envVar)
+                       if envVal := os.Getenv(envVar); envVal != "" {
+                               envValFloat, err := strconv.ParseFloat(envVal, 
10)
+                               if err == nil {
+                                       f.Value = float64(envValFloat)
+                               }
+                       }
+               }
+       }
+
+       eachName(f.Name, func(name string) {
+               if f.Destination != nil {
+                       set.Float64Var(f.Destination, name, f.Value, f.Usage)
+                       return
+               }
+               set.Float64(name, f.Value, f.Usage)
+       })
+}
+
+func (f Float64Flag) GetName() string {
+       return f.Name
+}
+
+func prefixFor(name string) (prefix string) {
+       if len(name) == 1 {
+               prefix = "-"
+       } else {
+               prefix = "--"
+       }
+
+       return
+}
+
+func prefixedNames(fullName string) (prefixed string) {
+       parts := strings.Split(fullName, ",")
+       for i, name := range parts {
+               name = strings.Trim(name, " ")
+               prefixed += prefixFor(name) + name
+               if i < len(parts)-1 {
+                       prefixed += ", "
+               }
+       }
+       return
+}
+
+func withEnvHint(envVar, str string) string {
+       envText := ""
+       if envVar != "" {
+               prefix := "$"
+               suffix := ""
+               sep := ", $"
+               if runtime.GOOS == "windows" {
+                       prefix = "%"
+                       suffix = "%"
+                       sep = "%, %"
+               }
+               envText = fmt.Sprintf(" [%s%s%s]", prefix, 
strings.Join(strings.Split(envVar, ","), sep), suffix)
+       }
+       return str + envText
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/github.com/codegangsta/cli/help.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/github.com/codegangsta/cli/help.go 
b/br/Godeps/_workspace/src/github.com/codegangsta/cli/help.go
new file mode 100644
index 0000000..15916f8
--- /dev/null
+++ b/br/Godeps/_workspace/src/github.com/codegangsta/cli/help.go
@@ -0,0 +1,248 @@
+package cli
+
+import (
+       "fmt"
+       "io"
+       "strings"
+       "text/tabwriter"
+       "text/template"
+)
+
+// The text template for the Default help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var AppHelpTemplate = `NAME:
+   {{.Name}} - {{.Usage}}
+
+USAGE:
+   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .Flags}}[global 
options]{{end}}{{if .Commands}} command [command options]{{end}} {{if 
.ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
+   {{if .Version}}
+VERSION:
+   {{.Version}}
+   {{end}}{{if len .Authors}}
+AUTHOR(S):
+   {{range .Authors}}{{ . }}{{end}}
+   {{end}}{{if .Commands}}
+COMMANDS:
+   {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
+   {{end}}{{end}}{{if .Flags}}
+GLOBAL OPTIONS:
+   {{range .Flags}}{{.}}
+   {{end}}{{end}}{{if .Copyright }}
+COPYRIGHT:
+   {{.Copyright}}
+   {{end}}
+`
+
+// The text template for the command help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var CommandHelpTemplate = `NAME:
+   {{.HelpName}} - {{.Usage}}
+
+USAGE:
+   {{.HelpName}}{{if .Flags}} [command options]{{end}} {{if 
.ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Description}}
+
+DESCRIPTION:
+   {{.Description}}{{end}}{{if .Flags}}
+
+OPTIONS:
+   {{range .Flags}}{{.}}
+   {{end}}{{ end }}
+`
+
+// The text template for the subcommand help topic.
+// cli.go uses text/template to render templates. You can
+// render custom help text by setting this variable.
+var SubcommandHelpTemplate = `NAME:
+   {{.HelpName}} - {{.Usage}}
+
+USAGE:
+   {{.HelpName}} command{{if .Flags}} [command options]{{end}} {{if 
.ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
+
+COMMANDS:
+   {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
+   {{end}}{{if .Flags}}
+OPTIONS:
+   {{range .Flags}}{{.}}
+   {{end}}{{end}}
+`
+
+var helpCommand = Command{
+       Name:      "help",
+       Aliases:   []string{"h"},
+       Usage:     "Shows a list of commands or help for one command",
+       ArgsUsage: "[command]",
+       Action: func(c *Context) {
+               args := c.Args()
+               if args.Present() {
+                       ShowCommandHelp(c, args.First())
+               } else {
+                       ShowAppHelp(c)
+               }
+       },
+}
+
+var helpSubcommand = Command{
+       Name:      "help",
+       Aliases:   []string{"h"},
+       Usage:     "Shows a list of commands or help for one command",
+       ArgsUsage: "[command]",
+       Action: func(c *Context) {
+               args := c.Args()
+               if args.Present() {
+                       ShowCommandHelp(c, args.First())
+               } else {
+                       ShowSubcommandHelp(c)
+               }
+       },
+}
+
+// Prints help for the App or Command
+type helpPrinter func(w io.Writer, templ string, data interface{})
+
+var HelpPrinter helpPrinter = printHelp
+
+// Prints version for the App
+var VersionPrinter = printVersion
+
+func ShowAppHelp(c *Context) {
+       HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
+}
+
+// Prints the list of subcommands as the default app completion method
+func DefaultAppComplete(c *Context) {
+       for _, command := range c.App.Commands {
+               for _, name := range command.Names() {
+                       fmt.Fprintln(c.App.Writer, name)
+               }
+       }
+}
+
+// Prints help for the given command
+func ShowCommandHelp(ctx *Context, command string) {
+       // show the subcommand help for a command with subcommands
+       if command == "" {
+               HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App)
+               return
+       }
+
+       for _, c := range ctx.App.Commands {
+               if c.HasName(command) {
+                       HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
+                       return
+               }
+       }
+
+       if ctx.App.CommandNotFound != nil {
+               ctx.App.CommandNotFound(ctx, command)
+       } else {
+               fmt.Fprintf(ctx.App.Writer, "No help topic for '%v'\n", command)
+       }
+}
+
+// Prints help for the given subcommand
+func ShowSubcommandHelp(c *Context) {
+       ShowCommandHelp(c, c.Command.Name)
+}
+
+// Prints the version number of the App
+func ShowVersion(c *Context) {
+       VersionPrinter(c)
+}
+
+func printVersion(c *Context) {
+       fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version)
+}
+
+// Prints the lists of commands within a given context
+func ShowCompletions(c *Context) {
+       a := c.App
+       if a != nil && a.BashComplete != nil {
+               a.BashComplete(c)
+       }
+}
+
+// Prints the custom completions for a given command
+func ShowCommandCompletions(ctx *Context, command string) {
+       c := ctx.App.Command(command)
+       if c != nil && c.BashComplete != nil {
+               c.BashComplete(ctx)
+       }
+}
+
+func printHelp(out io.Writer, templ string, data interface{}) {
+       funcMap := template.FuncMap{
+               "join": strings.Join,
+       }
+
+       w := tabwriter.NewWriter(out, 0, 8, 1, '\t', 0)
+       t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
+       err := t.Execute(w, data)
+       if err != nil {
+               // If the writer is closed, t.Execute will fail, and there's 
nothing
+               // we can do to recover. We could send this to os.Stderr if we 
need.
+               return
+       }
+       w.Flush()
+}
+
+func checkVersion(c *Context) bool {
+       found := false
+       if VersionFlag.Name != "" {
+               eachName(VersionFlag.Name, func(name string) {
+                       if c.GlobalBool(name) || c.Bool(name) {
+                               found = true
+                       }
+               })
+       }
+       return found
+}
+
+func checkHelp(c *Context) bool {
+       found := false
+       if HelpFlag.Name != "" {
+               eachName(HelpFlag.Name, func(name string) {
+                       if c.GlobalBool(name) || c.Bool(name) {
+                               found = true
+                       }
+               })
+       }
+       return found
+}
+
+func checkCommandHelp(c *Context, name string) bool {
+       if c.Bool("h") || c.Bool("help") {
+               ShowCommandHelp(c, name)
+               return true
+       }
+
+       return false
+}
+
+func checkSubcommandHelp(c *Context) bool {
+       if c.GlobalBool("h") || c.GlobalBool("help") {
+               ShowSubcommandHelp(c)
+               return true
+       }
+
+       return false
+}
+
+func checkCompletions(c *Context) bool {
+       if (c.GlobalBool(BashCompletionFlag.Name) || 
c.Bool(BashCompletionFlag.Name)) && c.App.EnableBashCompletion {
+               ShowCompletions(c)
+               return true
+       }
+
+       return false
+}
+
+func checkCommandCompletions(c *Context, name string) bool {
+       if c.Bool(BashCompletionFlag.Name) && c.App.EnableBashCompletion {
+               ShowCommandCompletions(c, name)
+               return true
+       }
+
+       return false
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/LICENSE
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/golang.org/x/crypto/LICENSE 
b/br/Godeps/_workspace/src/golang.org/x/crypto/LICENSE
new file mode 100644
index 0000000..6a66aea
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/PATENTS
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/golang.org/x/crypto/PATENTS 
b/br/Godeps/_workspace/src/golang.org/x/crypto/PATENTS
new file mode 100644
index 0000000..7330990
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/PATENTS
@@ -0,0 +1,22 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Go project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Go, where such license applies only to those patent
+claims, both currently owned or controlled by Google and acquired in
+the future, licensable by Google that are necessarily infringed by this
+implementation of Go.  This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation.  If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of Go or any code incorporated within this
+implementation of Go constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of Go
+shall terminate as of the date such litigation is filed.

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal.go
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal.go 
b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal.go
new file mode 100644
index 0000000..741eeb1
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal.go
@@ -0,0 +1,892 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package terminal
+
+import (
+       "bytes"
+       "io"
+       "sync"
+       "unicode/utf8"
+)
+
+// EscapeCodes contains escape sequences that can be written to the terminal in
+// order to achieve different styles of text.
+type EscapeCodes struct {
+       // Foreground colors
+       Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
+
+       // Reset all attributes
+       Reset []byte
+}
+
+var vt100EscapeCodes = EscapeCodes{
+       Black:   []byte{keyEscape, '[', '3', '0', 'm'},
+       Red:     []byte{keyEscape, '[', '3', '1', 'm'},
+       Green:   []byte{keyEscape, '[', '3', '2', 'm'},
+       Yellow:  []byte{keyEscape, '[', '3', '3', 'm'},
+       Blue:    []byte{keyEscape, '[', '3', '4', 'm'},
+       Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
+       Cyan:    []byte{keyEscape, '[', '3', '6', 'm'},
+       White:   []byte{keyEscape, '[', '3', '7', 'm'},
+
+       Reset: []byte{keyEscape, '[', '0', 'm'},
+}
+
+// Terminal contains the state for running a VT100 terminal that is capable of
+// reading lines of input.
+type Terminal struct {
+       // AutoCompleteCallback, if non-null, is called for each keypress with
+       // the full input line and the current position of the cursor (in
+       // bytes, as an index into |line|). If it returns ok=false, the key
+       // press is processed normally. Otherwise it returns a replacement line
+       // and the new cursor position.
+       AutoCompleteCallback func(line string, pos int, key rune) (newLine 
string, newPos int, ok bool)
+
+       // Escape contains a pointer to the escape codes for this terminal.
+       // It's always a valid pointer, although the escape codes themselves
+       // may be empty if the terminal doesn't support them.
+       Escape *EscapeCodes
+
+       // lock protects the terminal and the state in this object from
+       // concurrent processing of a key press and a Write() call.
+       lock sync.Mutex
+
+       c      io.ReadWriter
+       prompt []rune
+
+       // line is the current line being entered.
+       line []rune
+       // pos is the logical position of the cursor in line
+       pos int
+       // echo is true if local echo is enabled
+       echo bool
+       // pasteActive is true iff there is a bracketed paste operation in
+       // progress.
+       pasteActive bool
+
+       // cursorX contains the current X value of the cursor where the left
+       // edge is 0. cursorY contains the row number where the first row of
+       // the current line is 0.
+       cursorX, cursorY int
+       // maxLine is the greatest value of cursorY so far.
+       maxLine int
+
+       termWidth, termHeight int
+
+       // outBuf contains the terminal data to be sent.
+       outBuf []byte
+       // remainder contains the remainder of any partial key sequences after
+       // a read. It aliases into inBuf.
+       remainder []byte
+       inBuf     [256]byte
+
+       // history contains previously entered commands so that they can be
+       // accessed with the up and down keys.
+       history stRingBuffer
+       // historyIndex stores the currently accessed history entry, where zero
+       // means the immediately previous entry.
+       historyIndex int
+       // When navigating up and down the history it's possible to return to
+       // the incomplete, initial line. That value is stored in
+       // historyPending.
+       historyPending string
+}
+
+// NewTerminal runs a VT100 terminal on the given ReadWriter. If the 
ReadWriter is
+// a local terminal, that terminal must first have been put into raw mode.
+// prompt is a string that is written at the start of each input line (i.e.
+// "> ").
+func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
+       return &Terminal{
+               Escape:       &vt100EscapeCodes,
+               c:            c,
+               prompt:       []rune(prompt),
+               termWidth:    80,
+               termHeight:   24,
+               echo:         true,
+               historyIndex: -1,
+       }
+}
+
+const (
+       keyCtrlD     = 4
+       keyCtrlU     = 21
+       keyEnter     = '\r'
+       keyEscape    = 27
+       keyBackspace = 127
+       keyUnknown   = 0xd800 /* UTF-16 surrogate area */ + iota
+       keyUp
+       keyDown
+       keyLeft
+       keyRight
+       keyAltLeft
+       keyAltRight
+       keyHome
+       keyEnd
+       keyDeleteWord
+       keyDeleteLine
+       keyClearScreen
+       keyPasteStart
+       keyPasteEnd
+)
+
+var pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
+var pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
+
+// bytesToKey tries to parse a key sequence from b. If successful, it returns
+// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
+func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
+       if len(b) == 0 {
+               return utf8.RuneError, nil
+       }
+
+       if !pasteActive {
+               switch b[0] {
+               case 1: // ^A
+                       return keyHome, b[1:]
+               case 5: // ^E
+                       return keyEnd, b[1:]
+               case 8: // ^H
+                       return keyBackspace, b[1:]
+               case 11: // ^K
+                       return keyDeleteLine, b[1:]
+               case 12: // ^L
+                       return keyClearScreen, b[1:]
+               case 23: // ^W
+                       return keyDeleteWord, b[1:]
+               }
+       }
+
+       if b[0] != keyEscape {
+               if !utf8.FullRune(b) {
+                       return utf8.RuneError, b
+               }
+               r, l := utf8.DecodeRune(b)
+               return r, b[l:]
+       }
+
+       if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
+               switch b[2] {
+               case 'A':
+                       return keyUp, b[3:]
+               case 'B':
+                       return keyDown, b[3:]
+               case 'C':
+                       return keyRight, b[3:]
+               case 'D':
+                       return keyLeft, b[3:]
+               case 'H':
+                       return keyHome, b[3:]
+               case 'F':
+                       return keyEnd, b[3:]
+               }
+       }
+
+       if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && 
b[2] == '1' && b[3] == ';' && b[4] == '3' {
+               switch b[5] {
+               case 'C':
+                       return keyAltRight, b[6:]
+               case 'D':
+                       return keyAltLeft, b[6:]
+               }
+       }
+
+       if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
+               return keyPasteStart, b[6:]
+       }
+
+       if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
+               return keyPasteEnd, b[6:]
+       }
+
+       // If we get here then we have a key that we don't recognise, or a
+       // partial sequence. It's not clear how one should find the end of a
+       // sequence without knowing them all, but it seems that [a-zA-Z~] only
+       // appears at the end of a sequence.
+       for i, c := range b[0:] {
+               if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
+                       return keyUnknown, b[i+1:]
+               }
+       }
+
+       return utf8.RuneError, b
+}
+
+// queue appends data to the end of t.outBuf
+func (t *Terminal) queue(data []rune) {
+       t.outBuf = append(t.outBuf, []byte(string(data))...)
+}
+
+var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
+var space = []rune{' '}
+
+func isPrintable(key rune) bool {
+       isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
+       return key >= 32 && !isInSurrogateArea
+}
+
+// moveCursorToPos appends data to t.outBuf which will move the cursor to the
+// given, logical position in the text.
+func (t *Terminal) moveCursorToPos(pos int) {
+       if !t.echo {
+               return
+       }
+
+       x := visualLength(t.prompt) + pos
+       y := x / t.termWidth
+       x = x % t.termWidth
+
+       up := 0
+       if y < t.cursorY {
+               up = t.cursorY - y
+       }
+
+       down := 0
+       if y > t.cursorY {
+               down = y - t.cursorY
+       }
+
+       left := 0
+       if x < t.cursorX {
+               left = t.cursorX - x
+       }
+
+       right := 0
+       if x > t.cursorX {
+               right = x - t.cursorX
+       }
+
+       t.cursorX = x
+       t.cursorY = y
+       t.move(up, down, left, right)
+}
+
+func (t *Terminal) move(up, down, left, right int) {
+       movement := make([]rune, 3*(up+down+left+right))
+       m := movement
+       for i := 0; i < up; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'A'
+               m = m[3:]
+       }
+       for i := 0; i < down; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'B'
+               m = m[3:]
+       }
+       for i := 0; i < left; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'D'
+               m = m[3:]
+       }
+       for i := 0; i < right; i++ {
+               m[0] = keyEscape
+               m[1] = '['
+               m[2] = 'C'
+               m = m[3:]
+       }
+
+       t.queue(movement)
+}
+
+func (t *Terminal) clearLineToRight() {
+       op := []rune{keyEscape, '[', 'K'}
+       t.queue(op)
+}
+
+const maxLineLength = 4096
+
+func (t *Terminal) setLine(newLine []rune, newPos int) {
+       if t.echo {
+               t.moveCursorToPos(0)
+               t.writeLine(newLine)
+               for i := len(newLine); i < len(t.line); i++ {
+                       t.writeLine(space)
+               }
+               t.moveCursorToPos(newPos)
+       }
+       t.line = newLine
+       t.pos = newPos
+}
+
+func (t *Terminal) advanceCursor(places int) {
+       t.cursorX += places
+       t.cursorY += t.cursorX / t.termWidth
+       if t.cursorY > t.maxLine {
+               t.maxLine = t.cursorY
+       }
+       t.cursorX = t.cursorX % t.termWidth
+
+       if places > 0 && t.cursorX == 0 {
+               // Normally terminals will advance the current position
+               // when writing a character. But that doesn't happen
+               // for the last character in a line. However, when
+               // writing a character (except a new line) that causes
+               // a line wrap, the position will be advanced two
+               // places.
+               //
+               // So, if we are stopping at the end of a line, we
+               // need to write a newline so that our cursor can be
+               // advanced to the next line.
+               t.outBuf = append(t.outBuf, '\n')
+       }
+}
+
+func (t *Terminal) eraseNPreviousChars(n int) {
+       if n == 0 {
+               return
+       }
+
+       if t.pos < n {
+               n = t.pos
+       }
+       t.pos -= n
+       t.moveCursorToPos(t.pos)
+
+       copy(t.line[t.pos:], t.line[n+t.pos:])
+       t.line = t.line[:len(t.line)-n]
+       if t.echo {
+               t.writeLine(t.line[t.pos:])
+               for i := 0; i < n; i++ {
+                       t.queue(space)
+               }
+               t.advanceCursor(n)
+               t.moveCursorToPos(t.pos)
+       }
+}
+
+// countToLeftWord returns then number of characters from the cursor to the
+// start of the previous word.
+func (t *Terminal) countToLeftWord() int {
+       if t.pos == 0 {
+               return 0
+       }
+
+       pos := t.pos - 1
+       for pos > 0 {
+               if t.line[pos] != ' ' {
+                       break
+               }
+               pos--
+       }
+       for pos > 0 {
+               if t.line[pos] == ' ' {
+                       pos++
+                       break
+               }
+               pos--
+       }
+
+       return t.pos - pos
+}
+
+// countToRightWord returns then number of characters from the cursor to the
+// start of the next word.
+func (t *Terminal) countToRightWord() int {
+       pos := t.pos
+       for pos < len(t.line) {
+               if t.line[pos] == ' ' {
+                       break
+               }
+               pos++
+       }
+       for pos < len(t.line) {
+               if t.line[pos] != ' ' {
+                       break
+               }
+               pos++
+       }
+       return pos - t.pos
+}
+
+// visualLength returns the number of visible glyphs in s.
+func visualLength(runes []rune) int {
+       inEscapeSeq := false
+       length := 0
+
+       for _, r := range runes {
+               switch {
+               case inEscapeSeq:
+                       if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
+                               inEscapeSeq = false
+                       }
+               case r == '\x1b':
+                       inEscapeSeq = true
+               default:
+                       length++
+               }
+       }
+
+       return length
+}
+
+// handleKey processes the given key and, optionally, returns a line of text
+// that the user has entered.
+func (t *Terminal) handleKey(key rune) (line string, ok bool) {
+       if t.pasteActive && key != keyEnter {
+               t.addKeyToLine(key)
+               return
+       }
+
+       switch key {
+       case keyBackspace:
+               if t.pos == 0 {
+                       return
+               }
+               t.eraseNPreviousChars(1)
+       case keyAltLeft:
+               // move left by a word.
+               t.pos -= t.countToLeftWord()
+               t.moveCursorToPos(t.pos)
+       case keyAltRight:
+               // move right by a word.
+               t.pos += t.countToRightWord()
+               t.moveCursorToPos(t.pos)
+       case keyLeft:
+               if t.pos == 0 {
+                       return
+               }
+               t.pos--
+               t.moveCursorToPos(t.pos)
+       case keyRight:
+               if t.pos == len(t.line) {
+                       return
+               }
+               t.pos++
+               t.moveCursorToPos(t.pos)
+       case keyHome:
+               if t.pos == 0 {
+                       return
+               }
+               t.pos = 0
+               t.moveCursorToPos(t.pos)
+       case keyEnd:
+               if t.pos == len(t.line) {
+                       return
+               }
+               t.pos = len(t.line)
+               t.moveCursorToPos(t.pos)
+       case keyUp:
+               entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
+               if !ok {
+                       return "", false
+               }
+               if t.historyIndex == -1 {
+                       t.historyPending = string(t.line)
+               }
+               t.historyIndex++
+               runes := []rune(entry)
+               t.setLine(runes, len(runes))
+       case keyDown:
+               switch t.historyIndex {
+               case -1:
+                       return
+               case 0:
+                       runes := []rune(t.historyPending)
+                       t.setLine(runes, len(runes))
+                       t.historyIndex--
+               default:
+                       entry, ok := t.history.NthPreviousEntry(t.historyIndex 
- 1)
+                       if ok {
+                               t.historyIndex--
+                               runes := []rune(entry)
+                               t.setLine(runes, len(runes))
+                       }
+               }
+       case keyEnter:
+               t.moveCursorToPos(len(t.line))
+               t.queue([]rune("\r\n"))
+               line = string(t.line)
+               ok = true
+               t.line = t.line[:0]
+               t.pos = 0
+               t.cursorX = 0
+               t.cursorY = 0
+               t.maxLine = 0
+       case keyDeleteWord:
+               // Delete zero or more spaces and then one or more characters.
+               t.eraseNPreviousChars(t.countToLeftWord())
+       case keyDeleteLine:
+               // Delete everything from the current cursor position to the
+               // end of line.
+               for i := t.pos; i < len(t.line); i++ {
+                       t.queue(space)
+                       t.advanceCursor(1)
+               }
+               t.line = t.line[:t.pos]
+               t.moveCursorToPos(t.pos)
+       case keyCtrlD:
+               // Erase the character under the current position.
+               // The EOF case when the line is empty is handled in
+               // readLine().
+               if t.pos < len(t.line) {
+                       t.pos++
+                       t.eraseNPreviousChars(1)
+               }
+       case keyCtrlU:
+               t.eraseNPreviousChars(t.pos)
+       case keyClearScreen:
+               // Erases the screen and moves the cursor to the home position.
+               t.queue([]rune("\x1b[2J\x1b[H"))
+               t.queue(t.prompt)
+               t.cursorX, t.cursorY = 0, 0
+               t.advanceCursor(visualLength(t.prompt))
+               t.setLine(t.line, t.pos)
+       default:
+               if t.AutoCompleteCallback != nil {
+                       prefix := string(t.line[:t.pos])
+                       suffix := string(t.line[t.pos:])
+
+                       t.lock.Unlock()
+                       newLine, newPos, completeOk := 
t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
+                       t.lock.Lock()
+
+                       if completeOk {
+                               t.setLine([]rune(newLine), 
utf8.RuneCount([]byte(newLine)[:newPos]))
+                               return
+                       }
+               }
+               if !isPrintable(key) {
+                       return
+               }
+               if len(t.line) == maxLineLength {
+                       return
+               }
+               t.addKeyToLine(key)
+       }
+       return
+}
+
+// addKeyToLine inserts the given key at the current position in the current
+// line.
+func (t *Terminal) addKeyToLine(key rune) {
+       if len(t.line) == cap(t.line) {
+               newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
+               copy(newLine, t.line)
+               t.line = newLine
+       }
+       t.line = t.line[:len(t.line)+1]
+       copy(t.line[t.pos+1:], t.line[t.pos:])
+       t.line[t.pos] = key
+       if t.echo {
+               t.writeLine(t.line[t.pos:])
+       }
+       t.pos++
+       t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) writeLine(line []rune) {
+       for len(line) != 0 {
+               remainingOnLine := t.termWidth - t.cursorX
+               todo := len(line)
+               if todo > remainingOnLine {
+                       todo = remainingOnLine
+               }
+               t.queue(line[:todo])
+               t.advanceCursor(visualLength(line[:todo]))
+               line = line[todo:]
+       }
+}
+
+func (t *Terminal) Write(buf []byte) (n int, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       if t.cursorX == 0 && t.cursorY == 0 {
+               // This is the easy case: there's nothing on the screen that we
+               // have to move out of the way.
+               return t.c.Write(buf)
+       }
+
+       // We have a prompt and possibly user input on the screen. We
+       // have to clear it first.
+       t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
+       t.cursorX = 0
+       t.clearLineToRight()
+
+       for t.cursorY > 0 {
+               t.move(1 /* up */, 0, 0, 0)
+               t.cursorY--
+               t.clearLineToRight()
+       }
+
+       if _, err = t.c.Write(t.outBuf); err != nil {
+               return
+       }
+       t.outBuf = t.outBuf[:0]
+
+       if n, err = t.c.Write(buf); err != nil {
+               return
+       }
+
+       t.writeLine(t.prompt)
+       if t.echo {
+               t.writeLine(t.line)
+       }
+
+       t.moveCursorToPos(t.pos)
+
+       if _, err = t.c.Write(t.outBuf); err != nil {
+               return
+       }
+       t.outBuf = t.outBuf[:0]
+       return
+}
+
+// ReadPassword temporarily changes the prompt and reads a password, without
+// echo, from the terminal.
+func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       oldPrompt := t.prompt
+       t.prompt = []rune(prompt)
+       t.echo = false
+
+       line, err = t.readLine()
+
+       t.prompt = oldPrompt
+       t.echo = true
+
+       return
+}
+
+// ReadLine returns a line of input from the terminal.
+func (t *Terminal) ReadLine() (line string, err error) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       return t.readLine()
+}
+
+func (t *Terminal) readLine() (line string, err error) {
+       // t.lock must be held at this point
+
+       if t.cursorX == 0 && t.cursorY == 0 {
+               t.writeLine(t.prompt)
+               t.c.Write(t.outBuf)
+               t.outBuf = t.outBuf[:0]
+       }
+
+       lineIsPasted := t.pasteActive
+
+       for {
+               rest := t.remainder
+               lineOk := false
+               for !lineOk {
+                       var key rune
+                       key, rest = bytesToKey(rest, t.pasteActive)
+                       if key == utf8.RuneError {
+                               break
+                       }
+                       if !t.pasteActive {
+                               if key == keyCtrlD {
+                                       if len(t.line) == 0 {
+                                               return "", io.EOF
+                                       }
+                               }
+                               if key == keyPasteStart {
+                                       t.pasteActive = true
+                                       if len(t.line) == 0 {
+                                               lineIsPasted = true
+                                       }
+                                       continue
+                               }
+                       } else if key == keyPasteEnd {
+                               t.pasteActive = false
+                               continue
+                       }
+                       if !t.pasteActive {
+                               lineIsPasted = false
+                       }
+                       line, lineOk = t.handleKey(key)
+               }
+               if len(rest) > 0 {
+                       n := copy(t.inBuf[:], rest)
+                       t.remainder = t.inBuf[:n]
+               } else {
+                       t.remainder = nil
+               }
+               t.c.Write(t.outBuf)
+               t.outBuf = t.outBuf[:0]
+               if lineOk {
+                       if t.echo {
+                               t.historyIndex = -1
+                               t.history.Add(line)
+                       }
+                       if lineIsPasted {
+                               err = ErrPasteIndicator
+                       }
+                       return
+               }
+
+               // t.remainder is a slice at the beginning of t.inBuf
+               // containing a partial key sequence
+               readBuf := t.inBuf[len(t.remainder):]
+               var n int
+
+               t.lock.Unlock()
+               n, err = t.c.Read(readBuf)
+               t.lock.Lock()
+
+               if err != nil {
+                       return
+               }
+
+               t.remainder = t.inBuf[:n+len(t.remainder)]
+       }
+
+       panic("unreachable") // for Go 1.0.
+}
+
+// SetPrompt sets the prompt to be used when reading subsequent lines.
+func (t *Terminal) SetPrompt(prompt string) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       t.prompt = []rune(prompt)
+}
+
+func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
+       // Move cursor to column zero at the start of the line.
+       t.move(t.cursorY, 0, t.cursorX, 0)
+       t.cursorX, t.cursorY = 0, 0
+       t.clearLineToRight()
+       for t.cursorY < numPrevLines {
+               // Move down a line
+               t.move(0, 1, 0, 0)
+               t.cursorY++
+               t.clearLineToRight()
+       }
+       // Move back to beginning.
+       t.move(t.cursorY, 0, 0, 0)
+       t.cursorX, t.cursorY = 0, 0
+
+       t.queue(t.prompt)
+       t.advanceCursor(visualLength(t.prompt))
+       t.writeLine(t.line)
+       t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) SetSize(width, height int) error {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       if width == 0 {
+               width = 1
+       }
+
+       oldWidth := t.termWidth
+       t.termWidth, t.termHeight = width, height
+
+       switch {
+       case width == oldWidth:
+               // If the width didn't change then nothing else needs to be
+               // done.
+               return nil
+       case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
+               // If there is nothing on current line and no prompt printed,
+               // just do nothing
+               return nil
+       case width < oldWidth:
+               // Some terminals (e.g. xterm) will truncate lines that were
+               // too long when shinking. Others, (e.g. gnome-terminal) will
+               // attempt to wrap them. For the former, repainting t.maxLine
+               // works great, but that behaviour goes badly wrong in the case
+               // of the latter because they have doubled every full line.
+
+               // We assume that we are working on a terminal that wraps lines
+               // and adjust the cursor position based on every previous line
+               // wrapping and turning into two. This causes the prompt on
+               // xterms to move upwards, which isn't great, but it avoids a
+               // huge mess with gnome-terminal.
+               if t.cursorX >= t.termWidth {
+                       t.cursorX = t.termWidth - 1
+               }
+               t.cursorY *= 2
+               t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
+       case width > oldWidth:
+               // If the terminal expands then our position calculations will
+               // be wrong in the future because we think the cursor is
+               // |t.pos| chars into the string, but there will be a gap at
+               // the end of any wrapped line.
+               //
+               // But the position will actually be correct until we move, so
+               // we can move back to the beginning and repaint everything.
+               t.clearAndRepaintLinePlusNPrevious(t.maxLine)
+       }
+
+       _, err := t.c.Write(t.outBuf)
+       t.outBuf = t.outBuf[:0]
+       return err
+}
+
+type pasteIndicatorError struct{}
+
+func (pasteIndicatorError) Error() string {
+       return "terminal: ErrPasteIndicator not correctly handled"
+}
+
+// ErrPasteIndicator may be returned from ReadLine as the error, in addition
+// to valid line data. It indicates that bracketed paste mode is enabled and
+// that the returned line consists only of pasted data. Programs may wish to
+// interpret pasted data more literally than typed data.
+var ErrPasteIndicator = pasteIndicatorError{}
+
+// SetBracketedPasteMode requests that the terminal bracket paste operations
+// with markers. Not all terminals support this but, if it is supported, then
+// enabling this mode will stop any autocomplete callback from running due to
+// pastes. Additionally, any lines that are completely pasted will be returned
+// from ReadLine with the error set to ErrPasteIndicator.
+func (t *Terminal) SetBracketedPasteMode(on bool) {
+       if on {
+               io.WriteString(t.c, "\x1b[?2004h")
+       } else {
+               io.WriteString(t.c, "\x1b[?2004l")
+       }
+}
+
+// stRingBuffer is a ring buffer of strings.
+type stRingBuffer struct {
+       // entries contains max elements.
+       entries []string
+       max     int
+       // head contains the index of the element most recently added to the 
ring.
+       head int
+       // size contains the number of elements in the ring.
+       size int
+}
+
+func (s *stRingBuffer) Add(a string) {
+       if s.entries == nil {
+               const defaultNumEntries = 100
+               s.entries = make([]string, defaultNumEntries)
+               s.max = defaultNumEntries
+       }
+
+       s.head = (s.head + 1) % s.max
+       s.entries[s.head] = a
+       if s.size < s.max {
+               s.size++
+       }
+}
+
+// NthPreviousEntry returns the value passed to the nth previous call to Add.
+// If n is zero then the immediately prior value is returned, if one, then the
+// next most recent, and so on. If such an element doesn't exist then ok is
+// false.
+func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
+       if n >= s.size {
+               return "", false
+       }
+       index := s.head - n
+       if index < 0 {
+               index += s.max
+       }
+       return s.entries[index], true
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go
----------------------------------------------------------------------
diff --git a/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go 
b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go
new file mode 100644
index 0000000..0763c9a
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go
@@ -0,0 +1,128 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+//     oldState, err := terminal.MakeRaw(0)
+//     if err != nil {
+//             panic(err)
+//     }
+//     defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+       "io"
+       "syscall"
+       "unsafe"
+)
+
+// State contains the state of a terminal.
+type State struct {
+       termios syscall.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       var termios syscall.Termios
+       _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
+       return err == 0
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+       var oldState State
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 
0 {
+               return nil, err
+       }
+
+       newState := oldState.termios
+       newState.Iflag &^= syscall.ISTRIP | syscall.INLCR | syscall.ICRNL | 
syscall.IGNCR | syscall.IXON | syscall.IXOFF
+       newState.Lflag &^= syscall.ECHO | syscall.ICANON | syscall.ISIG
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       return &oldState, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+       var oldState State
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlReadTermios, uintptr(unsafe.Pointer(&oldState.termios)), 0, 0, 0); err != 
0 {
+               return nil, err
+       }
+
+       return &oldState, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+       _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0)
+       return err
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+       var dimensions [4]uint16
+
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&dimensions)), 0, 0, 0); 
err != 0 {
+               return -1, -1, err
+       }
+       return int(dimensions[1]), int(dimensions[0]), nil
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       var oldState syscall.Termios
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlReadTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       newState := oldState
+       newState.Lflag &^= syscall.ECHO
+       newState.Lflag |= syscall.ICANON | syscall.ISIG
+       newState.Iflag |= syscall.ICRNL
+       if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); err != 0 {
+               return nil, err
+       }
+
+       defer func() {
+               syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), 
ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0)
+       }()
+
+       var buf [16]byte
+       var ret []byte
+       for {
+               n, err := syscall.Read(fd, buf[:])
+               if err != nil {
+                       return nil, err
+               }
+               if n == 0 {
+                       if len(ret) == 0 {
+                               return nil, io.EOF
+                       }
+                       break
+               }
+               if buf[n-1] == '\n' {
+                       n--
+               }
+               ret = append(ret, buf[:n]...)
+               if n < len(buf) {
+                       break
+               }
+       }
+
+       return ret, nil
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go 
b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go
new file mode 100644
index 0000000..9c1ffd1
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go
@@ -0,0 +1,12 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package terminal
+
+import "syscall"
+
+const ioctlReadTermios = syscall.TIOCGETA
+const ioctlWriteTermios = syscall.TIOCSETA

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go 
b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go
new file mode 100644
index 0000000..5883b22
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go
@@ -0,0 +1,11 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package terminal
+
+// These constants are declared here, rather than importing
+// them from the syscall package as some syscall packages, even
+// on linux, for example gccgo, do not declare them.
+const ioctlReadTermios = 0x5401  // syscall.TCGETS
+const ioctlWriteTermios = 0x5402 // syscall.TCSETS

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/195403f1/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_windows.go
----------------------------------------------------------------------
diff --git 
a/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_windows.go 
b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_windows.go
new file mode 100644
index 0000000..2dd6c3d
--- /dev/null
+++ b/br/Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_windows.go
@@ -0,0 +1,174 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+//     oldState, err := terminal.MakeRaw(0)
+//     if err != nil {
+//             panic(err)
+//     }
+//     defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+       "io"
+       "syscall"
+       "unsafe"
+)
+
+const (
+       enableLineInput       = 2
+       enableEchoInput       = 4
+       enableProcessedInput  = 1
+       enableWindowInput     = 8
+       enableMouseInput      = 16
+       enableInsertMode      = 32
+       enableQuickEditMode   = 64
+       enableExtendedFlags   = 128
+       enableAutoPosition    = 256
+       enableProcessedOutput = 1
+       enableWrapAtEolOutput = 2
+)
+
+var kernel32 = syscall.NewLazyDLL("kernel32.dll")
+
+var (
+       procGetConsoleMode             = kernel32.NewProc("GetConsoleMode")
+       procSetConsoleMode             = kernel32.NewProc("SetConsoleMode")
+       procGetConsoleScreenBufferInfo = 
kernel32.NewProc("GetConsoleScreenBufferInfo")
+)
+
+type (
+       short int16
+       word  uint16
+
+       coord struct {
+               x short
+               y short
+       }
+       smallRect struct {
+               left   short
+               top    short
+               right  short
+               bottom short
+       }
+       consoleScreenBufferInfo struct {
+               size              coord
+               cursorPosition    coord
+               attributes        word
+               window            smallRect
+               maximumWindowSize coord
+       }
+)
+
+type State struct {
+       mode uint32
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+       var st uint32
+       r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(unsafe.Pointer(&st)), 0)
+       return r != 0 && e == 0
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       st &^= (enableEchoInput | enableProcessedInput | enableLineInput | 
enableProcessedOutput)
+       _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(st), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       return &State{st}, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       return &State{st}, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+       _, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(state.mode), 0)
+       return err
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+       var info consoleScreenBufferInfo
+       _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, 
uintptr(fd), uintptr(unsafe.Pointer(&info)), 0)
+       if e != 0 {
+               return 0, 0, error(e)
+       }
+       return int(info.size.x), int(info.size.y), nil
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+       var st uint32
+       _, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(unsafe.Pointer(&st)), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+       old := st
+
+       st &^= (enableEchoInput)
+       st |= (enableProcessedInput | enableLineInput | enableProcessedOutput)
+       _, _, e = syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(st), 0)
+       if e != 0 {
+               return nil, error(e)
+       }
+
+       defer func() {
+               syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(fd), 
uintptr(old), 0)
+       }()
+
+       var buf [16]byte
+       var ret []byte
+       for {
+               n, err := syscall.Read(syscall.Handle(fd), buf[:])
+               if err != nil {
+                       return nil, err
+               }
+               if n == 0 {
+                       if len(ret) == 0 {
+                               return nil, io.EOF
+                       }
+                       break
+               }
+               if buf[n-1] == '\n' {
+                       n--
+               }
+               if n > 0 && buf[n-1] == '\r' {
+                       n--
+               }
+               ret = append(ret, buf[:n]...)
+               if n < len(buf) {
+                       break
+               }
+       }
+
+       return ret, nil
+}

Reply via email to