// Code generated by vm/runtime/helpers/main.go. DO NOT EDIT.

package runtime

import (
	"fmt"
	"reflect"
	"time"
)

func Equal(a, b interface{}) bool {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) == int(y)
		case uint8:
			return int(x) == int(y)
		case uint16:
			return int(x) == int(y)
		case uint32:
			return int(x) == int(y)
		case uint64:
			return int(x) == int(y)
		case int:
			return int(x) == int(y)
		case int8:
			return int(x) == int(y)
		case int16:
			return int(x) == int(y)
		case int32:
			return int(x) == int(y)
		case int64:
			return int(x) == int(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) == float64(y)
		case uint8:
			return float64(x) == float64(y)
		case uint16:
			return float64(x) == float64(y)
		case uint32:
			return float64(x) == float64(y)
		case uint64:
			return float64(x) == float64(y)
		case int:
			return float64(x) == float64(y)
		case int8:
			return float64(x) == float64(y)
		case int16:
			return float64(x) == float64(y)
		case int32:
			return float64(x) == float64(y)
		case int64:
			return float64(x) == float64(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) == float64(y)
		case uint8:
			return float64(x) == float64(y)
		case uint16:
			return float64(x) == float64(y)
		case uint32:
			return float64(x) == float64(y)
		case uint64:
			return float64(x) == float64(y)
		case int:
			return float64(x) == float64(y)
		case int8:
			return float64(x) == float64(y)
		case int16:
			return float64(x) == float64(y)
		case int32:
			return float64(x) == float64(y)
		case int64:
			return float64(x) == float64(y)
		case float32:
			return float64(x) == float64(y)
		case float64:
			return float64(x) == float64(y)
		}
	case []any:
		switch y := b.(type) {
		case []string:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []uint:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []uint8:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []uint16:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []uint32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []uint64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []int:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []int8:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []int16:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []int32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []int64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []float32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []float64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		case []any:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if !Equal(x[i], y[i]) {
					return false
				}
			}
			return true
		}
	case []string:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []string:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []uint:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []uint:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []uint8:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []uint8:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []uint16:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []uint16:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []uint32:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []uint32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []uint64:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []uint64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []int:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []int:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []int8:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []int8:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []int16:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []int16:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []int32:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []int32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []int64:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []int64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []float32:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []float32:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case []float64:
		switch y := b.(type) {
		case []any:
			return Equal(y, x)
		case []float64:
			if len(x) != len(y) {
				return false
			}
			for i := range x {
				if x[i] != y[i] {
					return false
				}
			}
			return true
		}
	case string:
		switch y := b.(type) {
		case string:
			return x == y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.Equal(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x == y
		}
	case bool:
		switch y := b.(type) {
		case bool:
			return x == y
		}
	}
	if IsNil(a) && IsNil(b) {
		return true
	}
	return reflect.DeepEqual(a, b)
}

