text:
cli
===

[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli)
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)

[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)
[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli)
[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli)
[![codecov](https://codecov.io/gh/urfave/cli/branch/master/graph/badge.svg)](https://codecov.io/gh/urfave/cli)

cli is a simple, fast, and fun package for building command line apps in Go. The
goal is to enable developers to write fast and distributable command line
applications in an expressive way.

<!-- toc -->

- [Overview](#overview)
- [Installation](#installation)
  * [Supported platforms](#supported-platforms)
  * [Using the `v2` branch](#using-the-v2-branch)
  * [Using `v1` releases](#using-v1-releases)
- [Getting Started](#getting-started)
- [Examples](#examples)
  * [Arguments](#arguments)
  * [Flags](#flags)
    + [Placeholder Values](#placeholder-values)
    + [Alternate Names](#alternate-names)
    + [Ordering](#ordering)
    + [Values from the Environment](#values-from-the-environment)
    + [Values from files](#values-from-files)
    + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others)
    + [Precedence](#precedence)
  * [Subcommands](#subcommands)
  * [Subcommands categories](#subcommands-categories)
  * [Exit code](#exit-code)
  * [Combining short options](#combining-short-options)
  * [Bash Completion](#bash-completion)
    + [Enabling](#enabling)
    + [Distribution](#distribution)
    + [Customization](#customization)
  * [Generated Help Text](#generated-help-text)
    + [Customization](#customization-1)
  * [Version Flag](#version-flag)
    + [Customization](#customization-2)
    + [Full API Example](#full-api-example)
- [Contribution Guidelines](#contribution-guidelines)

<!-- tocstop -->

## Overview

Command line apps are usually so tiny that there is absolutely no reason why
your code should *not* be self-documenting. Things like generating help text and
parsing command flags/options should not hinder productivity when writing a
command line app.

**This is where cli comes into play.** cli makes command line programming fun,
organized, and expressive!

## Installation

Make sure you have a working Go environment.  Go version 1.2+ is supported.  [See
the install instructions for Go](http://golang.org/doc/install.html).

To install cli, simply run:
```
$ go get github.com/urfave/cli
```

Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can
be easily used:
```
export PATH=$PATH:$GOPATH/bin
```

### Supported platforms

cli is tested against multiple versions of Go on Linux, and against the latest
released version of Go on OS X and Windows.  For full details, see
[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml).

### Using the `v2` branch

**Warning**: The `v2` branch is currently unreleased and considered unstable.

There is currently a long-lived branch named `v2` that is intended to land as
the new `master` branch once development there has settled down.  The current
`master` branch (mirrored as `v1`) is being manually merged into `v2` on
an irregular human-based schedule, but generally if one wants to "upgrade" to
`v2` *now* and accept the volatility (read: "awesomeness") that comes along with
that, please use whatever version pinning of your preference, such as via
`gopkg.in`:

```
$ go get gopkg.in/urfave/cli.v2
```

``` go
...
import (
  "gopkg.in/urfave/cli.v2" // imports as package "cli"
)
...
```

### Using `v1` releases

```
$ go get github.com/urfave/cli
```

```go
...
import (
  "github.com/urfave/cli"
)
...
```

## Getting Started

One of the philosophies behind cli is that an API should be playful and full of
discovery. So a cli app can be as little as one line of code in `main()`.

<!-- {
  "args": ["--help"],
  "output": "A new cli application"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  err := cli.NewApp().Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

This app will run and show help text, but is not very useful. Let's give an
action to execute and some help documentation:

<!-- {
  "output": "boom! I say!"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()
  app.Name = "boom"
  app.Usage = "make an explosive entrance"
  app.Action = func(c *cli.Context) error {
    fmt.Println("boom! I say!")
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Running this already gives you a ton of functionality, plus support for things
like subcommands and flags, which are covered below.

## Examples

Being a programmer can be a lonely job. Thankfully by the power of automation
that is not the case! Let's create a greeter app to fend off our demons of
loneliness!

Start by creating a directory named `greet`, and within it, add a file,
`greet.go` with the following code in it:

<!-- {
  "output": "Hello friend!"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()
  app.Name = "greet"
  app.Usage = "fight the loneliness!"
  app.Action = func(c *cli.Context) error {
    fmt.Println("Hello friend!")
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Install our command to the `$GOPATH/bin` directory:

```
$ go install
```

Finally run our new command:

```
$ greet
Hello friend!
```

cli also generates neat help text:

```
$ greet help
NAME:
    greet - fight the loneliness!

USAGE:
    greet [global options] command [command options] [arguments...]

VERSION:
    0.0.0

COMMANDS:
    help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS
    --version Shows version information
```

### Arguments

You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.:

<!-- {
  "output": "Hello \""
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Action = func(c *cli.Context) error {
    fmt.Printf("Hello %q", c.Args().Get(0))
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

### Flags

Setting and querying flags is simple.

<!-- {
  "output": "Hello Nefertiti"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang",
      Value: "english",
      Usage: "language for the greeting",
    },
  }

  app.Action = func(c *cli.Context) error {
    name := "Nefertiti"
    if c.NArg() > 0 {
      name = c.Args().Get(0)
    }
    if c.String("lang") == "spanish" {
      fmt.Println("Hola", name)
    } else {
      fmt.Println("Hello", name)
    }
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

You can also set a destination variable for a flag, to which the content will be
scanned.

<!-- {
  "output": "Hello someone"
} -->
``` go
package main

import (
  "log"
  "os"
  "fmt"

  "github.com/urfave/cli"
)

func main() {
  var language string

  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name:        "lang",
      Value:       "english",
      Usage:       "language for the greeting",
      Destination: &language,
    },
  }

  app.Action = func(c *cli.Context) error {
    name := "someone"
    if c.NArg() > 0 {
      name = c.Args()[0]
    }
    if language == "spanish" {
      fmt.Println("Hola", name)
    } else {
      fmt.Println("Hello", name)
    }
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

See full list of flags at http://godoc.org/github.com/urfave/cli

#### Placeholder Values

Sometimes it's useful to specify a flag's value within the usage string itself.
Such placeholders are indicated with back quotes.

For example this:

<!-- {
  "args": ["--help"],
  "output": "--config FILE, -c FILE"
} -->
```go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag{
    cli.StringFlag{
      Name:  "config, c",
      Usage: "Load configuration from `FILE`",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Will result in help output like:

```
--config FILE, -c FILE   Load configuration from FILE
```

Note that only the first placeholder is used. Subsequent back-quoted words will
be left as-is.

#### Alternate Names

You can set alternate (or short) names for flags by providing a comma-delimited
list for the `Name`. e.g.

<!-- {
  "args": ["--help"],
  "output": "--lang value, -l value.*language for the greeting.*default: \"english\""
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang, l",
      Value: "english",
      Usage: "language for the greeting",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

That flag can then be set with `--lang spanish` or `-l spanish`. Note that
giving two different forms of the same flag in the same command invocation is an
error.

#### Ordering

Flags for the application and commands are shown in the order they are defined.
However, it's possible to sort them from outside this library by using `FlagsByName`
or `CommandsByName` with `sort`.

For example this:

<!-- {
  "args": ["--help"],
  "output": "add a task to the list\n.*complete a task on the list\n.*\n\n.*\n.*Load configuration from FILE\n.*Language for the greeting.*"
} -->
``` go
package main

import (
  "log"
  "os"
  "sort"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang, l",
      Value: "english",
      Usage: "Language for the greeting",
    },
    cli.StringFlag{
      Name: "config, c",
      Usage: "Load configuration from `FILE`",
    },
  }

  app.Commands = []cli.Command{
    {
      Name:    "complete",
      Aliases: []string{"c"},
      Usage:   "complete a task on the list",
      Action:  func(c *cli.Context) error {
        return nil
      },
    },
    {
      Name:    "add",
      Aliases: []string{"a"},
      Usage:   "add a task to the list",
      Action:  func(c *cli.Context) error {
        return nil
      },
    },
  }

  sort.Sort(cli.FlagsByName(app.Flags))
  sort.Sort(cli.CommandsByName(app.Commands))

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Will result in help output like:

```
--config FILE, -c FILE  Load configuration from FILE
--lang value, -l value  Language for the greeting (default: "english")
```

#### Values from the Environment

You can also have the default value set from the environment via `EnvVar`.  e.g.

<!-- {
  "args": ["--help"],
  "output": "language for the greeting.*APP_LANG"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang, l",
      Value: "english",
      Usage: "language for the greeting",
      EnvVar: "APP_LANG",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

The `EnvVar` may also be given as a comma-delimited "cascade", where the first
environment variable that resolves is used as the default.

<!-- {
  "args": ["--help"],
  "output": "language for the greeting.*LEGACY_COMPAT_LANG.*APP_LANG.*LANG"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "lang, l",
      Value: "english",
      Usage: "language for the greeting",
      EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

#### Values from files

You can also have the default value set from file via `FilePath`.  e.g.

<!-- {
  "args": ["--help"],
  "output": "password for the mysql database"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Flags = []cli.Flag {
    cli.StringFlag{
      Name: "password, p",
      Usage: "password for the mysql database",
      FilePath: "/etc/mysql/password",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Note that default values set from file (e.g. `FilePath`) take precedence over
default values set from the environment (e.g. `EnvVar`).

#### Values from alternate input sources (YAML, TOML, and others)

There is a separate package altsrc that adds support for getting flag values
from other file input sources.

Currently supported input source formats:
* YAML
* JSON
* TOML

In order to get values for a flag from an alternate input source the following
code would be added to wrap an existing cli.Flag like below:

``` go
  altsrc.NewIntFlag(cli.IntFlag{Name: "test"})
```

Initialization must also occur for these flags. Below is an example initializing
getting data from a yaml file below.

``` go
  command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load"))
```

The code above will use the "load" string as a flag name to get the file name of
a yaml file from the cli.Context.  It will then use that file name to initialize
the yaml input source for any flags that are defined on that command.  As a note
the "load" flag used would also have to be defined on the command flags in order
for this code snipped to work.

Currently only YAML, JSON, and TOML files are supported but developers can add support
for other input sources by implementing the altsrc.InputSourceContext for their
given sources.

Here is a more complete sample of a command using YAML support:

<!-- {
  "args": ["test-cmd", "--help"],
  "output": "&#45-test value.*default: 0"
} -->
``` go
package notmain

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
  "github.com/urfave/cli/altsrc"
)

func main() {
  app := cli.NewApp()

  flags := []cli.Flag{
    altsrc.NewIntFlag(cli.IntFlag{Name: "test"}),
    cli.StringFlag{Name: "load"},
  }

  app.Action = func(c *cli.Context) error {
    fmt.Println("yaml ist rad")
    return nil
  }

  app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load"))
  app.Flags = flags

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

#### Precedence

The precedence for flag value sources is as follows (highest to lowest):

0. Command line flag value from user
0. Environment variable (if specified)
0. Configuration file (if specified)
0. Default defined on the flag

### Subcommands

Subcommands can be defined for a more git-like command line app.

<!-- {
  "args": ["template", "add"],
  "output": "new task template: .+"
} -->
```go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Commands = []cli.Command{
    {
      Name:    "add",
      Aliases: []string{"a"},
      Usage:   "add a task to the list",
      Action:  func(c *cli.Context) error {
        fmt.Println("added task: ", c.Args().First())
        return nil
      },
    },
    {
      Name:    "complete",
      Aliases: []string{"c"},
      Usage:   "complete a task on the list",
      Action:  func(c *cli.Context) error {
        fmt.Println("completed task: ", c.Args().First())
        return nil
      },
    },
    {
      Name:        "template",
      Aliases:     []string{"t"},
      Usage:       "options for task templates",
      Subcommands: []cli.Command{
        {
          Name:  "add",
          Usage: "add a new template",
          Action: func(c *cli.Context) error {
            fmt.Println("new task template: ", c.Args().First())
            return nil
          },
        },
        {
          Name:  "remove",
          Usage: "remove an existing template",
          Action: func(c *cli.Context) error {
            fmt.Println("removed task template: ", c.Args().First())
            return nil
          },
        },
      },
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

### Subcommands categories

For additional organization in apps that have many subcommands, you can
associate a category for each command to group them together in the help
output.

E.g.

```go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()

  app.Commands = []cli.Command{
    {
      Name: "noop",
    },
    {
      Name:     "add",
      Category: "Template actions",
    },
    {
      Name:     "remove",
      Category: "Template actions",
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Will include:

```
COMMANDS:
  noop

  Template actions:
    add
    remove
```

### Exit code

Calling `App.Run` will not automatically call `os.Exit`, which means that by
default the exit code will "fall through" to being `0`.  An explicit exit code
may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a
`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.:
<!-- {
  "error": "Ginger croutons are not in the soup"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()
  app.Flags = []cli.Flag{
    cli.BoolFlag{
      Name:  "ginger-crouton",
      Usage: "Add ginger croutons to the soup",
    },
  }
  app.Action = func(ctx *cli.Context) error {
    if !ctx.Bool("ginger-crouton") {
      return cli.NewExitError("Ginger croutons are not in the soup", 86)
    }
    return nil
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

### Combining short options

Traditional use of options using their shortnames look like this:

```
$ cmd -s -o -m "Some message"
```

Suppose you want users to be able to combine options with their shortnames. This
can be done using the `UseShortOptionHandling` bool in your app configuration,
or for individual commands by attaching it to the command configuration. For
example:

<!-- {
  "args": ["short", "-som", "Some message"],
  "output": "serve: true\noption: true\nmessage: Some message\n"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  app := cli.NewApp()
  app.UseShortOptionHandling = true
  app.Commands = []cli.Command{
    {
      Name:  "short",
      Usage: "complete a task on the list",
      Flags: []cli.Flag{
        cli.BoolFlag{Name: "serve, s"},
        cli.BoolFlag{Name: "option, o"},
        cli.StringFlag{Name: "message, m"},
      },
      Action: func(c *cli.Context) error {
        fmt.Println("serve:", c.Bool("serve"))
        fmt.Println("option:", c.Bool("option"))
        fmt.Println("message:", c.String("message"))
        return nil
      },
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

If your program has any number of bool flags such as `serve` and `option`, and
optionally one non-bool flag `message`, with the short options of `-s`, `-o`,
and `-m` respectively, setting `UseShortOptionHandling` will also support the
following syntax:

```
$ cmd -som "Some message"
```

If you enable `UseShortOptionHandling`, then you must not use any flags that
have a single leading `-` or this will result in failures. For example,
`-option` can no longer be used. Flags with two leading dashes (such as
`--options`) are still valid.

### Bash Completion

You can enable completion commands by setting the `EnableBashCompletion`
flag on the `App` object.  By default, this setting will only auto-complete to
show an app's subcommands, but you can write your own completion methods for
the App or its subcommands.

<!-- {
  "args": ["complete", "--generate-bash-completion"],
  "output": "laundry"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"}

  app := cli.NewApp()
  app.EnableBashCompletion = true
  app.Commands = []cli.Command{
    {
      Name:  "complete",
      Aliases: []string{"c"},
      Usage: "complete a task on the list",
      Action: func(c *cli.Context) error {
         fmt.Println("completed task: ", c.Args().First())
         return nil
      },
      BashComplete: func(c *cli.Context) {
        // This will complete if no args are passed
        if c.NArg() > 0 {
          return
        }
        for _, t := range tasks {
          fmt.Println(t)
        }
      },
    },
  }

  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

#### Enabling

Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while
setting the `PROG` variable to the name of your program:

`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete`

#### Distribution

Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename
it to the name of the program you wish to add autocomplete support for (or
automatically install it there if you are distributing a package). Don't forget
to source the file to make it active in the current shell.

```
sudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram>
source /etc/bash_completion.d/<myprogram>
```

Alternatively, you can just document that users should source the generic
`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set
to the name of their program (as above).

#### Customization

The default bash completion flag (`--generate-bash-completion`) is defined as
`cli.BashCompletionFlag`, and may be redefined if desired, e.g.:

<!-- {
  "args": ["--compgen"],
  "output": "wat\nhelp\nh"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  cli.BashCompletionFlag = cli.BoolFlag{
    Name:   "compgen",
    Hidden: true,
  }

  app := cli.NewApp()
  app.EnableBashCompletion = true
  app.Commands = []cli.Command{
    {
      Name: "wat",
    },
  }
  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

### Generated Help Text

The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked
by the cli internals in order to print generated help text for the app, command,
or subcommand, and break execution.

#### Customization

All of the help text generation may be customized, and at multiple levels.  The
templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and
`SubcommandHelpTemplate` which may be reassigned or augmented, and full override
is possible by assigning a compatible func to the `cli.HelpPrinter` variable,
e.g.:

<!-- {
  "output": "Ha HA.  I pwnd the help!!1"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "io"
  "os"

  "github.com/urfave/cli"
)

func main() {
  // EXAMPLE: Append to an existing template
  cli.AppHelpTemplate = fmt.Sprintf(`%s

WEBSITE: http://awesometown.example.com

SUPPORT: support@awesometown.example.com

`, cli.AppHelpTemplate)

  // EXAMPLE: Override a template
  cli.AppHelpTemplate = `NAME:
   {{.Name}} - {{.Usage}}
USAGE:
   {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
   {{if len .Authors}}
AUTHOR:
   {{range .Authors}}{{ . }}{{end}}
   {{end}}{{if .Commands}}
COMMANDS:
{{range .Commands}}{{if not .HideHelp}}   {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
GLOBAL OPTIONS:
   {{range .VisibleFlags}}{{.}}
   {{end}}{{end}}{{if .Copyright }}
COPYRIGHT:
   {{.Copyright}}
   {{end}}{{if .Version}}
VERSION:
   {{.Version}}
   {{end}}
`

  // EXAMPLE: Replace the `HelpPrinter` func
  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {
    fmt.Println("Ha HA.  I pwnd the help!!1")
  }

  err := cli.NewApp().Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

The default flag may be customized to something other than `-h/--help` by
setting `cli.HelpFlag`, e.g.:

<!-- {
  "args": ["-&#45halp"],
  "output": "haaaaalp.*HALP"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  cli.HelpFlag = cli.BoolFlag{
    Name: "halp, haaaaalp",
    Usage: "HALP",
    EnvVar: "SHOW_HALP,HALPPLZ",
  }

  err := cli.NewApp().Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

### Version Flag

The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which
is checked by the cli internals in order to print the `App.Version` via
`cli.VersionPrinter` and break execution.

#### Customization

The default flag may be customized to something other than `-v/--version` by
setting `cli.VersionFlag`, e.g.:

<!-- {
  "args": ["-&#45print-version"],
  "output": "partay version 19\\.99\\.0"
} -->
``` go
package main

import (
  "log"
  "os"

  "github.com/urfave/cli"
)

func main() {
  cli.VersionFlag = cli.BoolFlag{
    Name: "print-version, V",
    Usage: "print only the version",
  }

  app := cli.NewApp()
  app.Name = "partay"
  app.Version = "19.99.0"
  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.:

<!-- {
  "args": ["-&#45version"],
  "output": "version=19\\.99\\.0 revision=fafafaf"
} -->
``` go
package main

import (
  "fmt"
  "log"
  "os"

  "github.com/urfave/cli"
)

var (
  Revision = "fafafaf"
)

func main() {
  cli.VersionPrinter = func(c *cli.Context) {
    fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision)
  }

  app := cli.NewApp()
  app.Name = "partay"
  app.Version = "19.99.0"
  err := app.Run(os.Args)
  if err != nil {
    log.Fatal(err)
  }
}
```

#### Full API Example

**Notice**: This is a contrived (functioning) example meant strictly for API
demonstration purposes.  Use of one's imagination is encouraged.

<!-- {
  "output": "made it!\nPhew!"
} -->
``` go
package main

import (
  "errors"
  "flag"
  "fmt"
  "io"
  "io/ioutil"
  "os"
  "time"

  "github.com/urfave/cli"
)

func init() {
  cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n"
  cli.CommandHelpTemplate += "\nYMMV\n"
  cli.SubcommandHelpTemplate += "\nor something\n"

  cli.HelpFlag = cli.BoolFlag{Name: "halp"}
  cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true}
  cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"}

  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {
    fmt.Fprintf(w, "best of luck to you\n")
  }
  cli.VersionPrinter = func(c *cli.Context) {
    fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version)
  }
  cli.OsExiter = func(c int) {
    fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c)
  }
  cli.ErrWriter = ioutil.Discard
  cli.FlagStringer = func(fl cli.Flag) string {
    return fmt.Sprintf("\t\t%s", fl.GetName())
  }
}

type hexWriter struct{}

func (w *hexWriter) Write(p []byte) (int, error) {
  for _, b := range p {
    fmt.Printf("%x", b)
  }
  fmt.Printf("\n")

  return len(p), nil
}

type genericType struct{
  s string
}

func (g *genericType) Set(value string) error {
  g.s = value
  return nil
}

func (g *genericType) String() string {
  return g.s
}

func main() {
  app := cli.NewApp()
  app.Name = "kənˈtrīv"
  app.Version = "19.99.0"
  app.Compiled = time.Now()
  app.Authors = []cli.Author{
    cli.Author{
      Name:  "Example Human",
      Email: "human@example.com",
    },
  }
  app.Copyright = "(c) 1999 Serious Enterprise"
  app.HelpName = "contrive"
  app.Usage = "demonstrate available API"
  app.UsageText = "contrive - demonstrating the available API"
  app.ArgsUsage = "[args and such]"
  app.Commands = []cli.Command{
    cli.Command{
      Name:        "doo",
      Aliases:     []string{"do"},
      Category:    "motion",
      Usage:       "do the doo",
      UsageText:   "doo - does the dooing",
      Description: "no really, there is a lot of dooing to be done",
      ArgsUsage:   "[arrgh]",
      Flags: []cli.Flag{
        cli.BoolFlag{Name: "forever, forevvarr"},
      },
      Subcommands: cli.Commands{
        cli.Command{
          Name:   "wop",
          Action: wopAction,
        },
      },
      SkipFlagParsing: false,
      HideHelp:        false,
      Hidden:          false,
      HelpName:        "doo!",
      BashComplete: func(c *cli.Context) {
        fmt.Fprintf(c.App.Writer, "--better\n")
      },
      Before: func(c *cli.Context) error {
        fmt.Fprintf(c.App.Writer, "brace for impact\n")
        return nil
      },
      After: func(c *cli.Context) error {
        fmt.Fprintf(c.App.Writer, "did we lose anyone?\n")
        return nil
      },
      Action: func(c *cli.Context) error {
        c.Command.FullName()
        c.Command.HasName("wop")
        c.Command.Names()
        c.Command.VisibleFlags()
        fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n")
        if c.Bool("forever") {
          c.Command.Run(c)
        }
        return nil
      },
      OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error {
        fmt.Fprintf(c.App.Writer, "for shame\n")
        return err
      },
    },
  }
  app.Flags = []cli.Flag{
    cli.BoolFlag{Name: "fancy"},
    cli.BoolTFlag{Name: "fancier"},
    cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3},
    cli.Float64Flag{Name: "howmuch"},
    cli.GenericFlag{Name: "wat", Value: &genericType{}},
    cli.Int64Flag{Name: "longdistance"},
    cli.Int64SliceFlag{Name: "intervals"},
    cli.IntFlag{Name: "distance"},
    cli.IntSliceFlag{Name: "times"},
    cli.StringFlag{Name: "dance-move, d"},
    cli.StringSliceFlag{Name: "names, N"},
    cli.UintFlag{Name: "age"},
    cli.Uint64Flag{Name: "bigage"},
  }
  app.EnableBashCompletion = true
  app.UseShortOptionHandling = true
  app.HideHelp = false
  app.HideVersion = false
  app.BashComplete = func(c *cli.Context) {
    fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n")
  }
  app.Before = func(c *cli.Context) error {
    fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n")
    return nil
  }
  app.After = func(c *cli.Context) error {
    fmt.Fprintf(c.App.Writer, "Phew!\n")
    return nil
  }
  app.CommandNotFound = func(c *cli.Context, command string) {
    fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command)
  }
  app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error {
    if isSubcommand {
      return err
    }

    fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err)
    return nil
  }
  app.Action = func(c *cli.Context) error {
    cli.DefaultAppComplete(c)
    cli.HandleExitCoder(errors.New("not an exit coder, though"))
    cli.ShowAppHelp(c)
    cli.ShowCommandCompletions(c, "nope")
    cli.ShowCommandHelp(c, "also-nope")
    cli.ShowCompletions(c)
    cli.ShowSubcommandHelp(c)
    cli.ShowVersion(c)

    categories := c.App.Categories()
    categories.AddCommand("sounds", cli.Command{
      Name: "bloop",
    })

    for _, category := range c.App.Categories() {
      fmt.Fprintf(c.App.Writer, "%s\n", category.Name)
      fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands)
      fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands())
    }

    fmt.Printf("%#v\n", c.App.Command("doo"))
    if c.Bool("infinite") {
      c.App.Run([]string{"app", "doo", "wop"})
    }

    if c.Bool("forevar") {
      c.App.RunAsSubcommand(c)
    }
    c.App.Setup()
    fmt.Printf("%#v\n", c.App.VisibleCategories())
    fmt.Printf("%#v\n", c.App.VisibleCommands())
    fmt.Printf("%#v\n", c.App.VisibleFlags())

    fmt.Printf("%#v\n", c.Args().First())
    if len(c.Args()) > 0 {
      fmt.Printf("%#v\n", c.Args()[1])
    }
    fmt.Printf("%#v\n", c.Args().Present())
    fmt.Printf("%#v\n", c.Args().Tail())

    set := flag.NewFlagSet("contrive", 0)
    nc := cli.NewContext(c.App, set, c)

    fmt.Printf("%#v\n", nc.Args())
    fmt.Printf("%#v\n", nc.Bool("nope"))
    fmt.Printf("%#v\n", nc.BoolT("nerp"))
    fmt.Printf("%#v\n", nc.Duration("howlong"))
    fmt.Printf("%#v\n", nc.Float64("hay"))
    fmt.Printf("%#v\n", nc.Generic("bloop"))
    fmt.Printf("%#v\n", nc.Int64("bonk"))
    fmt.Printf("%#v\n", nc.Int64Slice("burnks"))
    fmt.Printf("%#v\n", nc.Int("bips"))
    fmt.Printf("%#v\n", nc.IntSlice("blups"))
    fmt.Printf("%#v\n", nc.String("snurt"))
    fmt.Printf("%#v\n", nc.StringSlice("snurkles"))
    fmt.Printf("%#v\n", nc.Uint("flub"))
    fmt.Printf("%#v\n", nc.Uint64("florb"))
    fmt.Printf("%#v\n", nc.GlobalBool("global-nope"))
    fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp"))
    fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong"))
    fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay"))
    fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop"))
    fmt.Printf("%#v\n", nc.GlobalInt("global-bips"))
    fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups"))
    fmt.Printf("%#v\n", nc.GlobalString("global-snurt"))
    fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles"))

    fmt.Printf("%#v\n", nc.FlagNames())
    fmt.Printf("%#v\n", nc.GlobalFlagNames())
    fmt.Printf("%#v\n", nc.GlobalIsSet("wat"))
    fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope"))
    fmt.Printf("%#v\n", nc.NArg())
    fmt.Printf("%#v\n", nc.NumFlags())
    fmt.Printf("%#v\n", nc.Parent())

    nc.Set("wat", "also-nope")

    ec := cli.NewExitError("ohwell", 86)
    fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode())
    fmt.Printf("made it!\n")
    return nil
  }

  if os.Getenv("HEXY") != "" {
    app.Writer = &hexWriter{}
    app.ErrWriter = &hexWriter{}
  }

  app.Metadata = map[string]interface{}{
    "layers":     "many",
    "explicable": false,
    "whatever-values": 19.99,
  }

  // ignore error so we don't exit non-zero and break gfmrun README example tests
  _ = app.Run(os.Args)
}

func wopAction(c *cli.Context) error {
  fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n")
  return nil
}
```

## Contribution Guidelines

See [./CONTRIBUTING.md](./CONTRIBUTING.md)


text:
        <profile></profile>
        <logout></logout>

<ui-view/>

redpajama_set_name: RedPajamaGithub


text:
crxdoc2dash
===========

Convert Chrome Extension Docs to Dash Docset


text:
package org.ethereum.net.submit;

import org.ethereum.core.Transaction;
import org.ethereum.core.Wallet;
import org.ethereum.manager.WorldManager;
import org.ethereum.net.server.ChannelManager;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.Callable;

import static java.lang.Thread.sleep;

/**
 * @author Roman Mandeleil
 * @since 23.05.2014
 */
public class TransactionTask implements Callable<Transaction> {

    private static final Logger logger = LoggerFactory.getLogger("net");

    private final Transaction tx;
    private final WorldManager worldManager;

    public TransactionTask(Transaction tx, WorldManager worldManager) {
        this.tx = tx;
        this.worldManager = worldManager;
    }

    @Override
    public Transaction call() throws Exception {

        try {
            logger.info("submit tx: {}", tx.toString());
            ChannelManager channelManager = worldManager.getChannelManager();
            channelManager.sendTransaction(tx);
            return tx;

        } catch (Throwable th) {
            logger.warn("Exception caught: {}", th);
        }
        return null;
    }
}


text:
<?xml version="1.0"?>
<question testSet="unseen-domains" id="WA_17b" module="WA">
  <questionText>Why does the water level in the straw go down when the bottle-and-straw thermometer is cooled, but not frozen?</questionText>
  <referenceAnswers>
    <referenceAnswer id="WA_17b-a1" text="Water contracts when the water is cooled.">
      <tokens>
        <token id="WA_17b_ra1">Water</token>
        <token id="WA_17b_ra2">contracts</token>
        <token id="WA_17b_ra3">when</token>
        <token id="WA_17b_ra4">the</token>
        <token id="WA_17b_ra5">water</token>
        <token id="WA_17b_ra6">is</token>
        <token id="WA_17b_ra7">cooled</token>
        <token id="WA_17b_ra8">.</token>
      </tokens>
      <facets>
        <facet id="WA_17b_f1" govNum="WA_17b_ra2" modNum="WA_17b_ra1" reltn="Patient" govText="contracts" modText="Water"/>
        <facet id="WA_17b_f2" govNum="WA_17b_ra7" modNum="WA_17b_ra5" reltn="Patient" govText="cooled" isAssumed="true" modText="water"/>
        <facet id="WA_17b_f3" govNum="WA_17b_ra2" modNum="WA_17b_ra6" reltn="Cause_when" childProp1Facet1="WA_17b_f1" govText="contracts" isAssumed="true" modText="is" childProp2Facet1="WA_17b_f2"/>
      </facets>
    </referenceAnswer>
  </referenceAnswers>
  <studentAnswers>
    <studentAnswer id="WA.17b.174.1" answerText="When the water gets cold it contracts thereby lowering the water level in the straw." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.176.1" answerText="The water is expanding. The water molecules are getting colder so they all huddle up into a ball and go to the bottom." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Self-Contra"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.182.1" answerText="This happens because cold water is more dense than hot water or regular water so the water volume starts to go down or starts to contract." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.187.1" answerText="Because cold water has less density so it goes up." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.189.1" answerText="Because cold water shrinks and is less dense so it goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.191.1" answerText="It happens because the water cools down so the water goes down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.195.1" answerText="The cold water pushes the water level down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.206.1" answerText="Since the water is cooled the water gets compacted causing the water level to contract." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.207.1" answerText="Cold water is denser so it goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.208.1" answerText="Because it is getting cold inside but is going to go down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.209.1" answerText="When water is cooled the water level goes down because of the density. More dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.211.1" answerText="It happens because cold water contracts when it is cooled." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.214.1" answerText="This happens because the water takes up more space." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Infr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.215.1" answerText="Cold water is cold and it would sink in a regular thermometer." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.216.1" answerText="Because the cold water makes it less dense." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.222.1" answerText="Density." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.224.1" answerText="It goes down because cold water stuff goes down. And hot water does not go down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.225.1" answerText="Water is contracting." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.226.1" answerText="Because it contracts when it is cold." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.227.1" answerText="Cooler water drops or contracts because it is denser than tap water. Same here." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.232.1" answerText="The water level goes down because it is a real type of thermometer and on a real one if something cold the water level goes down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Diff-Arg"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.241.1" answerText="Because the water is denser so it forces it to contract." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.243.1" answerText="It happens by it being frozen." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.245.1" answerText="This happens because when water is cooled it contracts and gets less dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.246.1" answerText="Because the water contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.250.1" answerText="This happens because where water is cooled it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.252.1" answerText="Because cold water is less dense than hot water." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.258.1" answerText="The reason this happened was because it is so cold that the water expanded." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.259.1" answerText="Because it was placed in ice or in cold water to make it go up." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.261.1" answerText="The water is cooled so it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.280.1" answerText="Because when you cool it down the level it used to be will be lower." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.281.1" answerText="Because it is put in cold water and not hot so it will go down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Diff-Arg"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.284.1" answerText="The thermometer is less dense." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Infr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.287.1" answerText="When it in cold water it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.288.1" answerText="When water is cool it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.291.1" answerText="Because the cold always sinks down to the bottom so when you put it in it contracts down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.296.1" answerText="And whenever it is cold the temperature goes down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.299.1" answerText="Because when water is cold it goes to the bottom." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.346.1" answerText="The water level goes down because it is denser and means it sinks." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.348.1" answerText="Because cold water is denser than the hot water." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.349.1" answerText="The water contracted." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.351.1" answerText="Because is cold water." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.356.1" answerText="Because when the cold or hot water goes down." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Self-Contra"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.359.1" answerText="Because the cold water is denser." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.362.1" answerText="Because the water is dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.364.1" answerText="The water contracts because it is so cold it will make the temperature go down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.365.1" answerText="Because cold water sinks to the bottom, it contracts meaning it is denser." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.366.1" answerText="Because cold water is dense the water goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.368.1" answerText="Because cold water is denser than hot and it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.370.1" answerText="When cold water gets something dense it goes down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.424.1" answerText="When water gets colder it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.425.1" answerText="Because cold water is less dense." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.426.1" answerText="Because cold water is denser than room temperature water. The water contracts when the thermometer is placed in cold water." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.427.1" answerText="Because it is cool and cool water is more dense so it goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.428.1" answerText="Because coldness sinks, more dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.429.1" answerText="Cold water contracts because of density." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.431.1" answerText="Because the cold water is more dense so it goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.433.1" answerText="Because cold water is more dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.435.1" answerText="The water contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.437.1" answerText="Water contracts when cooled." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.456.1" answerText="Because cold water is denser than room temperature." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.457.1" answerText="Cold water contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.458.1" answerText="The cold water makes the water contract." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.459.1" answerText="The cold water goes down because it has to contract." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.463.1" answerText="The water is less dense than the regular water and that makes it to go down." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.467.1" answerText="When water gets colder it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.468.1" answerText="The water level went down because it is less dense." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Infr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.469.1" answerText="Because cooled water sinks." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.486.1" answerText="Because cold water makes it go down and hot water makes it go up and cool water stays the same." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.487.1" answerText="Because the molecules get closer together and take up less room." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.488.1" answerText="The molecules come back together so it goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.489.1" answerText="When the water gets cold the molecules want to get warmer." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.492.1" answerText="It goes down because cold molecules contract or come together." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.493.1" answerText="The molecules want to stay together for warmth." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.494.1" answerText="It cools it down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.497.1" answerText="Because cold water is more." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.498.1" answerText="Because cold is the opposite of hot so it will go down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.500.1" answerText="The water becomes more dense so it bunches up." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.501.1" answerText="Because when the molecules are hot they jump around but when they cool down they compact together and the water goes down." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.503.1" answerText="Because the coolness causes the cool water to go down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Diff-Arg"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.507.1" answerText="Because when the temperature cools it goes down because that is what a regular thermometer would do." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.508.1" answerText="The cold water wants to get away from the warmer molecules so the water goes down." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Diff-Arg"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.521.1" answerText="Because the water is so cold it goes up." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Infr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.522.1" answerText="Because cold water is denser than room temperature water." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.532.1" answerText="Because the water is more denser the hot water." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.558.1" answerText="The water contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.566.1" answerText="The cold water is less denser, it is getting more dense." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Self-Contra"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.569.1" answerText="When the water in the bottle is cooled it goes down because it has no other place to go which means it is more dense which is contracting." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.572.1" answerText="Because it is cold water." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.591.1" answerText="The cooler water is dense." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.593.1" answerText="Because I experimented it." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.596.1" answerText="Because cold water is less dense than hot water. When a substance is hot very dense, it expands." accuracy="contradictory">
      <facetEntailment facetID="WA_17b_f1" label="Contra-Expr"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.601.1" answerText="Because the water is down because the water is cold." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Diff-Arg"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.609.1" answerText="Because the water is getting denser and it needs to retract to get denser." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Inferred"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.612.1" answerText="Because it is cooler." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.631.1" answerText="Because when it gets cold the cold water wants to sink so it pushes to the bottom." accuracy="irrelevant">
      <facetEntailment facetID="WA_17b_f1" label="Unaddressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.632.1" answerText="Because the atoms squeeze together and takes up less space." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.638.1" answerText="Because it contracts water and goes down to the bottom of the bottle." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.639.1" answerText="Because it contracts." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Assumed"/>
      <facetEntailment facetID="WA_17b_f3" label="Assumed"/>
    </studentAnswer>
    <studentAnswer id="WA.17b.640.1" answerText="Because the water is dense so it needs a little less space." accuracy="correct">
      <facetEntailment facetID="WA_17b_f1" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f2" label="Expressed"/>
      <facetEntailment facetID="WA_17b_f3" label="Expressed"/>
    </studentAnswer>
  </studentAnswers>
</question>


text:
void SbDrmGenerateSessionUpdateRequest(SbDrmSystem drm_system,
                                       int ticket,
                                       const char* type,
                                       const void* initialization_data,
                                       int initialization_data_size) {}


text:
from __future__ import annotations

import contextlib
import io
import json
import runpy
from unittest import mock

import pytest
from freezegun import freeze_time

class TestGetEksToken:
    @mock.patch('airflow.providers.amazon.aws.hooks.eks.EksHook')
    @freeze_time("1995-02-14")
    @pytest.mark.parametrize(
        "args, expected_aws_conn_id, expected_region_name",
        [
            [
                [
                    'airflow.providers.amazon.aws.utils.eks_get_token',
                    '--region-name',
                    'test-region',
                    '--aws-conn-id',
                    'test-id',
                    '--cluster-name',
                    'test-cluster',
                ],
                'test-id',
                'test-region',
            ],
            [
                [
                    'airflow.providers.amazon.aws.utils.eks_get_token',
                    '--region-name',
                    'test-region',
                    '--cluster-name',
                    'test-cluster',
                ],
                None,
                'test-region',
            ],
            [
                ['airflow.providers.amazon.aws.utils.eks_get_token', '--cluster-name', 'test-cluster'],
                None,
                None,
            ],
        ],
    )
    def test_run(self, mock_eks_hook, args, expected_aws_conn_id, expected_region_name):
        (
            mock_eks_hook.return_value.fetch_access_token_for_cluster.return_value
        ) = 'k8s-aws-v1.aHR0cDovL2V4YW1wbGUuY29t'

        with mock.patch('sys.argv', args), contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
            runpy.run_module('airflow.providers.amazon.aws.utils.eks_get_token', run_name='__main__')

        assert {
            'apiVersion': 'client.authentication.k8s.io/v1alpha1',
            'kind': 'ExecCredential',
            'spec': {},
            'status': {
                'expirationTimestamp': '1995-02-14T00:14:00Z',
                'token': 'k8s-aws-v1.aHR0cDovL2V4YW1wbGUuY29t',
            },
        } == json.loads(temp_stdout.getvalue())
        mock_eks_hook.assert_called_once_with(
            aws_conn_id=expected_aws_conn_id, region_name=expected_region_name
        )
        mock_eks_hook.return_value.fetch_access_token_for_cluster.assert_called_once_with('test-cluster')


text:
<?php

/**
 * XmlConnect Images model
 *
 * @category    Mage
 * @package     Mage_XmlConnect
 * @author      Magento Core Team <core@magentocommerce.com>
 */
class Mage_XmlConnect_Model_ImageAction extends Mage_Core_Model_Abstract
{

    /**
     * Default image action configuration category
     */
    const IMAGE_ACTION_CATEGORY_DEFAULT = 'image_action';

    /**
     * CMS action type
     */
    const ACTION_TYPE_CMS = 'cms';

    /**
     * Product action type
     */
    const ACTION_TYPE_PRODUCT = 'product';

    /**
     * Category action type
     */
    const ACTION_TYPE_CATEGORY = 'category';

    /**
     * Image action types
     *
     * @var array
     */
    protected $_imageActionTypes = array(self::ACTION_TYPE_CMS, self::ACTION_TYPE_PRODUCT, self::ACTION_TYPE_CATEGORY);

    /**
     * Required image action fields separated by action type
     *
     * @var array
     */
    protected $_requiredImageActionFields = array(
        self::ACTION_TYPE_CMS => array('action_type','image_id', 'entity_action', 'entity_name'),
        self::ACTION_TYPE_PRODUCT => array('action_type', 'image_id', 'entity_action', 'entity_name'),
        self::ACTION_TYPE_CATEGORY => array('action_type', 'image_id', 'entity_action', 'entity_name')
    );

    /**
     * Image action config path template
     *
     * @var string
     */
    protected $_imageActionConfigPathTemplate = 'image_id/%d/app_id/%d';

    /**
     * Image action data to save
     *
     * @var array
     */
    protected $_currentImageActionData;

    /**
     * Application model
     *
     * @var Mage_XmlConnect_Model_Application
     */
    protected $_applicationModel;

    /**
     * Initialize model
     *
     * @param null|Mage_XmlConnect_Model_Application $applicationModel
     */
    public function __construct($applicationModel = null)
    {
        $this->_setApplicationModel($applicationModel);
    }

    /**
     * Set application model
     *
     * @param Mage_XmlConnect_Model_Application $applicationModel
     * @return Mage_XmlConnect_Model_Device_Abstract
     */
    protected function _setApplicationModel($applicationModel = null)
    {
        if ($applicationModel instanceof Mage_XmlConnect_Model_Application) {
            $this->_applicationModel = $applicationModel;
        } else {
            $this->_applicationModel = Mage::helper('xmlconnect')->getApplication();
        }
        return $this;
    }

    /**
     * Get application model
     *
     * @return Mage_XmlConnect_Model_Application
     */
    protected function _getApplicationModel()
    {
        if (null === $this->_applicationModel) {
            $this->setApplicationModel(Mage::helper('xmlconnect')->getApplication());
        }
        return $this->_applicationModel;
    }

    /**
     * Save image action info
     *
     * @param array $imageData
     * @param string $category
     * @return Mage_XmlConnect_Model_Device_Abstract
     */
    public function saveImageAction($imageData, $category = self::IMAGE_ACTION_CATEGORY_DEFAULT)
    {
        $this->_setCurrentImageActionData(null)->_validateImagePrepareActionData($imageData);
        $actionData = $this->getCurrentImageActionData();
        $configPath = $this->_createImageActionConfigPath($actionData['image_id']);
        $this->_getApplicationModel()->getConfigModel()->saveConfig($this->_getApplicationModel()->getId(),
            array($configPath => serialize($actionData)), $category);
        return $this;
    }

    /**
     * Validate image action by action type and prepare data for save
     *
     * @throws Mage_Core_Exception
     * @param array $imageData
     * @return bool
     */
    protected  function _validateImagePrepareActionData($imageData)
    {
        if (isset($imageData['action_type']) && in_array($imageData['action_type'], $this->_imageActionTypes)) {
            if ($imageData['action_type'] == self::ACTION_TYPE_CMS) {
                $imageData['entity_name'] = Mage::getModel('cms/page')->load($imageData['entity_action'])->getTitle();
            }
            $result = array();
            foreach ($this->_requiredImageActionFields[$imageData['action_type']] as $requiredField) {
                if (empty($imageData[$requiredField])) {
                    Mage::throwException(Mage::helper('xmlconnect')->__('%s fields is required', $requiredField));
                }
                $result[$requiredField] = $imageData[$requiredField];
            }
            $this->_setCurrentImageActionData($result);
            return true;
        } else {
            Mage::throwException(Mage::helper('xmlconnect')->__('Action type does\'t recognized'));
            return false;
        }
    }

    /**
     * Create image action config path
     *
     * @param int $imageId
     * @return string
     */
    protected function _createImageActionConfigPath($imageId)
    {
        return sprintf($this->_imageActionConfigPathTemplate, $imageId, $this->_getApplicationModel()->getId());
    }

    /**
     * Set image action data
     *
     * @param mixed $data
     * @return Mage_XmlConnect_Model_Device_Abstract
     */
    protected function _setCurrentImageActionData($data)
    {
        $this->_currentImageActionData = $data;
        return $this;
    }

    /**
     * Action data for currently saved image
     *
     * @return array
     */
    public function getCurrentImageActionData()
    {
        return $this->_currentImageActionData;
    }

    /**
     * Get image action data
     *
     * @param int $imageId
     * @return mixed
     */
    public function getImageActionData($imageId)
    {
        $imageActionConfigData = $this->_getApplicationModel()->getConfigModel()->loadScalarValue(
            $this->_getApplicationModel()->getId(),
            self::IMAGE_ACTION_CATEGORY_DEFAULT,
            $this->_createImageActionConfigPath($imageId)
        );
        $imageActionData = $imageActionConfigData ? unserialize($imageActionConfigData) : $imageActionConfigData;
        return $this->_checkImageActionData($imageActionData);
    }

    /**
     * Check image action data
     *
     * @throws Mage_Core_Exception
     * @param array $imageActionData
     * @return mixed
     */
    protected function _checkImageActionData($imageActionData)
    {
        if (empty($imageActionData)) {
            return;
        }
        $storeId = Mage::app()->getStore()->getId();
        switch ($imageActionData['action_type']) {
            case self::ACTION_TYPE_CMS:
                $page = Mage::getModel('cms/page')->setStoreId($storeId)
                    ->load($imageActionData['entity_action'], 'identifier');
                if (!$page->getId() && $storeId == Mage_Core_Model_App::ADMIN_STORE_ID) {
                    $this->deleteAction($imageActionData['image_id']);
                    return;
                } elseif ($page->getId()) {
                    $imageActionData['entity_name'] = $page->getTitle();
                }
            break;
            case self::ACTION_TYPE_CATEGORY:
                $category = Mage::getModel('catalog/category')->load($imageActionData['entity_action']);
                if (!$category->getId()) {
                    $this->deleteAction($imageActionData['image_id']);
                    return;
                } elseif ($category->getIsActive() == 0 && Mage_Core_Model_App::ADMIN_STORE_ID != $storeId) {
                    return;
                } else {
                    $imageActionData['entity_name'] = $category->getName();
                }
            break;
            case self::ACTION_TYPE_PRODUCT:
                $product = Mage::getModel('catalog/product')->load($imageActionData['entity_action']);
                if (!$product->getId()) {
                    $this->deleteAction($imageActionData['image_id']);
                    return;
                } elseif ($product->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_DISABLED
                    && Mage_Core_Model_App::ADMIN_STORE_ID != $storeId
                ) {
                    return;
                } else {
                    $imageActionData['entity_name'] = $product->getName();
                }
            break;
            default:
                Mage::throwException($this->__('Action type doesn\'t recognized.'));
                break;
        }
        return $imageActionData;
    }

    /**
     * Delete Image action
     *
     * @param int $imageId
     * @return Mage_XmlConnect_Model_ImageAction
     */
    public function deleteAction($imageId)
    {
        $this->_getApplicationModel()->getConfigModel()->deleteConfig($this->_getApplicationModel()->getId(),
            self::IMAGE_ACTION_CATEGORY_DEFAULT, $this->_createImageActionConfigPath($imageId));
        return $this;
    }

    /**
     * Save images new order
     *
     * @param array $imagesOrderData
     * @param string $type
     * @return Mage_XmlConnect_Model_ImageAction
     */
    public function saveImageOrder($imagesOrderData, $type)
    {
        if (empty($imagesOrderData)) {
            return $this;
        }
        /** @var $imagesModel Mage_XmlConnect_Model_Images */
        $imagesModel = Mage::getModel('xmlconnect/images');
        foreach ($imagesOrderData as $imageId => $imageOrder) {
            $imagesModel->load($imageId);
            if ($imagesModel->getImageId()) {
                $imagesModel->setOrder($imageOrder)->save();
            }
        }
        return $this;
    }
}


text:
Pycom documentation and references
========================================

.. toctree::

    pycom_esp32/getstarted
    pycom_esp32/toolsandfeatures
    pycom_esp32/tutorial/index
    library/index
    pycom_esp32/datasheets
    pycom_esp32/docshowto
    license

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`


text:
let assert = require('assert');

let wepy = require('../../lib/wepy.js').default;

module.exports = class Com extends wepy.component {
    constructor () {
        super();
        this.data = {
            'a': 1
        };
        this.methods = {
            'tap': function (evt) {
                assert.strictEqual(evt.name, 'test_com_tap', 'com tap triggered');
            },
            'testInvoke': function (arg1, arg2, evt) {
                assert.strictEqual(arguments.length, 3, 'testInvoke argument number');
                assert.strictEqual(arg1, 'arg1', 'testInvoke argument 1');
                assert.strictEqual(arg2, 'arg2', 'testInvoke argument 2');
                assert.strictEqual(evt.type, 'invoke', 'testInvoke event type');
            }
        };

        this.props = {
            'comaaprop': {
                twoWay: true
            }
        };
    }

    customMethod () {

    }

    testCustomInvoke (arg1, arg2) {
        assert.strictEqual(arguments.length, 2, 'testCustomInvoke argument number');
        assert.strictEqual(arg1, 'arg1', 'testCustomInvoke argument 1');
        assert.strictEqual(arg2, 'arg2', 'testCustomInvoke argument 2');
    }
}


text:
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (C) 2012 United States Government as represented by the Administrator of the
  ~ National Aeronautics and Space Administration.
  ~ All Rights Reserved.
  -->

<!--$Id: USGSDigitalOrthoLayer.xml 1171 2013-02-11 21:45:02Z dcollins $-->
<Layer version="1" layerType="TiledImageLayer">
    <DisplayName>USGS Digital Ortho</DisplayName>
    <Service serviceName="WWTileService">
        <URL>http://worldwind25.arc.nasa.gov/tile/tile.aspx</URL>
    </Service>
    <!-- day month year hours:minutes:seconds timezone -->
    <LastUpdate>19 09 2009 04:10:00 GMT</LastUpdate>
    <DatasetName>101</DatasetName>
    <DataCacheName>Earth/USGS Digital Ortho</DataCacheName>
    <FormatSuffix>.jpg</FormatSuffix>
    <NumLevels count="13" numEmpty="5"/>
    <TileOrigin>
        <LatLon units="degrees" latitude="-90" longitude="-180"/>
    </TileOrigin>
    <LevelZeroTileDelta>
        <LatLon units="degrees" latitude="25.6" longitude="25.6"/>
    </LevelZeroTileDelta>
    <TileSize>
        <Dimension width="512" height="512"/>
    </TileSize>
    <Sector>
        <SouthWest>
            <LatLon units="degrees" latitude="17.84" longitude="-168.67"/>
        </SouthWest>
        <NorthEast>
            <LatLon units="degrees" latitude="71.55" longitude="-65.15"/>
        </NorthEast>
    </Sector>
    <ActiveAltitudes max="7e3"/>
</Layer>


text:
class TransformerAdapter(object):
    """
    Abstraction over any transformer.
    It exposes a single data processing method, which will output the result of
    fit_transforming the data the first time it's called.
    All consecutive calls will simply transform and then return the data.
    """
    def __init__(self, transformer):
        self.__transformer = transformer
        self.__is_fitted = False

    def transform(self, data):
        if self.__is_fitted:
            return self.__transformer.transform(data)
        else:
            self.__is_fitted = True
            return self.__transformer.fit_transform(data)

    def is_fitted(self):
        return self.__is_fitted


text:
package summer.aop.filter;

import summer.aop.AopChain;
import summer.aop.AopFilter;
import summer.basic.order.Order;
import summer.log.Logger;
import summer.util.Log;

/**
 * @author li
 * @version 1 (2015年10月11日 下午2:34:06)
 * @since Java7
 */
@Order(Integer.MIN_VALUE + 2)
public class LoggerAopFilter implements AopFilter {
    private static final Logger log = Log.slf4j();

    public void doFilter(AopChain chain) {
        long start = System.nanoTime();
        chain.doFilter();
        log.info("耗时 {} nano seconds, {}", (System.nanoTime() - start), chain);
    }
}


text:
<?php
/**
 * Created by PhpStorm.
 * User: janhuang
 * Date: 16/2/19
 * Time: 下午6:06
 * Github: https://www.github.com/janhuang
 * Coding: https://www.coding.net/janhuang
 * SegmentFault: http://segmentfault.com/u/janhuang
 * Blog: http://segmentfault.com/blog/janhuang
 * Gmail: bboyjanhuang@gmail.com
 * WebSite: http://www.janhuang.me
 */

namespace FastD\Generator\Factory;

/**
 * Class Generate
 *
 * @package FastD\Generator\Factory
 */
abstract class Generate
{
    /**
     * @var
     */
    protected $name;

    /**
     * @var string
     */
    protected $type;

    /**
     * @var string
     */
    protected $desc;

    /**
     * Generate constructor.
     * @param $name
     * @param string $type
     * @param string $desc
     */
    public function __construct($name, $type = 'mixed', $desc = '')
    {
        if (null !== $name) {

        }
        $this->name = $name;

        $this->type = $type;

        $this->desc = $desc;
    }

    /**
     * @return string
     */
    public function getDesc()
    {
        return $this->desc;
    }

    /**
     * @return string
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return string
     */
    abstract public function generate();

    /**
     * @return string
     */
    abstract public function skeleton();

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->generate();
    }
}


text:
define({
  "id": "Tunnus",
  "state": "Oletusarvon mukaan koordinaatit näytetään nykyisen kartan koordinaattijärjestelmässä. Jos haluat noutaa koordinaatit toisesta koordinaattijärjestelmästä, sinun on lisättävä ne ja määritettävä asianmukaiset transformaatiot.",
  "outputUnit": "Tulosyksikkö",
  "wkid": "Tulosaineiston WKID",
  "label": "Anna koordinaattijärjestelmän nimi",
  "transformationWkid": "Transformaatio WKID",
  "transformationLabel": "Transformaation tunnusteksti",
  "transformForward": "Transformoi eteenpäin",
  "actions": "Toimet",
  "warning": "Anna kelvollinen koordinaattijärjestelmän WKID!",
  "tfWarning": "Anna kelvollinen datumin transformaatio WKID!",
  "spinnerLabel": "Pyöristä koordinaatit: ",
  "decimalPlace": "desimaalit",
  "separator": "Näytä tuhaterottimet",
  "getVersionError": "Geometriapalvelun versiotietoja ei voi noutaa",
  "add": "Lisää tulosaineiston koordinaattijärjestelmä",
  "edit": "Muokkaa koordinaattijärjestelmää",
  "output": "Tulosaineiston koordinaattijärjestelmä",
  "cName": "Koordinaattijärjestelmän nimi",
  "units": "Näyttöyksiköt: ",
  "datum": "Datumin transformaatio",
  "tName": "Transformaation nimi",
  "tWKIDPlaceHolder": "Transformaation WKID",
  "forward": "Käytä transformaatiota eteenpäin",
  "ok": "OK",
  "cancel": "Peruuta",
  "olderVersion": "Geometriapalvelu ei tue transformaatiota",
  "REPEATING_ERROR": " Koordinaattijärjestelmä on syöteluettelossa.",
  "Default": "Oletus",
  "Inches": "tuumaa",
  "Foot": "Jalkaa",
  "Yards": "Jaardia",
  "Miles": "Mailia",
  "Nautical_Miles": "Meripeninkulmaa",
  "Millimeters": "millimetriä",
  "Centimeters": "senttimetriä",
  "Meter": "Metriä",
  "Kilometers": "Kilometriä",
  "Decimeters": "desimetriä",
  "Decimal_Degrees": "desimaaliastetta",
  "Degree_Minutes_Seconds": "astetta, minuuttia, sekuntia",
  "MGRS": "MGRS",
  "USNG": "USNG",
  "displayOrderLonLatTips": "Koordinaattien näyttöjärjestys:",
  "lonLatTips": "Pituusaste/leveysaste (X, Y)",
  "latLonTips": "Leveysaste/pituusaste(Y, X)"
});


text:
/*!
 * \brief message requesting an exchange of neighborhood
 * \param inview the identifier of the inview
 * \param outview the identifier of the outview
 * \param protocol the protocol that creates the message
 */
module.exports.MExchange = function(inview, outview, protocol){
    return {protocol: protocol || 'spray-wrtc',
            type: 'MExchange',
            inview: inview,
            outview: outview};
};


text:
export var ImgLoader = (function () {
    function ImgLoader() {
        this.imgs = [];
    }
    ImgLoader.prototype.load = function (src, useCache, callback) {
        var _this = this;
        // see if we already have image data for this src
        var img = this.imgs.find(function (i) { return i.src === src; });
        if (img && img.datauri && useCache) {
            // we found image data, and it's cool if we use the cache
            // so let's respond with the cached data
            callback(200, null, img.datauri);
            return;
        }
        // so no cached image data, so we'll
        // need to do a new http request
        if (img && img.xhr && img.xhr.readyState !== 4) {
            // looks like there's already an active http request going on
            // for this same source, so let's just add another listener
            img.xhr.addEventListener('load', function (xhrEvent) {
                var target = xhrEvent.target;
                var contentType = target.getResponseHeader('Content-Type');
                onXhrLoad(callback, target.status, contentType, target.response, useCache, img, _this.imgs);
            });
            img.xhr.addEventListener('error', function (xhrErrorEvent) {
                onXhrError(callback, img, xhrErrorEvent);
            });
            return;
        }
        if (!img) {
            // no image data yet, so let's create it
            img = { src: src, len: 0 };
            this.imgs.push(img);
        }
        // ok, let's do a full request for the image
        img.xhr = new XMLHttpRequest();
        img.xhr.open('GET', src, true);
        img.xhr.responseType = 'arraybuffer';
        // add the listeners if it loaded or errored
        img.xhr.addEventListener('load', function (xhrEvent) {
            var target = xhrEvent.target;
            var contentType = target.getResponseHeader('Content-Type');
            onXhrLoad(callback, target.status, contentType, target.response, useCache, img, _this.imgs);
        });
        img.xhr.addEventListener('error', function (xhrErrorEvent) {
            onXhrError(callback, img, xhrErrorEvent);
        });
        // awesome, let's kick off the request
        img.xhr.send();
    };
    ImgLoader.prototype.abort = function (src) {
        var img = this.imgs.find(function (i) { return i.src === src; });
        if (img && img.xhr && img.xhr.readyState !== 4) {
            // we found the image data and there's an active
            // http request, so let's abort the request
            img.xhr.abort();
            img.xhr = null;
        }
    };
    return ImgLoader;
}());
export function onXhrLoad(callback, status, contentType, responseData, useCache, img, imgs) {
    if (!callback) {
        return null;
    }
    // the http request has been loaded
    // create a rsp object to send back to the main thread
    var datauri = null;
    if (status === 200) {
        // success!!
        // now let's convert the response arraybuffer data into a datauri
        datauri = getDataUri(contentType, responseData);
        if (useCache) {
            // if the image was successfully downloaded
            // and this image is allowed to be cached
            // then let's add it to our image data for later use
            img.datauri = datauri;
            img.len = datauri.length;
            cleanCache(imgs, CACHE_LIMIT);
        }
    }
    // fire the callback with what we've learned today
    callback(status, null, datauri);
}
export function cleanCache(imgs, cacheLimit) {
    // let's loop through all our cached data and if we go
    // over our limit then let's clean it out a bit
    // oldest data should go first
    var cacheSize = 0;
    for (var i = imgs.length - 1; i >= 0; i--) {
        cacheSize += imgs[i].len;
        if (cacheSize > cacheLimit) {
            console.debug("img-loader, clear cache");
            imgs.splice(0, i + 1);
            break;
        }
    }
}
function onXhrError(callback, imgData, err) {
    // darn, we got an error!
    callback && callback(0, (err.message || ''), null);
    imgData.xhr = null;
}
function getDataUri(contentType, arrayBuffer) {
    // take arraybuffer and content type and turn it into
    // a datauri string that can be used by <img>
    var rtn = ['data:' + contentType + ';base64,'];
    var bytes = new Uint8Array(arrayBuffer);
    var byteLength = bytes.byteLength;
    var byteRemainder = byteLength % 3;
    var mainLength = byteLength - byteRemainder;
    var i, a, b, c, d, chunk;
    for (i = 0; i < mainLength; i = i + 3) {
        chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
        a = (chunk & 16515072) >> 18;
        b = (chunk & 258048) >> 12;
        c = (chunk & 4032) >> 6;
        d = chunk & 63;
        rtn.push(ENCODINGS[a] + ENCODINGS[b] + ENCODINGS[c] + ENCODINGS[d]);
    }
    if (byteRemainder === 1) {
        chunk = bytes[mainLength];
        a = (chunk & 252) >> 2;
        b = (chunk & 3) << 4;
        rtn.push(ENCODINGS[a] + ENCODINGS[b] + '==');
    }
    else if (byteRemainder === 2) {
        chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];
        a = (chunk & 64512) >> 10;
        b = (chunk & 1008) >> 4;
        c = (chunk & 15) << 2;
        rtn.push(ENCODINGS[a] + ENCODINGS[b] + ENCODINGS[c] + '=');
    }
    return rtn.join('');
}
// used by the setData function
var ENCODINGS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var CACHE_LIMIT = 1381855 * 20;
//# sourceMappingURL=img-loader.js.map