// Code generated by go generate. DO NOT EDIT.

package cue

import (
	"bytes"
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"encoding/csv"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"html"
	"io"
	"math"
	"math/big"
	"math/bits"
	"path"
	"regexp"
	"strconv"
	"strings"
	"text/tabwriter"
	"text/template"
	"unicode"

	"cuelang.org/go/cue/parser"
	"cuelang.org/go/cue/token"
	"cuelang.org/go/internal/third_party/yaml"
	goyaml "github.com/ghodss/yaml"
)

func init() {
	initBuiltins(builtinPackages)
}

var _ io.Reader

var split = path.Split

var pathClean = path.Clean

var pathExt = path.Ext

var pathBase = path.Base

var pathIsAbs = path.IsAbs

var pathDir = path.Dir

var builtinPackages = map[string][]*builtin{
	"": []*builtin{{}},
	"crypto/md5": []*builtin{{
		Name:  "Size",
		Const: intFromGo("16"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return md5.Sum(data)
			}()
		},
	}},
	"crypto/sha1": []*builtin{{
		Name:  "Size",
		Const: intFromGo("20"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha1.Sum(data)
			}()
		},
	}},
	"crypto/sha256": []*builtin{{
		Name:  "Size",
		Const: intFromGo("32"),
	}, {
		Name:  "Size224",
		Const: intFromGo("28"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum256",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha256.Sum256(data)
			}()
		},
	}, {
		Name:   "Sum224",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha256.Sum224(data)
			}()
		},
	}},
	"crypto/sha512": []*builtin{{
		Name:  "Size",
		Const: intFromGo("64"),
	}, {
		Name:  "Size224",
		Const: intFromGo("28"),
	}, {
		Name:  "Size256",
		Const: intFromGo("32"),
	}, {
		Name:  "Size384",
		Const: intFromGo("48"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("128"),
	}, {
		Name:   "Sum512",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512(data)
			}()
		},
	}, {
		Name:   "Sum384",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum384(data)
			}()
		},
	}, {
		Name:   "Sum512_224",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512_224(data)
			}()
		},
	}, {
		Name:   "Sum512_256",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512_256(data)
			}()
		},
	}},
	"encoding/csv": []*builtin{{
		Name:   "Encode",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			x := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				buf := &bytes.Buffer{}
				w := csv.NewWriter(buf)
				iter, err := x.List()
				if err != nil {
					return "", err
				}
				for iter.Next() {
					row, err := iter.Value().List()
					if err != nil {
						return "", err
					}
					a := []string{}
					for row.Next() {
						col := row.Value()
						if str, err := col.String(); err == nil {
							a = append(a, str)
						} else {
							b, err := col.MarshalJSON()
							if err != nil {
								return "", err
							}
							a = append(a, string(b))
						}
					}
					w.Write(a)
				}
				w.Flush()
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Decode",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			r := c.reader(0)
			c.ret, c.err = func() (interface{}, error) {
				return csv.NewReader(r).ReadAll()
			}()
		},
	}},
	"encoding/hex": []*builtin{{
		Name:   "EncodedLen",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			n := c.int(0)
			c.ret = func() interface{} {
				return hex.EncodedLen(n)
			}()
		},
	}, {
		Name:   "DecodedLen",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.int(0)
			c.ret = func() interface{} {
				return hex.DecodedLen(x)
			}()
		},
	}, {
		Name:   "Decode",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return hex.DecodeString(s)
			}()
		},
	}, {
		Name:   "Dump",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return hex.Dump(data)
			}()
		},
	}, {
		Name:   "Encode",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret = func() interface{} {
				return hex.EncodeToString(src)
			}()
		},
	}},
	"encoding/json": []*builtin{{
		Name:   "Valid",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return json.Valid(data)
			}()
		},
	}, {
		Name:   "Compact",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				dst := bytes.Buffer{}
				if err := json.Compact(&dst, src); err != nil {
					return "", err
				}
				return dst.String(), nil
			}()
		},
	}, {
		Name:   "Indent",
		Params: []kind{stringKind, stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
			c.ret, c.err = func() (interface{}, error) {
				dst := bytes.Buffer{}
				if err := json.Indent(&dst, src, prefix, indent); err != nil {
					return "", err
				}
				return dst.String(), nil
			}()
		},
	}, {
		Name:   "HTMLEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret = func() interface{} {
				dst := &bytes.Buffer{}
				json.HTMLEscape(dst, src)
				return dst.String()
			}()
		},
	}, {
		Name:   "Marshal",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				b, err := json.Marshal(v)
				return string(b), err
			}()
		},
	}, {
		Name:   "MarshalStream",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {

				iter, err := v.List()
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				for iter.Next() {
					b, err := json.Marshal(iter.Value())
					if err != nil {
						return "", err
					}
					buf.Write(b)
					buf.WriteByte('\n')
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Unmarshal",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			b := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				if !json.Valid(b) {
					return nil, fmt.Errorf("json: invalid JSON")
				}
				fset := token.NewFileSet()
				expr, err := parser.ParseExpr(fset, "json", b)
				if err != nil {

					return nil, fmt.Errorf("json: could not parse JSON: %v", err)
				}
				return FromExpr(fset, expr)
			}()
		},
	}},
	"encoding/yaml": []*builtin{{
		Name:   "Marshal",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				b, err := goyaml.Marshal(v)
				return string(b), err
			}()
		},
	}, {
		Name:   "MarshalStream",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {

				iter, err := v.List()
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				for i := 0; iter.Next(); i++ {
					if i > 0 {
						buf.WriteString("---\n")
					}
					b, err := goyaml.Marshal(iter.Value())
					if err != nil {
						return "", err
					}
					buf.Write(b)
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Unmarshal",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				fset := token.NewFileSet()
				expr, err := yaml.Unmarshal(fset, "", data)
				if err != nil {
					return nil, err
				}
				return FromExpr(fset, expr)
			}()
		},
	}},
	"html": []*builtin{{
		Name:   "Escape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return html.EscapeString(s)
			}()
		},
	}, {
		Name:   "Unescape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return html.UnescapeString(s)
			}()
		},
	}},
	"list": []*builtin{{}},
	"math": []*builtin{{
		Name:  "MaxExp",
		Const: intFromGo("2147483647"),
	}, {
		Name:  "MinExp",
		Const: intFromGo("-2147483648"),
	}, {
		Name:  "MaxPrec",
		Const: intFromGo("4294967295"),
	}, {
		Name:  "ToNearestEven",
		Const: intFromGo("0"),
	}, {
		Name:  "ToNearestAway",
		Const: intFromGo("1"),
	}, {
		Name:  "ToZero",
		Const: intFromGo("2"),
	}, {
		Name:  "AwayFromZero",
		Const: intFromGo("3"),
	}, {
		Name:  "ToNegativeInf",
		Const: intFromGo("4"),
	}, {
		Name:  "ToPositiveInf",
		Const: intFromGo("5"),
	}, {
		Name:  "Below",
		Const: intFromGo("-1"),
	}, {
		Name:  "Exact",
		Const: intFromGo("0"),
	}, {
		Name:  "Above",
		Const: intFromGo("1"),
	}, {
		Name:   "Jacobi",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x, y := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				return big.Jacobi(x, y)
			}()
		},
	}, {
		Name:  "MaxBase",
		Const: intFromGo("62"),
	}, {
		Name:   "Floor",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Floor(x)
			}()
		},
	}, {
		Name:   "Ceil",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Ceil(x)
			}()
		},
	}, {
		Name:   "Trunc",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Trunc(x)
			}()
		},
	}, {
		Name:   "Round",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Round(x)
			}()
		},
	}, {
		Name:   "RoundToEven",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.RoundToEven(x)
			}()
		},
	}, {
		Name:   "Abs",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Abs(x)
			}()
		},
	}, {
		Name:   "Acosh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Acosh(x)
			}()
		},
	}, {
		Name:   "Asin",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Asin(x)
			}()
		},
	}, {
		Name:   "Acos",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Acos(x)
			}()
		},
	}, {
		Name:   "Asinh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Asinh(x)
			}()
		},
	}, {
		Name:   "Atan",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Atan(x)
			}()
		},
	}, {
		Name:   "Atan2",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			y, x := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Atan2(y, x)
			}()
		},
	}, {
		Name:   "Atanh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Atanh(x)
			}()
		},
	}, {
		Name:   "Cbrt",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cbrt(x)
			}()
		},
	}, {
		Name:  "E",
		Const: floatFromGo("2.71828182845904523536028747135266249775724709369995957496696763"),
	}, {
		Name:  "Pi",
		Const: floatFromGo("3.14159265358979323846264338327950288419716939937510582097494459"),
	}, {
		Name:  "Phi",
		Const: floatFromGo("1.61803398874989484820458683436563811772030917980576286213544861"),
	}, {
		Name:  "Sqrt2",
		Const: floatFromGo("1.41421356237309504880168872420969807856967187537694807317667974"),
	}, {
		Name:  "SqrtE",
		Const: floatFromGo("1.64872127070012814684865078781416357165377610071014801157507931"),
	}, {
		Name:  "SqrtPi",
		Const: floatFromGo("1.77245385090551602729816748334114518279754945612238712821380779"),
	}, {
		Name:  "SqrtPhi",
		Const: floatFromGo("1.27201964951406896425242246173749149171560804184009624861664038"),
	}, {
		Name:  "Ln2",
		Const: floatFromGo("0.693147180559945309417232121458176568075500134360255254120680009"),
	}, {
		Name:  "Log2E",
		Const: floatFromGo("1.442695040888963407359924681001892137426645954152985934135449408"),
	}, {
		Name:  "Ln10",
		Const: floatFromGo("2.3025850929940456840179914546843642076011014886287729760333278"),
	}, {
		Name:  "Log10E",
		Const: floatFromGo("0.43429448190325182765112891891660508229439700580366656611445378"),
	}, {
		Name:   "Copysign",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Copysign(x, y)
			}()
		},
	}, {
		Name:   "Dim",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Dim(x, y)
			}()
		},
	}, {
		Name:   "Erf",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erf(x)
			}()
		},
	}, {
		Name:   "Erfc",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfc(x)
			}()
		},
	}, {
		Name:   "Erfinv",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfinv(x)
			}()
		},
	}, {
		Name:   "Erfcinv",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfcinv(x)
			}()
		},
	}, {
		Name:   "Exp",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Exp(x)
			}()
		},
	}, {
		Name:   "Exp2",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Exp2(x)
			}()
		},
	}, {
		Name:   "Expm1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Expm1(x)
			}()
		},
	}, {
		Name:   "Gamma",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Gamma(x)
			}()
		},
	}, {
		Name:   "Hypot",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			p, q := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Hypot(p, q)
			}()
		},
	}, {
		Name:   "J0",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.J0(x)
			}()
		},
	}, {
		Name:   "Y0",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Y0(x)
			}()
		},
	}, {
		Name:   "J1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.J1(x)
			}()
		},
	}, {
		Name:   "Y1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Y1(x)
			}()
		},
	}, {
		Name:   "Jn",
		Params: []kind{intKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n, x := c.int(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Jn(n, x)
			}()
		},
	}, {
		Name:   "Yn",
		Params: []kind{intKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n, x := c.int(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Yn(n, x)
			}()
		},
	}, {
		Name:   "Ldexp",
		Params: []kind{numKind, intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			frac, exp := c.float64(0), c.int(1)
			c.ret = func() interface{} {
				return math.Ldexp(frac, exp)
			}()
		},
	}, {
		Name:   "Log",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log(x)
			}()
		},
	}, {
		Name:   "Log10",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log10(x)
			}()
		},
	}, {
		Name:   "Log2",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log2(x)
			}()
		},
	}, {
		Name:   "Log1p",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log1p(x)
			}()
		},
	}, {
		Name:   "Logb",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Logb(x)
			}()
		},
	}, {
		Name:   "Ilogb",
		Params: []kind{numKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Ilogb(x)
			}()
		},
	}, {
		Name:   "Mod",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Mod(x, y)
			}()
		},
	}, {
		Name:   "Pow",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Pow(x, y)
			}()
		},
	}, {
		Name:   "Pow10",
		Params: []kind{intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n := c.int(0)
			c.ret = func() interface{} {
				return math.Pow10(n)
			}()
		},
	}, {
		Name:   "Remainder",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Remainder(x, y)
			}()
		},
	}, {
		Name:   "Signbit",
		Params: []kind{numKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Signbit(x)
			}()
		},
	}, {
		Name:   "Cos",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cos(x)
			}()
		},
	}, {
		Name:   "Sin",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sin(x)
			}()
		},
	}, {
		Name:   "Sinh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sinh(x)
			}()
		},
	}, {
		Name:   "Cosh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cosh(x)
			}()
		},
	}, {
		Name:   "Sqrt",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sqrt(x)
			}()
		},
	}, {
		Name:   "Tan",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Tan(x)
			}()
		},
	}, {
		Name:   "Tanh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Tanh(x)
			}()
		},
	}},
	"math/bits": []*builtin{{
		Name:   "And",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				n := len(wa)
				if len(wb) < n {
					n = len(wb)
				}
				w := make([]big.Word, n)
				for i := range w {
					w[i] = wa[i] & wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Or",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				var w []big.Word
				n := len(wa)
				if len(wa) > len(wb) {
					w = append(w, wa...)
					n = len(wb)
				} else {
					w = append(w, wb...)
				}
				for i := 0; i < n; i++ {
					w[i] = wa[i] | wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Xor",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				var w []big.Word
				n := len(wa)
				if len(wa) > len(wb) {
					w = append(w, wa...)
					n = len(wb)
				} else {
					w = append(w, wb...)
				}
				for i := 0; i < n; i++ {
					w[i] = wa[i] ^ wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Clear",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				w := append([]big.Word(nil), wa...)
				for i, m := range wb {
					if i >= len(w) {
						break
					}
					w[i] = wa[i] &^ m
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "OnesCount",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.OnesCount64(x)
			}()
		},
	}, {
		Name:   "RotateLeft",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x, k := c.uint64(0), c.int(1)
			c.ret = func() interface{} {
				return bits.RotateLeft64(x, k)
			}()
		},
	}, {
		Name:   "Reverse",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.Reverse64(x)
			}()
		},
	}, {
		Name:   "ReverseBytes",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.ReverseBytes64(x)
			}()
		},
	}, {
		Name:   "Len",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.Len64(x)
			}()
		},
	}},
	"path": []*builtin{{
		Name:   "Split",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				file, dir := split(path)
				return []string{file, dir}
			}()
		},
	}, {
		Name:   "Match",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			pattern, name := c.string(0), c.string(1)
			c.ret, c.err = func() (interface{}, error) {
				return path.Match(pattern, name)
			}()
		},
	}, {
		Name:   "Clean",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathClean(path)
			}()
		},
	}, {
		Name:   "Ext",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathExt(path)
			}()
		},
	}, {
		Name:   "Base",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathBase(path)
			}()
		},
	}, {
		Name:   "IsAbs",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathIsAbs(path)
			}()
		},
	}, {
		Name:   "Dir",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathDir(path)
			}()
		},
	}},
	"regexp": []*builtin{{
		Name:   "Match",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			pattern, s := c.string(0), c.string(1)
			c.ret, c.err = func() (interface{}, error) {
				return regexp.MatchString(pattern, s)
			}()
		},
	}, {
		Name:   "QuoteMeta",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return regexp.QuoteMeta(s)
			}()
		},
	}},
	"runtime": []*builtin{{
		Name:   "Path",
		Params: []kind{},
		Result: stringKind,
		Func: func(c *callCtxt) {
			c.ret = func() interface{} {
				return ""
			}()
		},
	}},
	"strconv": []*builtin{{
		Name:   "Unquote",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return Unquote(s)
			}()
		},
	}, {
		Name:   "ParseBool",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			str := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseBool(str)
			}()
		},
	}, {
		Name:   "FormatBool",
		Params: []kind{boolKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			b := c.bool(0)
			c.ret = func() interface{} {
				return strconv.FormatBool(b)
			}()
		},
	}, {
		Name:   "ParseFloat",
		Params: []kind{stringKind, intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			s, bitSize := c.string(0), c.int(1)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseFloat(s, bitSize)
			}()
		},
	}, {
		Name:  "IntSize",
		Const: intFromGo("64"),
	}, {
		Name:   "ParseUint",
		Params: []kind{stringKind, intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, base, bitSize := c.string(0), c.int(1), c.int(2)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseUint(s, base, bitSize)
			}()
		},
	}, {
		Name:   "ParseInt",
		Params: []kind{stringKind, intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, base, bitSize := c.string(0), c.int(1), c.int(2)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseInt(s, base, bitSize)
			}()
		},
	}, {
		Name:   "Atoi",
		Params: []kind{stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.Atoi(s)
			}()
		},
	}, {
		Name:   "FormatFloat",
		Params: []kind{numKind, intKind, intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			f, fmt, prec, bitSize := c.float64(0), c.byte(1), c.int(2), c.int(3)
			c.ret = func() interface{} {
				return strconv.FormatFloat(f, fmt, prec, bitSize)
			}()
		},
	}, {
		Name:   "FormatUint",
		Params: []kind{intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			i, base := c.uint64(0), c.int(1)
			c.ret = func() interface{} {
				return strconv.FormatUint(i, base)
			}()
		},
	}, {
		Name:   "FormatInt",
		Params: []kind{intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			i, base := c.int64(0), c.int(1)
			c.ret = func() interface{} {
				return strconv.FormatInt(i, base)
			}()
		},
	}, {
		Name:   "Quote",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.Quote(s)
			}()
		},
	}, {
		Name:   "QuoteToASCII",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.QuoteToASCII(s)
			}()
		},
	}, {
		Name:   "QuoteToGraphic",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.QuoteToGraphic(s)
			}()
		},
	}, {
		Name:   "QuoteRune",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRune(r)
			}()
		},
	}, {
		Name:   "QuoteRuneToASCII",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRuneToASCII(r)
			}()
		},
	}, {
		Name:   "QuoteRuneToGraphic",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRuneToGraphic(r)
			}()
		},
	}, {
		Name:   "CanBackquote",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.CanBackquote(s)
			}()
		},
	}, {
		Name:   "IsPrint",
		Params: []kind{intKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.IsPrint(r)
			}()
		},
	}, {
		Name:   "IsGraphic",
		Params: []kind{intKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.IsGraphic(r)
			}()
		},
	}},
	"strings": []*builtin{{
		Name:   "ToTitle",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {

				prev := ' '
				return strings.Map(
					func(r rune) rune {
						if unicode.IsSpace(prev) {
							prev = r
							return unicode.ToTitle(r)
						}
						prev = r
						return r
					},
					s)
			}()
		},
	}, {
		Name:   "ToCamel",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {

				prev := ' '
				return strings.Map(
					func(r rune) rune {
						if unicode.IsSpace(prev) {
							prev = r
							return unicode.ToLower(r)
						}
						prev = r
						return r
					},
					s)
			}()
		},
	}, {
		Name:   "Compare",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Compare(a, b)
			}()
		},
	}, {
		Name:   "Count",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Count(s, substr)
			}()
		},
	}, {
		Name:   "Contains",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Contains(s, substr)
			}()
		},
	}, {
		Name:   "ContainsAny",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.ContainsAny(s, chars)
			}()
		},
	}, {
		Name:   "LastIndex",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.LastIndex(s, substr)
			}()
		},
	}, {
		Name:   "IndexAny",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.IndexAny(s, chars)
			}()
		},
	}, {
		Name:   "LastIndexAny",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.LastIndexAny(s, chars)
			}()
		},
	}, {
		Name:   "SplitN",
		Params: []kind{stringKind, stringKind, intKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep, n := c.string(0), c.string(1), c.int(2)
			c.ret = func() interface{} {
				return strings.SplitN(s, sep, n)
			}()
		},
	}, {
		Name:   "SplitAfterN",
		Params: []kind{stringKind, stringKind, intKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep, n := c.string(0), c.string(1), c.int(2)
			c.ret = func() interface{} {
				return strings.SplitAfterN(s, sep, n)
			}()
		},
	}, {
		Name:   "Split",
		Params: []kind{stringKind, stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Split(s, sep)
			}()
		},
	}, {
		Name:   "SplitAfter",
		Params: []kind{stringKind, stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.SplitAfter(s, sep)
			}()
		},
	}, {
		Name:   "Fields",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.Fields(s)
			}()
		},
	}, {
		Name:   "Join",
		Params: []kind{listKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			a, sep := c.strList(0), c.string(1)
			if c.do() {
				c.ret = func() interface{} {
					return strings.Join(a, sep)
				}()
			}
		},
	}, {
		Name:   "HasPrefix",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, prefix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.HasPrefix(s, prefix)
			}()
		},
	}, {
		Name:   "HasSuffix",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, suffix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.HasSuffix(s, suffix)
			}()
		},
	}, {
		Name:   "Repeat",
		Params: []kind{stringKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, count := c.string(0), c.int(1)
			c.ret = func() interface{} {
				return strings.Repeat(s, count)
			}()
		},
	}, {
		Name:   "ToUpper",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.ToUpper(s)
			}()
		},
	}, {
		Name:   "ToLower",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.ToLower(s)
			}()
		},
	}, {
		Name:   "Trim",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Trim(s, cutset)
			}()
		},
	}, {
		Name:   "TrimLeft",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimLeft(s, cutset)
			}()
		},
	}, {
		Name:   "TrimRight",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimRight(s, cutset)
			}()
		},
	}, {
		Name:   "TrimSpace",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.TrimSpace(s)
			}()
		},
	}, {
		Name:   "TrimPrefix",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, prefix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimPrefix(s, prefix)
			}()
		},
	}, {
		Name:   "TrimSuffix",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, suffix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimSuffix(s, suffix)
			}()
		},
	}, {
		Name:   "Replace",
		Params: []kind{stringKind, stringKind, stringKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, old, new, n := c.string(0), c.string(1), c.string(2), c.int(3)
			c.ret = func() interface{} {
				return strings.Replace(s, old, new, n)
			}()
		},
	}, {
		Name:   "Index",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Index(s, substr)
			}()
		},
	}},
	"text/tabwriter": []*builtin{{
		Name:   "Write",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			data := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				buf := &bytes.Buffer{}
				tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
				b, err := data.Bytes()
				if err != nil {
					return "", err
				}
				_, err = tw.Write(b)
				if err != nil {
					return "", err
				}
				return buf.String(), err
			}()
		},
	}},
	"text/template": []*builtin{{
		Name:   "Execute",
		Params: []kind{stringKind, topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			templ, data := c.string(0), c.value(1)
			c.ret, c.err = func() (interface{}, error) {
				t, err := template.New("").Parse(templ)
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				if err := t.Execute(buf, data); err != nil {
					return "", err
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "HTMLEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return template.HTMLEscapeString(s)
			}()
		},
	}, {
		Name:   "JSEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return template.JSEscapeString(s)
			}()
		},
	}},
}