func Less(a, b interface{}) bool {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) < int(y)
		case uint8:
			return int(x) < int(y)
		case uint16:
			return int(x) < int(y)
		case uint32:
			return int(x) < int(y)
		case uint64:
			return int(x) < int(y)
		case int:
			return int(x) < int(y)
		case int8:
			return int(x) < int(y)
		case int16:
			return int(x) < int(y)
		case int32:
			return int(x) < int(y)
		case int64:
			return int(x) < int(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) < float64(y)
		case uint8:
			return float64(x) < float64(y)
		case uint16:
			return float64(x) < float64(y)
		case uint32:
			return float64(x) < float64(y)
		case uint64:
			return float64(x) < float64(y)
		case int:
			return float64(x) < float64(y)
		case int8:
			return float64(x) < float64(y)
		case int16:
			return float64(x) < float64(y)
		case int32:
			return float64(x) < float64(y)
		case int64:
			return float64(x) < float64(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) < float64(y)
		case uint8:
			return float64(x) < float64(y)
		case uint16:
			return float64(x) < float64(y)
		case uint32:
			return float64(x) < float64(y)
		case uint64:
			return float64(x) < float64(y)
		case int:
			return float64(x) < float64(y)
		case int8:
			return float64(x) < float64(y)
		case int16:
			return float64(x) < float64(y)
		case int32:
			return float64(x) < float64(y)
		case int64:
			return float64(x) < float64(y)
		case float32:
			return float64(x) < float64(y)
		case float64:
			return float64(x) < float64(y)
		}
	case string:
		switch y := b.(type) {
		case string:
			return x < y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.Before(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x < y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T < %T", a, b))
}

func More(a, b interface{}) bool {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) > int(y)
		case uint8:
			return int(x) > int(y)
		case uint16:
			return int(x) > int(y)
		case uint32:
			return int(x) > int(y)
		case uint64:
			return int(x) > int(y)
		case int:
			return int(x) > int(y)
		case int8:
			return int(x) > int(y)
		case int16:
			return int(x) > int(y)
		case int32:
			return int(x) > int(y)
		case int64:
			return int(x) > int(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) > float64(y)
		case uint8:
			return float64(x) > float64(y)
		case uint16:
			return float64(x) > float64(y)
		case uint32:
			return float64(x) > float64(y)
		case uint64:
			return float64(x) > float64(y)
		case int:
			return float64(x) > float64(y)
		case int8:
			return float64(x) > float64(y)
		case int16:
			return float64(x) > float64(y)
		case int32:
			return float64(x) > float64(y)
		case int64:
			return float64(x) > float64(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) > float64(y)
		case uint8:
			return float64(x) > float64(y)
		case uint16:
			return float64(x) > float64(y)
		case uint32:
			return float64(x) > float64(y)
		case uint64:
			return float64(x) > float64(y)
		case int:
			return float64(x) > float64(y)
		case int8:
			return float64(x) > float64(y)
		case int16:
			return float64(x) > float64(y)
		case int32:
			return float64(x) > float64(y)
		case int64:
			return float64(x) > float64(y)
		case float32:
			return float64(x) > float64(y)
		case float64:
			return float64(x) > float64(y)
		}
	case string:
		switch y := b.(type) {
		case string:
			return x > y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.After(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x > y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T > %T", a, b))
}

func LessOrEqual(a, b interface{}) bool {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) <= int(y)
		case uint8:
			return int(x) <= int(y)
		case uint16:
			return int(x) <= int(y)
		case uint32:
			return int(x) <= int(y)
		case uint64:
			return int(x) <= int(y)
		case int:
			return int(x) <= int(y)
		case int8:
			return int(x) <= int(y)
		case int16:
			return int(x) <= int(y)
		case int32:
			return int(x) <= int(y)
		case int64:
			return int(x) <= int(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) <= float64(y)
		case uint8:
			return float64(x) <= float64(y)
		case uint16:
			return float64(x) <= float64(y)
		case uint32:
			return float64(x) <= float64(y)
		case uint64:
			return float64(x) <= float64(y)
		case int:
			return float64(x) <= float64(y)
		case int8:
			return float64(x) <= float64(y)
		case int16:
			return float64(x) <= float64(y)
		case int32:
			return float64(x) <= float64(y)
		case int64:
			return float64(x) <= float64(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) <= float64(y)
		case uint8:
			return float64(x) <= float64(y)
		case uint16:
			return float64(x) <= float64(y)
		case uint32:
			return float64(x) <= float64(y)
		case uint64:
			return float64(x) <= float64(y)
		case int:
			return float64(x) <= float64(y)
		case int8:
			return float64(x) <= float64(y)
		case int16:
			return float64(x) <= float64(y)
		case int32:
			return float64(x) <= float64(y)
		case int64:
			return float64(x) <= float64(y)
		case float32:
			return float64(x) <= float64(y)
		case float64:
			return float64(x) <= float64(y)
		}
	case string:
		switch y := b.(type) {
		case string:
			return x <= y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.Before(y) || x.Equal(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x <= y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T <= %T", a, b))
}

func MoreOrEqual(a, b interface{}) bool {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) >= int(y)
		case uint8:
			return int(x) >= int(y)
		case uint16:
			return int(x) >= int(y)
		case uint32:
			return int(x) >= int(y)
		case uint64:
			return int(x) >= int(y)
		case int:
			return int(x) >= int(y)
		case int8:
			return int(x) >= int(y)
		case int16:
			return int(x) >= int(y)
		case int32:
			return int(x) >= int(y)
		case int64:
			return int(x) >= int(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) >= float64(y)
		case uint8:
			return float64(x) >= float64(y)
		case uint16:
			return float64(x) >= float64(y)
		case uint32:
			return float64(x) >= float64(y)
		case uint64:
			return float64(x) >= float64(y)
		case int:
			return float64(x) >= float64(y)
		case int8:
			return float64(x) >= float64(y)
		case int16:
			return float64(x) >= float64(y)
		case int32:
			return float64(x) >= float64(y)
		case int64:
			return float64(x) >= float64(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) >= float64(y)
		case uint8:
			return float64(x) >= float64(y)
		case uint16:
			return float64(x) >= float64(y)
		case uint32:
			return float64(x) >= float64(y)
		case uint64:
			return float64(x) >= float64(y)
		case int:
			return float64(x) >= float64(y)
		case int8:
			return float64(x) >= float64(y)
		case int16:
			return float64(x) >= float64(y)
		case int32:
			return float64(x) >= float64(y)
		case int64:
			return float64(x) >= float64(y)
		case float32:
			return float64(x) >= float64(y)
		case float64:
			return float64(x) >= float64(y)
		}
	case string:
		switch y := b.(type) {
		case string:
			return x >= y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.After(y) || x.Equal(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x >= y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T >= %T", a, b))
}

func Add(a, b interface{}) interface{} {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) + int(y)
		case uint8:
			return int(x) + int(y)
		case uint16:
			return int(x) + int(y)
		case uint32:
			return int(x) + int(y)
		case uint64:
			return int(x) + int(y)
		case int:
			return int(x) + int(y)
		case int8:
			return int(x) + int(y)
		case int16:
			return int(x) + int(y)
		case int32:
			return int(x) + int(y)
		case int64:
			return int(x) + int(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) + float64(y)
		case uint8:
			return float64(x) + float64(y)
		case uint16:
			return float64(x) + float64(y)
		case uint32:
			return float64(x) + float64(y)
		case uint64:
			return float64(x) + float64(y)
		case int:
			return float64(x) + float64(y)
		case int8:
			return float64(x) + float64(y)
		case int16:
			return float64(x) + float64(y)
		case int32:
			return float64(x) + float64(y)
		case int64:
			return float64(x) + float64(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) + float64(y)
		case uint8:
			return float64(x) + float64(y)
		case uint16:
			return float64(x) + float64(y)
		case uint32:
			return float64(x) + float64(y)
		case uint64:
			return float64(x) + float64(y)
		case int:
			return float64(x) + float64(y)
		case int8:
			return float64(x) + float64(y)
		case int16:
			return float64(x) + float64(y)
		case int32:
			return float64(x) + float64(y)
		case int64:
			return float64(x) + float64(y)
		case float32:
			return float64(x) + float64(y)
		case float64:
			return float64(x) + float64(y)
		}
	case string:
		switch y := b.(type) {
		case string:
			return x + y
		}
	case time.Time:
		switch y := b.(type) {
		case time.Duration:
			return x.Add(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Time:
			return y.Add(x)
		case time.Duration:
			return x + y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T + %T", a, b))
}

func Subtract(a, b interface{}) interface{} {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) - int(y)
		case uint8:
			return int(x) - int(y)
		case uint16:
			return int(x) - int(y)
		case uint32:
			return int(x) - int(y)
		case uint64:
			return int(x) - int(y)
		case int:
			return int(x) - int(y)
		case int8:
			return int(x) - int(y)
		case int16:
			return int(x) - int(y)
		case int32:
			return int(x) - int(y)
		case int64:
			return int(x) - int(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) - float64(y)
		case uint8:
			return float64(x) - float64(y)
		case uint16:
			return float64(x) - float64(y)
		case uint32:
			return float64(x) - float64(y)
		case uint64:
			return float64(x) - float64(y)
		case int:
			return float64(x) - float64(y)
		case int8:
			return float64(x) - float64(y)
		case int16:
			return float64(x) - float64(y)
		case int32:
			return float64(x) - float64(y)
		case int64:
			return float64(x) - float64(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) - float64(y)
		case uint8:
			return float64(x) - float64(y)
		case uint16:
			return float64(x) - float64(y)
		case uint32:
			return float64(x) - float64(y)
		case uint64:
			return float64(x) - float64(y)
		case int:
			return float64(x) - float64(y)
		case int8:
			return float64(x) - float64(y)
		case int16:
			return float64(x) - float64(y)
		case int32:
			return float64(x) - float64(y)
		case int64:
			return float64(x) - float64(y)
		case float32:
			return float64(x) - float64(y)
		case float64:
			return float64(x) - float64(y)
		}
	case time.Time:
		switch y := b.(type) {
		case time.Time:
			return x.Sub(y)
		case time.Duration:
			return x.Add(-y)
		}
	case time.Duration:
		switch y := b.(type) {
		case time.Duration:
			return x - y
		}
	}
	panic(fmt.Sprintf("invalid operation: %T - %T", a, b))
}

func Multiply(a, b interface{}) interface{} {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) * int(y)
		case uint8:
			return int(x) * int(y)
		case uint16:
			return int(x) * int(y)
		case uint32:
			return int(x) * int(y)
		case uint64:
			return int(x) * int(y)
		case int:
			return int(x) * int(y)
		case int8:
			return int(x) * int(y)
		case int16:
			return int(x) * int(y)
		case int32:
			return int(x) * int(y)
		case int64:
			return int(x) * int(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) * float64(y)
		case uint8:
			return float64(x) * float64(y)
		case uint16:
			return float64(x) * float64(y)
		case uint32:
			return float64(x) * float64(y)
		case uint64:
			return float64(x) * float64(y)
		case int:
			return float64(x) * float64(y)
		case int8:
			return float64(x) * float64(y)
		case int16:
			return float64(x) * float64(y)
		case int32:
			return float64(x) * float64(y)
		case int64:
			return float64(x) * float64(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return float64(x) * float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) * float64(y)
		case uint8:
			return float64(x) * float64(y)
		case uint16:
			return float64(x) * float64(y)
		case uint32:
			return float64(x) * float64(y)
		case uint64:
			return float64(x) * float64(y)
		case int:
			return float64(x) * float64(y)
		case int8:
			return float64(x) * float64(y)
		case int16:
			return float64(x) * float64(y)
		case int32:
			return float64(x) * float64(y)
		case int64:
			return float64(x) * float64(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return float64(x) * float64(y)
		}
	case time.Duration:
		switch y := b.(type) {
		case uint:
			return time.Duration(x) * time.Duration(y)
		case uint8:
			return time.Duration(x) * time.Duration(y)
		case uint16:
			return time.Duration(x) * time.Duration(y)
		case uint32:
			return time.Duration(x) * time.Duration(y)
		case uint64:
			return time.Duration(x) * time.Duration(y)
		case int:
			return time.Duration(x) * time.Duration(y)
		case int8:
			return time.Duration(x) * time.Duration(y)
		case int16:
			return time.Duration(x) * time.Duration(y)
		case int32:
			return time.Duration(x) * time.Duration(y)
		case int64:
			return time.Duration(x) * time.Duration(y)
		case float32:
			return float64(x) * float64(y)
		case float64:
			return float64(x) * float64(y)
		case time.Duration:
			return time.Duration(x) * time.Duration(y)
		}
	}
	panic(fmt.Sprintf("invalid operation: %T * %T", a, b))
}

func Divide(a, b interface{}) float64 {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case float32:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	case float64:
		switch y := b.(type) {
		case uint:
			return float64(x) / float64(y)
		case uint8:
			return float64(x) / float64(y)
		case uint16:
			return float64(x) / float64(y)
		case uint32:
			return float64(x) / float64(y)
		case uint64:
			return float64(x) / float64(y)
		case int:
			return float64(x) / float64(y)
		case int8:
			return float64(x) / float64(y)
		case int16:
			return float64(x) / float64(y)
		case int32:
			return float64(x) / float64(y)
		case int64:
			return float64(x) / float64(y)
		case float32:
			return float64(x) / float64(y)
		case float64:
			return float64(x) / float64(y)
		}
	}
	panic(fmt.Sprintf("invalid operation: %T / %T", a, b))
}

func Modulo(a, b interface{}) int {
	switch x := a.(type) {
	case uint:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case uint8:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case uint16:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case uint32:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case uint64:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case int:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case int8:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case int16:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case int32:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	case int64:
		switch y := b.(type) {
		case uint:
			return int(x) % int(y)
		case uint8:
			return int(x) % int(y)
		case uint16:
			return int(x) % int(y)
		case uint32:
			return int(x) % int(y)
		case uint64:
			return int(x) % int(y)
		case int:
			return int(x) % int(y)
		case int8:
			return int(x) % int(y)
		case int16:
			return int(x) % int(y)
		case int32:
			return int(x) % int(y)
		case int64:
			return int(x) % int(y)
		}
	}
	panic(fmt.Sprintf("invalid operation: %T %% %T", a, b))
}
