9fans.net/go@v0.0.5/draw/memdraw/drawtest.go (about)

     1  // +build ignore
     2  
     3  package main
     4  
     5  /*
     6   * This program tests the 'memimagedraw' primitive stochastically.
     7   * It tests the combination aspects of it thoroughly, but since the
     8   * three images it uses are disjoint, it makes no check of the
     9   * correct behavior when images overlap.  That is, however, much
    10   * easier to get right and to test.
    11   */
    12  
    13  import (
    14  	"bufio"
    15  	"bytes"
    16  	"flag"
    17  	"fmt"
    18  	"io"
    19  	"log"
    20  	"math/rand"
    21  	"os"
    22  	"path/filepath"
    23  	"time"
    24  
    25  	"9fans.net/go/draw"
    26  	"9fans.net/go/draw/memdraw"
    27  )
    28  
    29  const DBG = 0
    30  
    31  func RGB2K(r, g, b uint8) uint8 {
    32  	// fmt.Printf("RGB2K %#x %#x %#x -> %#x\n%s", r, g, b, uint8((299*int(r)+587*int(g)+114*int(b))/1000), string(debug.Stack()))
    33  	return uint8((299*int(r) + 587*int(g) + 114*int(b)) / 1000)
    34  }
    35  
    36  var dchan string
    37  var schan string
    38  var mchan string
    39  
    40  var drawdebug int = 0
    41  var seed int64
    42  var niters int = 100
    43  var dbpp int   /* bits per pixel in destination */
    44  var sbpp int   /* bits per pixel in src */
    45  var mbpp int   /* bits per pixel in mask */
    46  var dpm uint8  /* pixel mask at high part of byte, in destination */
    47  var nbytes int /* in destination */
    48  
    49  var Xrange int = 64
    50  var Yrange int = 16
    51  
    52  var dst *memdraw.Image
    53  var src *memdraw.Image
    54  var mask *memdraw.Image
    55  var stmp *memdraw.Image
    56  var mtmp *memdraw.Image
    57  var ones *memdraw.Image
    58  var dstbits []uint8
    59  var srcbits []uint8
    60  var maskbits []uint8
    61  var savedstbits []uint8
    62  
    63  func rdb() {
    64  }
    65  
    66  func iprint(format string, args ...interface{}) {
    67  	fmt.Fprintf(os.Stderr, format, args...)
    68  }
    69  
    70  func main() {
    71  	memdraw.Init()
    72  	seed = time.Now().UnixNano()
    73  
    74  	flag.IntVar(&Xrange, "x", Xrange, "")
    75  	flag.IntVar(&Yrange, "y", Yrange, "")
    76  	flag.IntVar(&niters, "n", niters, "")
    77  	flag.Int64Var(&seed, "s", seed, "")
    78  	flag.Usage = func() {
    79  		fmt.Fprintf(os.Stderr, "usage: dtest [dchan [schan [mchan]]]\n")
    80  		os.Exit(2)
    81  	}
    82  	flag.Parse()
    83  
    84  	dchan = "r8g8b8"
    85  	schan = "r8g8b8"
    86  	mchan = "r8g8b8"
    87  	switch flag.NArg() {
    88  	default:
    89  		flag.Usage()
    90  	case 3:
    91  		mchan = flag.Arg(2)
    92  		fallthrough
    93  	case 2:
    94  		schan = flag.Arg(1)
    95  		fallthrough
    96  	case 1:
    97  		dchan = flag.Arg(0)
    98  		fallthrough
    99  	case 0:
   100  		// ok
   101  	}
   102  
   103  	fmt.Fprintf(os.Stderr, "%s -x %d -y %d -s 0x%x %s %s %s\n", filepath.Base(os.Args[0]), Xrange, Yrange, seed, dchan, schan, mchan)
   104  	rand.Seed(seed)
   105  
   106  	alloc := func(s string) *memdraw.Image {
   107  		pix, err := draw.ParsePix(s)
   108  		if err != nil {
   109  			log.Fatal(err)
   110  		}
   111  		i, err := memdraw.AllocImage(draw.Rect(0, 0, Xrange, Yrange), pix)
   112  		if err != nil {
   113  			log.Fatal(err)
   114  		}
   115  		return i
   116  	}
   117  
   118  	dst = alloc(dchan)
   119  	src = alloc(schan)
   120  	mask = alloc(mchan)
   121  	stmp = alloc(schan)
   122  	mtmp = alloc(mchan)
   123  	ones = alloc(mchan)
   124  
   125  	nbytes = (4*Xrange+4)*Yrange + 4
   126  	srcbits = make([]byte, nbytes)
   127  	dstbits = make([]byte, nbytes)
   128  	maskbits = make([]byte, nbytes)
   129  	savedstbits = make([]byte, nbytes)
   130  
   131  	dbpp = dst.Depth
   132  	sbpp = src.Depth
   133  	mbpp = mask.Depth
   134  	dpm = uint8(0xFF) ^ (0xFF >> dbpp)
   135  	b := ones.Data.Bdata[:int(ones.Width)*4*Yrange]
   136  	for i := range b {
   137  		b[i] = 0xFF
   138  	}
   139  
   140  	fmt.Fprintf(os.Stderr, "dtest: verify single pixel operation\n")
   141  	verifyone()
   142  
   143  	fmt.Fprintf(os.Stderr, "dtest: verify full line non-replicated\n")
   144  	verifyline()
   145  
   146  	fmt.Fprintf(os.Stderr, "dtest: verify full rectangle non-replicated\n")
   147  	verifyrect()
   148  
   149  	fmt.Fprintf(os.Stderr, "dtest: verify full rectangle source replicated\n")
   150  	verifyrectrepl(1, 0)
   151  
   152  	fmt.Fprintf(os.Stderr, "dtest: verify full rectangle mask replicated\n")
   153  	verifyrectrepl(0, 1)
   154  
   155  	fmt.Fprintf(os.Stderr, "dtest: verify full rectangle source and mask replicated\n")
   156  	verifyrectrepl(1, 1)
   157  }
   158  
   159  /*
   160   * Dump out an ASCII representation of an image.  The label specifies
   161   * a list of characters to put at various points in the picture.
   162   */
   163  func Bprintr5g6b5(bio io.Writer, _ string, v uint32) {
   164  	r := (v >> 11) & 31
   165  	g := (v >> 5) & 63
   166  	b := v & 31
   167  	fmt.Fprintf(bio, "%.2x%.2x%.2x", r, g, b)
   168  }
   169  
   170  func Bprintr5g5b5a1(bio io.Writer, _ string, v uint32) {
   171  	r := (v >> 11) & 31
   172  	g := (v >> 6) & 31
   173  	b := (v >> 1) & 31
   174  	a := v & 1
   175  	fmt.Fprintf(bio, "%.2x%.2x%.2x%.2x", r, g, b, a)
   176  }
   177  
   178  func Bprint(bio io.Writer, format string, arg uint32) {
   179  	fmt.Fprintf(bio, format, arg)
   180  }
   181  
   182  func dumpimage(name string, img *memdraw.Image, vdata []byte, labelpt draw.Point) {
   183  	var fmt_ func(io.Writer, string, uint32)
   184  	var format string
   185  	switch img.Depth {
   186  	case 1, 2, 4:
   187  		fmt_ = Bprint
   188  		format = "%.1x"
   189  	case 8:
   190  		fmt_ = Bprint
   191  		format = "%.2x"
   192  	case 16:
   193  		if img.Pix == draw.RGB16 {
   194  			fmt_ = Bprintr5g6b5
   195  		} else {
   196  			fmt_ = Bprint
   197  			format = "%.4x"
   198  		}
   199  	case 24:
   200  		fmt_ = Bprint
   201  		format = "%.6x"
   202  	case 32:
   203  		fmt_ = Bprint
   204  		format = "%.8x"
   205  	}
   206  	if fmt_ == nil {
   207  		panic("bad format")
   208  	}
   209  
   210  	r := img.R
   211  	b := bufio.NewWriter(os.Stderr)
   212  	data := vdata
   213  	bpp := img.Depth
   214  	repl := 0
   215  	if img.Flags&memdraw.Frepl != 0 {
   216  		repl = 1
   217  	}
   218  	fmt.Fprintf(b, "%s\t%d\tr %v clipr %v repl %d data %p *%v\n", name, r.Min.X, r, img.Clipr, repl, vdata, labelpt)
   219  	mask := (uint32(1) << bpp) - 1
   220  	/*	for(y=r.Min.Y; y<r.Max.Y; y++){ */
   221  	for y := 0; y < Yrange; y++ {
   222  		nb := 0
   223  		v := uint32(0)
   224  		p := data[(-len(img.BytesAt(draw.Pt(0, y))) + len(img.Data.Bdata)):]
   225  		fmt.Fprintf(b, "%-4d\t", y)
   226  		/*		for(x=r.Min.X; x<r.Max.X; x++){ */
   227  		for x := 0; x < Xrange; x++ {
   228  			if x == 0 {
   229  				fmt.Fprintf(b, "\t")
   230  			}
   231  
   232  			if x != 0 && (x%8) == 0 {
   233  				fmt.Fprintf(b, " ")
   234  			}
   235  
   236  			npr := 0
   237  			if x == labelpt.X && y == labelpt.Y {
   238  				fmt.Fprintf(b, "*")
   239  				npr++
   240  			}
   241  			if npr == 0 {
   242  				fmt.Fprintf(b, " ")
   243  			}
   244  
   245  			for nb < bpp {
   246  				v &= (1 << nb) - 1
   247  				v |= uint32(p[0]) << nb
   248  				p = p[1:]
   249  				nb += 8
   250  			}
   251  			nb -= bpp
   252  			/*			fmt.Fprintf(os.Stderr, "bpp %d v %.8x mask %.8x nb %d\n", bpp, v, mask, nb); */
   253  			fmt_(b, format, (v>>nb)&mask)
   254  		}
   255  		fmt.Fprintf(b, "\n")
   256  	}
   257  	b.Flush()
   258  }
   259  
   260  /*
   261   * Verify that the destination pixel has the specified value.
   262   * The value is in the high bits of v, suitably masked, but must
   263   * be extracted from the destination memdraw.Image.
   264   */
   265  func checkone(p draw.Point, sp draw.Point, mp draw.Point) {
   266  	delta := -len(dst.BytesAt(p)) - -len(dst.Data.Bdata)
   267  	dp := dst.Data.Bdata[delta:]
   268  	sdp := savedstbits[delta:]
   269  	w := (dst.Depth + 7) / 8
   270  
   271  	if !bytes.Equal(dp[:w], sdp[:w]) {
   272  		fmt.Fprintf(os.Stderr, "dtest: one bad pixel drawing at dst %v from source %v mask %v\n", p, sp, mp)
   273  		fmt.Fprintf(os.Stderr, " %x should be %x\n", dp[:w], sdp[:w])
   274  		fmt.Fprintf(os.Stderr, "addresses dst %p src %p mask %p\n", dp, src.BytesAt(sp), mask.BytesAt(mp))
   275  		dumpimage("src", src, src.Data.Bdata, sp)
   276  		dumpimage("mask", mask, mask.Data.Bdata, mp)
   277  		dumpimage("origdst", dst, dstbits, p)
   278  		dumpimage("dst", dst, dst.Data.Bdata, p)
   279  		dumpimage("gooddst", dst, savedstbits, p)
   280  		panic("fail")
   281  	}
   282  }
   283  
   284  /*
   285   * Verify that the destination line has the same value as the saved line.
   286   */
   287  // #define RECTPTS(r) (r).Min.X, (r).Min.Y, (r).Max.X, (r).Max.Y
   288  func checkline(r draw.Rectangle, sp draw.Point, mp draw.Point, y int, stmp *memdraw.Image, mtmp *memdraw.Image) {
   289  	dp := dst.BytesAt(draw.Pt(0, y))
   290  	saved := savedstbits[y*int(dst.Width)*4:]
   291  	var nb int
   292  	if dst.Depth < 8 {
   293  		nb = Xrange / (8 / dst.Depth)
   294  	} else {
   295  		nb = Xrange * (dst.Depth / 8)
   296  	}
   297  	if !bytes.Equal(dp[:nb], saved[:nb]) {
   298  		fmt.Fprintf(os.Stderr, "dtest: bad line at y=%d; saved %p dp %p\n", y, saved, dp)
   299  		fmt.Fprintf(os.Stderr, "draw dst %v src %v mask %v\n", r, sp, mp)
   300  		dumpimage("src", src, src.Data.Bdata, sp)
   301  		if stmp != nil {
   302  			dumpimage("stmp", stmp, stmp.Data.Bdata, sp)
   303  		}
   304  		dumpimage("mask", mask, mask.Data.Bdata, mp)
   305  		if mtmp != nil {
   306  			dumpimage("mtmp", mtmp, mtmp.Data.Bdata, mp)
   307  		}
   308  		dumpimage("origdst", dst, dstbits, r.Min)
   309  		dumpimage("dst", dst, dst.Data.Bdata, r.Min)
   310  		dumpimage("gooddst", dst, savedstbits, r.Min)
   311  		panic("fail")
   312  	}
   313  }
   314  
   315  /*
   316   * Fill the bits of an image with random data.
   317   * The memdraw.Image parameter is used only to make sure
   318   * the data is well formatted: only ucbits is written.
   319   */
   320  func fill(img *memdraw.Image, ucbits []uint8) {
   321  	if img.Flags&memdraw.Falpha == 0 {
   322  		up := ucbits
   323  		var i int
   324  		for i = 0; i < nbytes/2; i++ {
   325  			up[0] = byte(rand.Int() >> 7)
   326  			up = up[1:]
   327  		}
   328  		if i+i != nbytes {
   329  			up[0] = byte(rand.Int() >> 7)
   330  		}
   331  	} else {
   332  		data := img.Data.Bdata
   333  		img.Data.Bdata = ucbits
   334  
   335  		for x := img.R.Min.X; x < img.R.Max.X; x++ {
   336  			for y := img.R.Min.Y; y < img.R.Max.Y; y++ {
   337  				alpha := rand.Int() >> 4
   338  				r := uint8(rand.Int() % (alpha + 1))
   339  				g := uint8(rand.Int() % (alpha + 1))
   340  				b := uint8(rand.Int() % (alpha + 1))
   341  				putpixel(img, draw.Pt(x, y), rgbatopix(r, g, b, uint8(alpha)))
   342  			}
   343  		}
   344  		img.Data.Bdata = data
   345  	}
   346  
   347  }
   348  
   349  func memmove(x, y []byte, n int) {
   350  	copy(x[:n], y[:n])
   351  }
   352  func memset(x []byte, v byte, n int) {
   353  	x = x[:n]
   354  	for i := range x {
   355  		x[i] = v
   356  	}
   357  }
   358  
   359  func assert(b bool) {
   360  	if !b {
   361  		panic("assert")
   362  	}
   363  }
   364  
   365  /*
   366   * Mask is preset; do the rest
   367   */
   368  func verifyonemask() {
   369  	fill(dst, dstbits)
   370  	fill(src, srcbits)
   371  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   372  	memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange)
   373  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   374  	var dp draw.Point
   375  
   376  	dp.X = rand.Intn(Xrange)
   377  	dp.Y = rand.Intn(Yrange)
   378  	var sp draw.Point
   379  
   380  	sp.X = rand.Intn(Xrange)
   381  	sp.Y = rand.Intn(Yrange)
   382  	var mp draw.Point
   383  
   384  	mp.X = rand.Intn(Xrange)
   385  	mp.Y = rand.Intn(Yrange)
   386  
   387  	drawonepixel(dst, dp, src, sp, mask, mp)
   388  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   389  	memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange)
   390  
   391  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   392  	dst.Draw(draw.Rect(dp.X, dp.Y, dp.X+1, dp.Y+1), src, sp, mask, mp, draw.SoverD)
   393  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   394  
   395  	checkone(dp, sp, mp)
   396  }
   397  
   398  func verifyone() {
   399  	/* mask all zeros */
   400  	memset(maskbits, 0, nbytes)
   401  	var i int
   402  	for i = 0; i < niters; i++ {
   403  		verifyonemask()
   404  	}
   405  
   406  	/* mask all ones */
   407  	memset(maskbits, 0xFF, nbytes)
   408  	for i = 0; i < niters; i++ {
   409  		verifyonemask()
   410  	}
   411  
   412  	/* random mask */
   413  	for i = 0; i < niters; i++ {
   414  		fill(mask, maskbits)
   415  		verifyonemask()
   416  	}
   417  }
   418  
   419  /*
   420   * Mask is preset; do the rest
   421   */
   422  func verifylinemask() {
   423  	if Xrange <= 1 || Yrange <= 1 {
   424  		return
   425  	}
   426  	fill(dst, dstbits)
   427  	fill(src, srcbits)
   428  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   429  	memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange)
   430  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   431  	var dr draw.Rectangle
   432  
   433  	dr.Min.X = rand.Intn(Xrange - 1)
   434  	dr.Min.Y = rand.Intn(Yrange - 1)
   435  	dr.Max.X = dr.Min.X + 1 + rand.Intn(Xrange-1-dr.Min.X)
   436  	dr.Max.Y = dr.Min.Y + 1
   437  	var sp draw.Point
   438  
   439  	sp.X = rand.Intn(Xrange)
   440  	sp.Y = rand.Intn(Yrange)
   441  	var mp draw.Point
   442  
   443  	mp.X = rand.Intn(Xrange)
   444  	mp.Y = rand.Intn(Yrange)
   445  
   446  	tp := sp
   447  	up := mp
   448  	for x := dr.Min.X; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() {
   449  		dst.Draw(draw.Rect(x, dr.Min.Y, x+1, dr.Min.Y+1), src, tp, mask, up, draw.SoverD)
   450  	}
   451  	memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange)
   452  
   453  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   454  
   455  	dst.Draw(dr, src, sp, mask, mp, draw.SoverD)
   456  	checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), dr.Min.Y, nil, nil)
   457  }
   458  
   459  func verifyline() {
   460  	/* mask all ones */
   461  	memset(maskbits, 0xFF, nbytes)
   462  	var i int
   463  	for i = 0; i < niters; i++ {
   464  		verifylinemask()
   465  	}
   466  
   467  	/* mask all zeros */
   468  	memset(maskbits, 0, nbytes)
   469  	for i = 0; i < niters; i++ {
   470  		verifylinemask()
   471  	}
   472  
   473  	/* random mask */
   474  	for i = 0; i < niters; i++ {
   475  		fill(mask, maskbits)
   476  		verifylinemask()
   477  	}
   478  }
   479  
   480  /*
   481   * Mask is preset; do the rest
   482   */
   483  func verifyrectmask() {
   484  	if Xrange <= 1 || Yrange <= 1 {
   485  		return
   486  	}
   487  	fill(dst, dstbits)
   488  	fill(src, srcbits)
   489  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   490  	memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange)
   491  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   492  	var dr draw.Rectangle
   493  
   494  	dr.Min.X = rand.Intn(Xrange - 1)
   495  	dr.Min.Y = rand.Intn(Yrange - 1)
   496  	dr.Max.X = dr.Min.X + 1 + rand.Intn(Xrange-1-dr.Min.X)
   497  	dr.Max.Y = dr.Min.Y + 1 + rand.Intn(Yrange-1-dr.Min.Y)
   498  	var sp draw.Point
   499  
   500  	sp.X = rand.Intn(Xrange)
   501  	sp.Y = rand.Intn(Yrange)
   502  	var mp draw.Point
   503  
   504  	mp.X = rand.Intn(Xrange)
   505  	mp.Y = rand.Intn(Yrange)
   506  
   507  	tp := sp
   508  	up := mp
   509  	var y int
   510  	for y = dr.Min.Y; y < dr.Max.Y && tp.Y < Yrange && up.Y < Yrange; func() { y++; tp.Y++; up.Y++ }() {
   511  		for x := dr.Min.X; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() {
   512  			dst.Draw(draw.Rect(x, y, x+1, y+1), src, tp, mask, up, draw.SoverD)
   513  		}
   514  		tp.X = sp.X
   515  		up.X = mp.X
   516  	}
   517  	memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange)
   518  
   519  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   520  
   521  	dst.Draw(dr, src, sp, mask, mp, draw.SoverD)
   522  	for y = 0; y < Yrange; y++ {
   523  		checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), y, nil, nil)
   524  	}
   525  }
   526  
   527  func verifyrect() {
   528  	/* mask all zeros */
   529  	memset(maskbits, 0, nbytes)
   530  	var i int
   531  	for i = 0; i < niters; i++ {
   532  		verifyrectmask()
   533  	}
   534  
   535  	/* mask all ones */
   536  	memset(maskbits, 0xFF, nbytes)
   537  	for i = 0; i < niters; i++ {
   538  		verifyrectmask()
   539  	}
   540  
   541  	/* random mask */
   542  	for i = 0; i < niters; i++ {
   543  		fill(mask, maskbits)
   544  		verifyrectmask()
   545  	}
   546  }
   547  
   548  func randrect() draw.Rectangle {
   549  	var r draw.Rectangle
   550  	r.Min.X = rand.Intn(Xrange - 1)
   551  	r.Min.Y = rand.Intn(Yrange - 1)
   552  	r.Max.X = r.Min.X + 1 + rand.Intn(Xrange-1-r.Min.X)
   553  	r.Max.Y = r.Min.Y + 1 + rand.Intn(Yrange-1-r.Min.Y)
   554  	return r
   555  }
   556  
   557  /*
   558   * Return coordinate corresponding to x withing range [minx, maxx)
   559   */
   560  func tilexy(minx int, maxx int, x int) int {
   561  	sx := (x - minx) % (maxx - minx)
   562  	if sx < 0 {
   563  		sx += maxx - minx
   564  	}
   565  	return sx + minx
   566  }
   567  
   568  func replicate(i *memdraw.Image, tmp *memdraw.Image) {
   569  	var r draw.Rectangle
   570  	/* choose the replication window (i->r) */
   571  	r.Min.X = rand.Intn(Xrange - 1)
   572  	r.Min.Y = rand.Intn(Yrange - 1)
   573  	/* make it trivial more often than pure chance allows */
   574  	switch rand.Int() & 0 {
   575  	case 1:
   576  		r.Max.X = r.Min.X + 2
   577  		r.Max.Y = r.Min.Y + 2
   578  		if r.Max.X < Xrange && r.Max.Y < Yrange {
   579  			break
   580  		}
   581  		fallthrough
   582  	/* fall through */
   583  	case 0:
   584  		r.Max.X = r.Min.X + 1
   585  		r.Max.Y = r.Min.Y + 1
   586  	default:
   587  		if r.Min.X+3 >= Xrange {
   588  			r.Max.X = Xrange
   589  		} else {
   590  			r.Max.X = r.Min.X + 3 + rand.Intn(Xrange-(r.Min.X+3))
   591  		}
   592  
   593  		if r.Min.Y+3 >= Yrange {
   594  			r.Max.Y = Yrange
   595  		} else {
   596  			r.Max.Y = r.Min.Y + 3 + rand.Intn(Yrange-(r.Min.Y+3))
   597  		}
   598  	}
   599  	assert(r.Min.X >= 0)
   600  	assert(r.Max.X <= Xrange)
   601  	assert(r.Min.Y >= 0)
   602  	assert(r.Max.Y <= Yrange)
   603  	/* copy from i to tmp so we have just the replicated bits */
   604  	nb := int(tmp.Width) * 4 * Yrange
   605  	memset(tmp.Data.Bdata, 0, nb)
   606  	tmp.Draw(r, i, r.Min, ones, r.Min, draw.SoverD)
   607  	memmove(i.Data.Bdata, tmp.Data.Bdata, nb)
   608  	/* i is now a non-replicated instance of the replication */
   609  	/* replicate it by hand through tmp */
   610  	memset(tmp.Data.Bdata, 0, nb)
   611  	x := -(tilexy(r.Min.X, r.Max.X, 0) - r.Min.X)
   612  	for ; x < Xrange; x += r.Dx() {
   613  		y := -(tilexy(r.Min.Y, r.Max.Y, 0) - r.Min.Y)
   614  		for ; y < Yrange; y += r.Dy() {
   615  			var r1 draw.Rectangle
   616  			/* set r1 to instance of tile by translation */
   617  			r1.Min.X = x
   618  			r1.Min.Y = y
   619  			r1.Max.X = r1.Min.X + r.Dx()
   620  			r1.Max.Y = r1.Min.Y + r.Dy()
   621  			tmp.Draw(r1, i, r.Min, ones, r.Min, draw.SoverD)
   622  		}
   623  	}
   624  	i.Flags |= memdraw.Frepl
   625  	i.R = r
   626  	i.Clipr = randrect()
   627  	/*	fprint(2, "replicate [[%d %d] [%d %d]] [[%d %d][%d %d]]\n", r.Min.X, r.Min.Y, r.Max.X, r.Max.Y, */
   628  	/*		i->clipr.Min.X, i->clipr.Min.Y, i->clipr.Max.X, i->clipr.Max.Y); */
   629  	tmp.Clipr = i.Clipr
   630  }
   631  
   632  /*
   633   * Mask is preset; do the rest
   634   */
   635  func verifyrectmaskrepl(srcrepl int, maskrepl int) {
   636  	/*	fmt.Fprintf(os.Stderr, "verfrect %d %d\n", srcrepl, maskrepl); */
   637  	src.Flags &^= memdraw.Frepl
   638  	src.R = draw.Rect(0, 0, Xrange, Yrange)
   639  	src.Clipr = src.R
   640  	stmp.Flags &^= memdraw.Frepl
   641  	stmp.R = draw.Rect(0, 0, Xrange, Yrange)
   642  	stmp.Clipr = src.R
   643  	mask.Flags &^= memdraw.Frepl
   644  	mask.R = draw.Rect(0, 0, Xrange, Yrange)
   645  	mask.Clipr = mask.R
   646  	mtmp.Flags &^= memdraw.Frepl
   647  	mtmp.R = draw.Rect(0, 0, Xrange, Yrange)
   648  	mtmp.Clipr = mask.R
   649  
   650  	fill(dst, dstbits)
   651  	fill(src, srcbits)
   652  
   653  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   654  	memmove(src.Data.Bdata, srcbits, int(src.Width)*4*Yrange)
   655  	memmove(mask.Data.Bdata, maskbits, int(mask.Width)*4*Yrange)
   656  	var s *memdraw.Image
   657  
   658  	if srcrepl != 0 {
   659  		replicate(src, stmp)
   660  		s = stmp
   661  	} else {
   662  		s = src
   663  	}
   664  	var m *memdraw.Image
   665  	if maskrepl != 0 {
   666  		replicate(mask, mtmp)
   667  		m = mtmp
   668  	} else {
   669  		m = mask
   670  	}
   671  
   672  	dr := randrect()
   673  	var sp draw.Point
   674  
   675  	sp.X = rand.Intn(Xrange)
   676  	sp.Y = rand.Intn(Yrange)
   677  	var mp draw.Point
   678  
   679  	mp.X = rand.Intn(Xrange)
   680  	mp.Y = rand.Intn(Yrange)
   681  
   682  	if DBG != 0 {
   683  		fmt.Fprintf(os.Stderr, "smalldraws\n")
   684  	}
   685  	var tp draw.Point
   686  	tp.Y = sp.Y
   687  	var up draw.Point
   688  	up.Y = mp.Y
   689  	y := dr.Min.Y
   690  	for ; y < dr.Max.Y && tp.Y < Yrange && up.Y < Yrange; func() { y++; tp.Y++; up.Y++ }() {
   691  		tp.X = sp.X
   692  		up.X = mp.X
   693  		x := dr.Min.X
   694  		for ; x < dr.Max.X && tp.X < Xrange && up.X < Xrange; func() { x++; tp.X++; up.X++ }() {
   695  			dst.Draw(draw.Rect(x, y, x+1, y+1), s, tp, m, up, draw.SoverD)
   696  		}
   697  	}
   698  	memmove(savedstbits, dst.Data.Bdata, int(dst.Width)*4*Yrange)
   699  
   700  	memmove(dst.Data.Bdata, dstbits, int(dst.Width)*4*Yrange)
   701  
   702  	if DBG != 0 {
   703  		fmt.Fprintf(os.Stderr, "bigdraw\n")
   704  	}
   705  	dst.Draw(dr, src, sp, mask, mp, draw.SoverD)
   706  	for y = 0; y < Yrange; y++ {
   707  		stmp := stmp
   708  		if srcrepl == 0 {
   709  			stmp = nil
   710  		}
   711  		mtmp := mtmp
   712  		if maskrepl == 0 {
   713  			mtmp = nil
   714  		}
   715  		checkline(dr, draw.Repl(src.R, sp), draw.Repl(mask.R, mp), y, stmp, mtmp)
   716  	}
   717  }
   718  
   719  func verifyrectrepl(srcrepl int, maskrepl int) {
   720  	if Xrange <= 1 || Yrange <= 1 {
   721  		return
   722  	}
   723  	/* mask all ones */
   724  	memset(maskbits, 0xFF, nbytes)
   725  	var i int
   726  	for i = 0; i < niters; i++ {
   727  		verifyrectmaskrepl(srcrepl, maskrepl)
   728  	}
   729  
   730  	/* mask all zeros */
   731  	memset(maskbits, 0, nbytes)
   732  	for i = 0; i < niters; i++ {
   733  		verifyrectmaskrepl(srcrepl, maskrepl)
   734  	}
   735  
   736  	/* random mask */
   737  	for i = 0; i < niters; i++ {
   738  		fill(mask, maskbits)
   739  		verifyrectmaskrepl(srcrepl, maskrepl)
   740  	}
   741  }
   742  
   743  /*
   744   * Trivial draw implementation.
   745   * Color values are passed around as u32ints containing ααRRGGBB
   746   */
   747  
   748  /*
   749   * Convert v, which is nhave bits wide, into its nwant bits wide equivalent.
   750   * Replicates to widen the value, truncates to narrow it.
   751   */
   752  func replbits(v uint32, nhave, nwant uint) uint32 {
   753  	v &= (1 << nhave) - 1
   754  	for ; nhave < nwant; nhave *= 2 {
   755  		v |= v << nhave
   756  	}
   757  	v >>= (nhave - nwant)
   758  	return v & ((1 << nwant) - 1)
   759  }
   760  
   761  /*
   762   * Decode a pixel into the uchar* values.
   763   */
   764  func pixtorgba(v uint32) (r, g, b, a uint8) {
   765  	a = uint8(v >> 24)
   766  	r = uint8(v >> 16)
   767  	g = uint8(v >> 8)
   768  	b = uint8(v)
   769  	return
   770  }
   771  
   772  /*
   773   * Convert uchar channels into u32int pixel.
   774   */
   775  func rgbatopix(r uint8, g uint8, b uint8, a uint8) uint32 {
   776  	return uint32(a)<<24 | uint32(r)<<16 | uint32(g)<<8 | uint32(b)
   777  }
   778  
   779  /*
   780   * Retrieve the pixel value at pt in the image.
   781   */
   782  func getpixel(img *memdraw.Image, pt draw.Point) uint32 {
   783  	var r, g, b, a uint8
   784  	a = ^uint8(0) /* default alpha is full */
   785  
   786  	p := img.BytesAt(pt)
   787  	v := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
   788  	bpp := uint(img.Depth)
   789  	if bpp < 8 {
   790  		/*
   791  		 * Sub-byte greyscale pixels.
   792  		 *
   793  		 * We want to throw away the top pt.X%npack pixels and then use the next bpp bits
   794  		 * in the bottom byte of v.  This madness is due to having big endian bits
   795  		 * but little endian bytes.
   796  		 */
   797  		npack := 8 / bpp
   798  		v >>= 8 - bpp*(uint(pt.X)%npack+1)
   799  		v &= (1 << bpp) - 1
   800  		b = uint8(replbits(uint32(v), bpp, 8))
   801  		g = b
   802  		r = g
   803  	} else {
   804  		/*
   805  		 * General case.  We need to parse the channel descriptor and do what it says.
   806  		 * In all channels but the color map, we replicate to 8 bits because that's the
   807  		 * precision that all calculations are done at.
   808  		 *
   809  		 * In the case of the color map, we leave the bits alone, in case a color map
   810  		 * with less than 8 bits of index is used.  This is currently disallowed, so it's
   811  		 * sort of silly.
   812  		 */
   813  
   814  		for c := img.Pix; c != 0; c >>= 8 {
   815  			nbits := uint(c & 15)
   816  			typ := int(c>>4) & 15
   817  			bits := v & ((1 << nbits) - 1)
   818  			rbits := uint8(replbits(uint32(bits), nbits, 8))
   819  			v >>= nbits
   820  			switch typ {
   821  			case draw.CRed:
   822  				r = rbits
   823  			case draw.CGreen:
   824  				g = rbits
   825  			case draw.CBlue:
   826  				b = rbits
   827  			case draw.CGrey:
   828  				b = rbits
   829  				g = b
   830  				r = g
   831  			case draw.CAlpha:
   832  				a = rbits
   833  			case draw.CMap:
   834  				p = cmap2rgb[3*int(bits):]
   835  				r = p[0]
   836  				g = p[1]
   837  				b = p[2]
   838  				if DBG != 0 {
   839  					fmt.Fprintf(os.Stderr, "%x -> %x %x %x\n", bits, r, g, b)
   840  				}
   841  			case draw.CIgnore:
   842  				break
   843  			default:
   844  				fmt.Fprintf(os.Stderr, "unknown channel type %d\n", typ)
   845  				panic("channel")
   846  			}
   847  		}
   848  	}
   849  	return rgbatopix(r, g, b, a)
   850  }
   851  
   852  /*
   853   * Return the greyscale equivalent of a pixel.
   854   */
   855  func getgrey(img *memdraw.Image, pt draw.Point) uint8 {
   856  	rgba := getpixel(img, pt)
   857  	r, g, b, _ := pixtorgba(rgba)
   858  	return RGB2K(r, g, b)
   859  }
   860  
   861  /*
   862   * Return the value at pt in image, if image is interpreted
   863   * as a mask.  This means the alpha channel if present, else
   864   * the greyscale or its computed equivalent.
   865   */
   866  func getmask(img *memdraw.Image, pt draw.Point) uint8 {
   867  	if img.Flags&memdraw.Falpha != 0 {
   868  		return uint8(getpixel(img, pt) >> 24)
   869  	} else {
   870  		return getgrey(img, pt)
   871  	}
   872  }
   873  
   874  // #undef DBG
   875  
   876  // #define DBG 0
   877  /*
   878   * Write a pixel to img at point pt.
   879   *
   880   * We do this by reading a 32-bit little endian
   881   * value from p and then writing it back
   882   * after tweaking the appropriate bits.  Because
   883   * the data is little endian, we don't have to worry
   884   * about what the actual depth is, as long as it is
   885   * less than 32 bits.
   886   */
   887  func putpixel(img *memdraw.Image, pt draw.Point, nv uint32) {
   888  	r, g, b, a := pixtorgba(nv)
   889  
   890  	p := img.BytesAt(pt)
   891  	v := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
   892  	bpp := uint(img.Depth)
   893  	if DBG != 0 {
   894  		fmt.Fprintf(os.Stderr, "v %.8x...", v)
   895  	}
   896  	if bpp < 8 {
   897  		/*
   898  		 * Sub-byte greyscale pixels.  We need to skip the leftmost pt.X%npack pixels,
   899  		 * which is equivalent to skipping the rightmost npack - pt.X%npack - 1 pixels.
   900  		 */
   901  		npack := 8 / bpp
   902  		sh := bpp * (npack - uint(pt.X)%npack - 1)
   903  		bits := RGB2K(r, g, b)
   904  		if DBG != 0 {
   905  			fmt.Fprintf(os.Stderr, "repl %x 8 %d = %x...", bits, bpp, replbits(uint32(bits), 8, bpp))
   906  		}
   907  		bits = uint8(replbits(uint32(bits), 8, bpp))
   908  		mask := uint32(1<<bpp) - 1
   909  		if DBG != 0 {
   910  			fmt.Fprintf(os.Stderr, "bits %x mask %x sh %d...", bits, mask, sh)
   911  		}
   912  		mask <<= sh
   913  		bits <<= sh
   914  		if DBG != 0 {
   915  			fmt.Fprintf(os.Stderr, "(%x & %x) | (%x & %x)", v, ^mask, bits, mask)
   916  		}
   917  		v = v&^mask | uint32(bits)&mask
   918  	} else {
   919  		/*
   920  		 * General case.  We need to parse the channel descriptor again.
   921  		 */
   922  		sh := uint(0)
   923  		for c := img.Pix; c != 0; c >>= 8 {
   924  			nbits := uint(c & 15)
   925  			typ := int(c>>4) & 15
   926  			var q []uint8
   927  			var bits uint32
   928  			switch typ {
   929  			case draw.CRed:
   930  				bits = uint32(r)
   931  			case draw.CGreen:
   932  				bits = uint32(g)
   933  			case draw.CBlue:
   934  				bits = uint32(b)
   935  			case draw.CGrey:
   936  				bits = uint32(RGB2K(r, g, b))
   937  			case draw.CAlpha:
   938  				bits = uint32(a)
   939  			case draw.CIgnore:
   940  				bits = 0
   941  			case draw.CMap:
   942  				q = rgb2cmap[:]
   943  				bits = uint32(q[(uint32(r)>>4)*16*16+(uint32(g)>>4)*16+(uint32(b)>>4)])
   944  				if DBG != 0 {
   945  					fmt.Fprintf(os.Stderr, "%x %x %x -> %x\n", r, g, b, bits)
   946  				}
   947  			default:
   948  				fmt.Fprintf(os.Stderr, "unknown channel type %d\n", typ)
   949  				panic("channel")
   950  			}
   951  
   952  			if DBG != 0 {
   953  				fmt.Fprintf(os.Stderr, "repl %x 8 %d = %x...", bits, nbits, replbits(uint32(bits), 8, nbits))
   954  			}
   955  			if typ != draw.CMap {
   956  				bits = replbits(uint32(bits), 8, nbits)
   957  			}
   958  			mask := uint32(1<<nbits) - 1
   959  			if DBG != 0 {
   960  				fmt.Fprintf(os.Stderr, "bits %x mask %x sh %d...", bits, mask, sh)
   961  			}
   962  			bits <<= sh
   963  			mask <<= sh
   964  			v = v&^mask | uint32(bits)&mask
   965  			sh += nbits
   966  		}
   967  	}
   968  	if DBG != 0 {
   969  		fmt.Fprintf(os.Stderr, "v %.8x\n", v)
   970  	}
   971  	p[0] = uint8(v)
   972  	p[1] = uint8(v >> 8)
   973  	p[2] = uint8(v >> 16)
   974  	p[3] = uint8(v >> 24)
   975  }
   976  
   977  func drawonepixel(dst *memdraw.Image, dp draw.Point, src *memdraw.Image, sp draw.Point, mask *memdraw.Image, mp draw.Point) {
   978  	dr, dg, db, da := pixtorgba(getpixel(dst, dp))
   979  	sr, sg, sb, sa := pixtorgba(getpixel(src, sp))
   980  	m := uint32(getmask(mask, mp))
   981  	M := 255 - (uint32(sa)*m+127)/255
   982  
   983  	if DBG != 0 {
   984  		fmt.Fprintf(os.Stderr, "dst %x %x %x %x src %x %x %x %x m %x M %x = ", dr, dg, db, da, sr, sg, sb, sa, m, M)
   985  	}
   986  	if dst.Flags&memdraw.Fgrey != 0 {
   987  		/*
   988  		 * We need to do the conversion to grey before the alpha calculation
   989  		 * because the draw operator does this, and we need to be operating
   990  		 * at the same precision so we get exactly the same answers.
   991  		 */
   992  		sk := RGB2K(sr, sg, sb)
   993  		dk := RGB2K(dr, dg, db)
   994  		dk = uint8((uint32(sk)*m + uint32(dk)*M + 127) / 255)
   995  		db = dk
   996  		dg = db
   997  		dr = dg
   998  		da = uint8((uint32(sa)*m + uint32(da)*M + 127) / 255)
   999  	} else {
  1000  		/*
  1001  		 * True color alpha calculation treats all channels (including alpha)
  1002  		 * the same.  It might have been nice to use an array, but oh well.
  1003  		 */
  1004  		dr = uint8((uint32(sr)*m + uint32(dr)*M + 127) / 255)
  1005  		dg = uint8((uint32(sg)*m + uint32(dg)*M + 127) / 255)
  1006  		db = uint8((uint32(sb)*m + uint32(db)*M + 127) / 255)
  1007  		da = uint8((uint32(sa)*m + uint32(da)*M + 127) / 255)
  1008  	}
  1009  
  1010  	if DBG != 0 {
  1011  		fmt.Fprintf(os.Stderr, "%x %x %x %x %x\n", dr, dg, db, da, rgbatopix(dr, dg, db, da))
  1012  	}
  1013  	putpixel(dst, dp, rgbatopix(dr, dg, db, da))
  1014  }
  1015  
  1016  var cmap2rgb = [...]uint8{
  1017  	0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00, 0x00,
  1018  	0x44, 0x44, 0x00, 0x44, 0x88, 0x00, 0x44, 0xcc, 0x00, 0x88, 0x00, 0x00, 0x88, 0x44, 0x00, 0x88,
  1019  	0x88, 0x00, 0x88, 0xcc, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0x44, 0x00, 0xcc, 0x88, 0x00, 0xcc, 0xcc,
  1020  	0x00, 0xdd, 0xdd, 0x11, 0x11, 0x11, 0x00, 0x00, 0x55, 0x00, 0x00, 0x99, 0x00, 0x00, 0xdd, 0x00,
  1021  	0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x4c, 0x99, 0x00, 0x49, 0xdd, 0x00, 0x99, 0x00, 0x00, 0x99,
  1022  	0x4c, 0x00, 0x99, 0x99, 0x00, 0x93, 0xdd, 0x00, 0xdd, 0x00, 0x00, 0xdd, 0x49, 0x00, 0xdd, 0x93,
  1023  	0x00, 0xee, 0x9e, 0x00, 0xee, 0xee, 0x22, 0x22, 0x22, 0x00, 0x00, 0x66, 0x00, 0x00, 0xaa, 0x00,
  1024  	0x00, 0xee, 0x00, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00, 0x55, 0xaa, 0x00, 0x4f, 0xee, 0x00, 0xaa,
  1025  	0x00, 0x00, 0xaa, 0x55, 0x00, 0xaa, 0xaa, 0x00, 0x9e, 0xee, 0x00, 0xee, 0x00, 0x00, 0xee, 0x4f,
  1026  	0x00, 0xff, 0x55, 0x00, 0xff, 0xaa, 0x00, 0xff, 0xff, 0x33, 0x33, 0x33, 0x00, 0x00, 0x77, 0x00,
  1027  	0x00, 0xbb, 0x00, 0x00, 0xff, 0x00, 0x77, 0x00, 0x00, 0x77, 0x77, 0x00, 0x5d, 0xbb, 0x00, 0x55,
  1028  	0xff, 0x00, 0xbb, 0x00, 0x00, 0xbb, 0x5d, 0x00, 0xbb, 0xbb, 0x00, 0xaa, 0xff, 0x00, 0xff, 0x00,
  1029  	0x44, 0x00, 0x44, 0x44, 0x00, 0x88, 0x44, 0x00, 0xcc, 0x44, 0x44, 0x00, 0x44, 0x44, 0x44, 0x44,
  1030  	0x44, 0x88, 0x44, 0x44, 0xcc, 0x44, 0x88, 0x00, 0x44, 0x88, 0x44, 0x44, 0x88, 0x88, 0x44, 0x88,
  1031  	0xcc, 0x44, 0xcc, 0x00, 0x44, 0xcc, 0x44, 0x44, 0xcc, 0x88, 0x44, 0xcc, 0xcc, 0x44, 0x00, 0x00,
  1032  	0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x4c, 0x00, 0x99, 0x49, 0x00, 0xdd, 0x55, 0x55, 0x00, 0x55,
  1033  	0x55, 0x55, 0x4c, 0x4c, 0x99, 0x49, 0x49, 0xdd, 0x4c, 0x99, 0x00, 0x4c, 0x99, 0x4c, 0x4c, 0x99,
  1034  	0x99, 0x49, 0x93, 0xdd, 0x49, 0xdd, 0x00, 0x49, 0xdd, 0x49, 0x49, 0xdd, 0x93, 0x49, 0xdd, 0xdd,
  1035  	0x4f, 0xee, 0xee, 0x66, 0x00, 0x00, 0x66, 0x00, 0x66, 0x55, 0x00, 0xaa, 0x4f, 0x00, 0xee, 0x66,
  1036  	0x66, 0x00, 0x66, 0x66, 0x66, 0x55, 0x55, 0xaa, 0x4f, 0x4f, 0xee, 0x55, 0xaa, 0x00, 0x55, 0xaa,
  1037  	0x55, 0x55, 0xaa, 0xaa, 0x4f, 0x9e, 0xee, 0x4f, 0xee, 0x00, 0x4f, 0xee, 0x4f, 0x4f, 0xee, 0x9e,
  1038  	0x55, 0xff, 0xaa, 0x55, 0xff, 0xff, 0x77, 0x00, 0x00, 0x77, 0x00, 0x77, 0x5d, 0x00, 0xbb, 0x55,
  1039  	0x00, 0xff, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x5d, 0x5d, 0xbb, 0x55, 0x55, 0xff, 0x5d, 0xbb,
  1040  	0x00, 0x5d, 0xbb, 0x5d, 0x5d, 0xbb, 0xbb, 0x55, 0xaa, 0xff, 0x55, 0xff, 0x00, 0x55, 0xff, 0x55,
  1041  	0x88, 0x00, 0x88, 0x88, 0x00, 0xcc, 0x88, 0x44, 0x00, 0x88, 0x44, 0x44, 0x88, 0x44, 0x88, 0x88,
  1042  	0x44, 0xcc, 0x88, 0x88, 0x00, 0x88, 0x88, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0xcc, 0x88, 0xcc,
  1043  	0x00, 0x88, 0xcc, 0x44, 0x88, 0xcc, 0x88, 0x88, 0xcc, 0xcc, 0x88, 0x00, 0x00, 0x88, 0x00, 0x44,
  1044  	0x99, 0x00, 0x4c, 0x99, 0x00, 0x99, 0x93, 0x00, 0xdd, 0x99, 0x4c, 0x00, 0x99, 0x4c, 0x4c, 0x99,
  1045  	0x4c, 0x99, 0x93, 0x49, 0xdd, 0x99, 0x99, 0x00, 0x99, 0x99, 0x4c, 0x99, 0x99, 0x99, 0x93, 0x93,
  1046  	0xdd, 0x93, 0xdd, 0x00, 0x93, 0xdd, 0x49, 0x93, 0xdd, 0x93, 0x93, 0xdd, 0xdd, 0x99, 0x00, 0x00,
  1047  	0xaa, 0x00, 0x00, 0xaa, 0x00, 0x55, 0xaa, 0x00, 0xaa, 0x9e, 0x00, 0xee, 0xaa, 0x55, 0x00, 0xaa,
  1048  	0x55, 0x55, 0xaa, 0x55, 0xaa, 0x9e, 0x4f, 0xee, 0xaa, 0xaa, 0x00, 0xaa, 0xaa, 0x55, 0xaa, 0xaa,
  1049  	0xaa, 0x9e, 0x9e, 0xee, 0x9e, 0xee, 0x00, 0x9e, 0xee, 0x4f, 0x9e, 0xee, 0x9e, 0x9e, 0xee, 0xee,
  1050  	0xaa, 0xff, 0xff, 0xbb, 0x00, 0x00, 0xbb, 0x00, 0x5d, 0xbb, 0x00, 0xbb, 0xaa, 0x00, 0xff, 0xbb,
  1051  	0x5d, 0x00, 0xbb, 0x5d, 0x5d, 0xbb, 0x5d, 0xbb, 0xaa, 0x55, 0xff, 0xbb, 0xbb, 0x00, 0xbb, 0xbb,
  1052  	0x5d, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xff, 0xaa, 0xff, 0x00, 0xaa, 0xff, 0x55, 0xaa, 0xff, 0xaa,
  1053  	0xcc, 0x00, 0xcc, 0xcc, 0x44, 0x00, 0xcc, 0x44, 0x44, 0xcc, 0x44, 0x88, 0xcc, 0x44, 0xcc, 0xcc,
  1054  	0x88, 0x00, 0xcc, 0x88, 0x44, 0xcc, 0x88, 0x88, 0xcc, 0x88, 0xcc, 0xcc, 0xcc, 0x00, 0xcc, 0xcc,
  1055  	0x44, 0xcc, 0xcc, 0x88, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0xcc, 0x00, 0x44, 0xcc, 0x00, 0x88,
  1056  	0xdd, 0x00, 0x93, 0xdd, 0x00, 0xdd, 0xdd, 0x49, 0x00, 0xdd, 0x49, 0x49, 0xdd, 0x49, 0x93, 0xdd,
  1057  	0x49, 0xdd, 0xdd, 0x93, 0x00, 0xdd, 0x93, 0x49, 0xdd, 0x93, 0x93, 0xdd, 0x93, 0xdd, 0xdd, 0xdd,
  1058  	0x00, 0xdd, 0xdd, 0x49, 0xdd, 0xdd, 0x93, 0xdd, 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0xdd, 0x00, 0x49,
  1059  	0xee, 0x00, 0x4f, 0xee, 0x00, 0x9e, 0xee, 0x00, 0xee, 0xee, 0x4f, 0x00, 0xee, 0x4f, 0x4f, 0xee,
  1060  	0x4f, 0x9e, 0xee, 0x4f, 0xee, 0xee, 0x9e, 0x00, 0xee, 0x9e, 0x4f, 0xee, 0x9e, 0x9e, 0xee, 0x9e,
  1061  	0xee, 0xee, 0xee, 0x00, 0xee, 0xee, 0x4f, 0xee, 0xee, 0x9e, 0xee, 0xee, 0xee, 0xee, 0x00, 0x00,
  1062  	0xff, 0x00, 0x00, 0xff, 0x00, 0x55, 0xff, 0x00, 0xaa, 0xff, 0x00, 0xff, 0xff, 0x55, 0x00, 0xff,
  1063  	0x55, 0x55, 0xff, 0x55, 0xaa, 0xff, 0x55, 0xff, 0xff, 0xaa, 0x00, 0xff, 0xaa, 0x55, 0xff, 0xaa,
  1064  	0xaa, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x55, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff,
  1065  }
  1066  
  1067  var rgb2cmap = [...]uint8{
  1068  	0x00, 0x00, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1069  	0x00, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1070  	0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1071  	0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29,
  1072  	0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a,
  1073  	0x15, 0x15, 0x15, 0x05, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a,
  1074  	0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a,
  1075  	0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a,
  1076  	0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d,
  1077  	0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e,
  1078  	0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e,
  1079  	0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e,
  1080  	0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e,
  1081  	0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21,
  1082  	0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21,
  1083  	0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32,
  1084  	0x00, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1085  	0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1086  	0x11, 0x11, 0x22, 0x22, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1087  	0x04, 0x04, 0x22, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29,
  1088  	0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a,
  1089  	0x15, 0x15, 0x15, 0x05, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a,
  1090  	0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a,
  1091  	0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a,
  1092  	0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d,
  1093  	0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e,
  1094  	0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e,
  1095  	0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e,
  1096  	0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e,
  1097  	0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21,
  1098  	0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21,
  1099  	0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32,
  1100  	0x11, 0x11, 0x11, 0x01, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1101  	0x11, 0x11, 0x22, 0x22, 0x01, 0x12, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1102  	0x11, 0x22, 0x22, 0x22, 0x33, 0x33, 0x23, 0x34, 0x02, 0x13, 0x24, 0x35, 0x03, 0x14, 0x25, 0x36,
  1103  	0x04, 0x22, 0x22, 0x33, 0x33, 0x33, 0x05, 0x06, 0x06, 0x06, 0x17, 0x07, 0x07, 0x18, 0x18, 0x29,
  1104  	0x04, 0x04, 0x33, 0x33, 0x33, 0x05, 0x16, 0x06, 0x06, 0x17, 0x28, 0x07, 0x07, 0x18, 0x29, 0x3a,
  1105  	0x15, 0x15, 0x33, 0x33, 0x05, 0x16, 0x16, 0x06, 0x06, 0x17, 0x28, 0x39, 0x07, 0x18, 0x29, 0x3a,
  1106  	0x26, 0x26, 0x26, 0x05, 0x16, 0x16, 0x27, 0x27, 0x38, 0x28, 0x28, 0x39, 0x39, 0x29, 0x29, 0x3a,
  1107  	0x37, 0x37, 0x37, 0x09, 0x09, 0x09, 0x27, 0x38, 0x0a, 0x0a, 0x39, 0x0b, 0x0b, 0x0b, 0x1c, 0x3a,
  1108  	0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x38, 0x0a, 0x0a, 0x0a, 0x1b, 0x0b, 0x0b, 0x1c, 0x1c, 0x2d,
  1109  	0x19, 0x19, 0x19, 0x09, 0x1a, 0x1a, 0x2b, 0x0a, 0x0a, 0x1b, 0x1b, 0x0b, 0x0b, 0x1c, 0x2d, 0x3e,
  1110  	0x2a, 0x2a, 0x2a, 0x1a, 0x2b, 0x2b, 0x2b, 0x3c, 0x1b, 0x1b, 0x2c, 0x2c, 0x3d, 0x2d, 0x2d, 0x3e,
  1111  	0x3b, 0x3b, 0x3b, 0x0d, 0x0d, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x2c, 0x3d, 0x0f, 0x0f, 0x3e, 0x3e,
  1112  	0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x3c, 0x0e, 0x0e, 0x0e, 0x3d, 0x0f, 0x0f, 0x0f, 0x10, 0x3e,
  1113  	0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x2f, 0x0e, 0x1f, 0x1f, 0x20, 0x0f, 0x0f, 0x10, 0x10, 0x21,
  1114  	0x2e, 0x2e, 0x2e, 0x1e, 0x2f, 0x2f, 0x2f, 0x1f, 0x1f, 0x20, 0x20, 0x31, 0x10, 0x10, 0x21, 0x21,
  1115  	0x3f, 0x3f, 0x3f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x31, 0x31, 0x31, 0x21, 0x21, 0x32,
  1116  	0x4f, 0x4f, 0x22, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64,
  1117  	0x4f, 0x22, 0x22, 0x22, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64,
  1118  	0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x40, 0x41, 0x41, 0x41, 0x52, 0x42, 0x42, 0x53, 0x53, 0x64,
  1119  	0x43, 0x22, 0x33, 0x33, 0x33, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x46, 0x57, 0x68,
  1120  	0x43, 0x43, 0x33, 0x33, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x57, 0x57, 0x68,
  1121  	0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68,
  1122  	0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79,
  1123  	0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x5b, 0x79,
  1124  	0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x5a, 0x4a, 0x4a, 0x4a, 0x5b, 0x6c,
  1125  	0x47, 0x47, 0x47, 0x48, 0x48, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x5b, 0x6c,
  1126  	0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d,
  1127  	0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x6b, 0x4e, 0x4e, 0x4e, 0x6c, 0x7d,
  1128  	0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x5e, 0x4e, 0x4e, 0x4e, 0x5f, 0x5f,
  1129  	0x5c, 0x5c, 0x5c, 0x4c, 0x5d, 0x5d, 0x5d, 0x4d, 0x4d, 0x5e, 0x5e, 0x4e, 0x4e, 0x5f, 0x5f, 0x60,
  1130  	0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x6e, 0x6e, 0x5e, 0x5e, 0x5e, 0x6f, 0x6f, 0x5f, 0x5f, 0x60, 0x60,
  1131  	0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x5f, 0x60, 0x60, 0x71,
  1132  	0x4f, 0x4f, 0x40, 0x40, 0x40, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75,
  1133  	0x4f, 0x4f, 0x22, 0x40, 0x40, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75,
  1134  	0x43, 0x22, 0x33, 0x33, 0x33, 0x40, 0x51, 0x41, 0x41, 0x52, 0x63, 0x42, 0x42, 0x53, 0x64, 0x75,
  1135  	0x43, 0x43, 0x33, 0x33, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x56, 0x46, 0x46, 0x57, 0x57, 0x68,
  1136  	0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68,
  1137  	0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79,
  1138  	0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79,
  1139  	0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x5b, 0x79,
  1140  	0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x59, 0x49, 0x49, 0x49, 0x5a, 0x4a, 0x4a, 0x5b, 0x5b, 0x6c,
  1141  	0x58, 0x58, 0x58, 0x48, 0x59, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c,
  1142  	0x69, 0x69, 0x69, 0x59, 0x59, 0x6a, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d,
  1143  	0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x7b, 0x4d, 0x4d, 0x4d, 0x6b, 0x4e, 0x4e, 0x4e, 0x7d, 0x7d,
  1144  	0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x7b, 0x4d, 0x4d, 0x4d, 0x5e, 0x4e, 0x4e, 0x4e, 0x5f, 0x7d,
  1145  	0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, 0x4d, 0x5e, 0x5e, 0x5e, 0x4e, 0x4e, 0x5f, 0x5f, 0x60,
  1146  	0x6d, 0x6d, 0x6d, 0x5d, 0x6e, 0x6e, 0x6e, 0x5e, 0x5e, 0x6f, 0x6f, 0x70, 0x5f, 0x5f, 0x60, 0x60,
  1147  	0x7e, 0x7e, 0x7e, 0x6e, 0x6e, 0x7f, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x60, 0x60, 0x71,
  1148  	0x50, 0x50, 0x50, 0x40, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75,
  1149  	0x50, 0x50, 0x50, 0x40, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75,
  1150  	0x50, 0x50, 0x33, 0x33, 0x40, 0x51, 0x51, 0x41, 0x41, 0x52, 0x63, 0x74, 0x42, 0x53, 0x64, 0x75,
  1151  	0x43, 0x43, 0x33, 0x44, 0x44, 0x44, 0x55, 0x45, 0x45, 0x56, 0x56, 0x46, 0x46, 0x57, 0x68, 0x68,
  1152  	0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79,
  1153  	0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79,
  1154  	0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x56, 0x67, 0x67, 0x78, 0x78, 0x68, 0x68, 0x79,
  1155  	0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x66, 0x49, 0x49, 0x49, 0x78, 0x78, 0x4a, 0x4a, 0x5b, 0x79,
  1156  	0x47, 0x47, 0x47, 0x48, 0x48, 0x59, 0x59, 0x49, 0x49, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c,
  1157  	0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x6a, 0x49, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x5b, 0x6c, 0x7d,
  1158  	0x69, 0x69, 0x69, 0x59, 0x6a, 0x6a, 0x6a, 0x7b, 0x5a, 0x6b, 0x6b, 0x6b, 0x7c, 0x6c, 0x6c, 0x7d,
  1159  	0x7a, 0x7a, 0x7a, 0x4c, 0x4c, 0x7b, 0x7b, 0x7b, 0x4d, 0x6b, 0x6b, 0x7c, 0x7c, 0x4e, 0x7d, 0x7d,
  1160  	0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x7b, 0x7b, 0x4d, 0x4d, 0x5e, 0x7c, 0x7c, 0x4e, 0x5f, 0x5f, 0x7d,
  1161  	0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x6e, 0x4d, 0x5e, 0x5e, 0x6f, 0x4e, 0x5f, 0x5f, 0x60, 0x60,
  1162  	0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x5e, 0x6f, 0x6f, 0x6f, 0x70, 0x5f, 0x60, 0x60, 0x71,
  1163  	0x7e, 0x7e, 0x7e, 0x6e, 0x7f, 0x7f, 0x7f, 0x7f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x60, 0x71, 0x71,
  1164  	0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75,
  1165  	0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75,
  1166  	0x61, 0x61, 0x61, 0x40, 0x51, 0x51, 0x62, 0x62, 0x73, 0x63, 0x63, 0x74, 0x74, 0x64, 0x64, 0x75,
  1167  	0x43, 0x43, 0x43, 0x44, 0x44, 0x55, 0x55, 0x45, 0x45, 0x56, 0x67, 0x46, 0x46, 0x57, 0x68, 0x79,
  1168  	0x54, 0x54, 0x54, 0x44, 0x55, 0x55, 0x55, 0x45, 0x56, 0x56, 0x67, 0x78, 0x78, 0x57, 0x68, 0x79,
  1169  	0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x66, 0x66, 0x56, 0x67, 0x67, 0x78, 0x78, 0x68, 0x68, 0x79,
  1170  	0x65, 0x65, 0x65, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x67, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79,
  1171  	0x65, 0x65, 0x65, 0x48, 0x48, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x5b, 0x79, 0x79,
  1172  	0x76, 0x76, 0x76, 0x48, 0x59, 0x59, 0x77, 0x77, 0x77, 0x5a, 0x5a, 0x4a, 0x4a, 0x5b, 0x6c, 0x6c,
  1173  	0x69, 0x69, 0x69, 0x59, 0x59, 0x6a, 0x6a, 0x77, 0x5a, 0x5a, 0x6b, 0x6b, 0x5b, 0x6c, 0x6c, 0x7d,
  1174  	0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x7b, 0x7b, 0x5a, 0x6b, 0x6b, 0x7c, 0x7c, 0x6c, 0x7d, 0x7d,
  1175  	0x7a, 0x7a, 0x7a, 0x4c, 0x7b, 0x7b, 0x7b, 0x7b, 0x4d, 0x6b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d,
  1176  	0x7a, 0x7a, 0x7a, 0x4c, 0x7b, 0x7b, 0x7b, 0x7b, 0x4d, 0x5e, 0x7c, 0x7c, 0x7c, 0x5f, 0x5f, 0x7d,
  1177  	0x6d, 0x6d, 0x6d, 0x5d, 0x5d, 0x6e, 0x7b, 0x5e, 0x5e, 0x6f, 0x6f, 0x7c, 0x5f, 0x5f, 0x60, 0x60,
  1178  	0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x7f, 0x7f, 0x6f, 0x6f, 0x70, 0x70, 0x5f, 0x60, 0x60, 0x71,
  1179  	0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x60, 0x71, 0x71,
  1180  	0x72, 0x72, 0x72, 0x8f, 0x8f, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75,
  1181  	0x72, 0x72, 0x72, 0x8f, 0x8f, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75,
  1182  	0x72, 0x72, 0x72, 0x83, 0x83, 0x62, 0x62, 0x73, 0x73, 0x80, 0x74, 0x81, 0x81, 0x81, 0x92, 0x75,
  1183  	0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x96, 0x79,
  1184  	0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x66, 0x84, 0x84, 0x84, 0x67, 0x85, 0x85, 0x85, 0x96, 0x79,
  1185  	0x65, 0x65, 0x65, 0x83, 0x83, 0x66, 0x66, 0x66, 0x84, 0x84, 0x78, 0x78, 0x85, 0x85, 0x96, 0x79,
  1186  	0x65, 0x65, 0x65, 0x83, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x96, 0x79, 0x79,
  1187  	0x76, 0x76, 0x76, 0x87, 0x87, 0x66, 0x77, 0x77, 0x77, 0x88, 0x78, 0x89, 0x89, 0x89, 0x89, 0x79,
  1188  	0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x9a, 0x9a,
  1189  	0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x6b, 0x89, 0x89, 0x9a, 0x9a, 0x7d,
  1190  	0x7a, 0x7a, 0x7a, 0x87, 0x6a, 0x7b, 0x7b, 0x7b, 0x88, 0x6b, 0x6b, 0x7c, 0x7c, 0x9a, 0x7d, 0x7d,
  1191  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x7b, 0x7b, 0x8c, 0x8c, 0x8c, 0x7c, 0x7c, 0x8d, 0x8d, 0x7d, 0x7d,
  1192  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x7b, 0x8c, 0x8c, 0x8c, 0x7c, 0x8d, 0x8d, 0x8d, 0x9e, 0x9e,
  1193  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x9c, 0x8c, 0x8c, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0x9e,
  1194  	0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x7f, 0x8c, 0x9d, 0x9d, 0x70, 0x70, 0x9e, 0x9e, 0x9e, 0x71,
  1195  	0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x9d, 0x70, 0x70, 0x70, 0x9e, 0x9e, 0x71, 0x71,
  1196  	0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3,
  1197  	0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3,
  1198  	0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x73, 0x73, 0x80, 0x80, 0x91, 0x81, 0x81, 0x92, 0x92, 0xa3,
  1199  	0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x95, 0x85, 0x85, 0x85, 0x96, 0xa7,
  1200  	0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x94, 0x84, 0x84, 0x84, 0x95, 0x85, 0x85, 0x96, 0x96, 0xa7,
  1201  	0x82, 0x82, 0x82, 0x83, 0x83, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7,
  1202  	0x76, 0x76, 0x76, 0x83, 0x94, 0x94, 0x77, 0x77, 0x77, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7,
  1203  	0x76, 0x76, 0x76, 0x87, 0x87, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x9a, 0x9a,
  1204  	0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab,
  1205  	0x86, 0x86, 0x86, 0x87, 0x87, 0x98, 0x98, 0x88, 0x88, 0x99, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab,
  1206  	0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab,
  1207  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0xab, 0xbc,
  1208  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x9d, 0x8d, 0x8d, 0x8d, 0x9e, 0x9e,
  1209  	0x9b, 0x9b, 0x9b, 0x8b, 0x9c, 0x9c, 0x9c, 0x8c, 0x9d, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0xaf,
  1210  	0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0xad, 0xad, 0x9d, 0x9d, 0x9d, 0xae, 0xae, 0x9e, 0x9e, 0xaf, 0xaf,
  1211  	0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xad, 0x9d, 0xae, 0xae, 0xae, 0xbf, 0x9e, 0xaf, 0xaf, 0xaf,
  1212  	0x9f, 0x9f, 0x9f, 0x8f, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4,
  1213  	0x9f, 0x9f, 0x9f, 0x8f, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4,
  1214  	0x9f, 0x9f, 0x9f, 0x83, 0x90, 0x90, 0xa1, 0x80, 0x80, 0x91, 0x91, 0x81, 0x81, 0x92, 0xa3, 0xb4,
  1215  	0x82, 0x82, 0x82, 0x83, 0x83, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0x96, 0xa7,
  1216  	0x93, 0x93, 0x93, 0x83, 0x94, 0x94, 0x94, 0x84, 0x84, 0x95, 0x95, 0x85, 0x85, 0x96, 0xa7, 0xa7,
  1217  	0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8,
  1218  	0xa4, 0xa4, 0xa4, 0x94, 0x94, 0xa5, 0xa5, 0x77, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0xa7, 0xa7, 0xb8,
  1219  	0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x77, 0x88, 0x88, 0x88, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xb8,
  1220  	0x86, 0x86, 0x86, 0x87, 0x87, 0x98, 0x98, 0x88, 0x88, 0x99, 0x99, 0x89, 0x89, 0x9a, 0x9a, 0xab,
  1221  	0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab,
  1222  	0x97, 0x97, 0x97, 0x98, 0x98, 0xa9, 0xa9, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0x9a, 0xab, 0xab, 0xbc,
  1223  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0xa9, 0xa9, 0x8c, 0x8c, 0x8c, 0xaa, 0x8d, 0x8d, 0x8d, 0xab, 0xbc,
  1224  	0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x9c, 0x9c, 0x8c, 0x8c, 0x9d, 0x9d, 0x8d, 0x8d, 0x9e, 0x9e, 0xbc,
  1225  	0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0xad, 0x9d, 0x9d, 0x9d, 0xae, 0x8d, 0x9e, 0x9e, 0xaf, 0xaf,
  1226  	0xac, 0xac, 0xac, 0x9c, 0xad, 0xad, 0xad, 0x9d, 0x9d, 0xae, 0xae, 0xae, 0x9e, 0xaf, 0xaf, 0xaf,
  1227  	0xbd, 0xbd, 0xbd, 0xad, 0xad, 0xbe, 0xbe, 0xbe, 0xae, 0xae, 0xbf, 0xbf, 0xbf, 0xaf, 0xaf, 0xb0,
  1228  	0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4,
  1229  	0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4,
  1230  	0xa0, 0xa0, 0xa0, 0x90, 0xa1, 0xa1, 0xa1, 0xb2, 0x91, 0x91, 0xa2, 0xa2, 0xb3, 0xa3, 0xa3, 0xb4,
  1231  	0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8,
  1232  	0xa4, 0xa4, 0xa4, 0x94, 0x94, 0xa5, 0xa5, 0x84, 0x95, 0x95, 0xa6, 0xa6, 0x96, 0x96, 0xa7, 0xb8,
  1233  	0xa4, 0xa4, 0xa4, 0x94, 0xa5, 0xa5, 0xa5, 0xb6, 0x95, 0xa6, 0xa6, 0xa6, 0xb7, 0xa7, 0xa7, 0xb8,
  1234  	0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xb6, 0xb6, 0x95, 0xa6, 0xa6, 0xb7, 0xb7, 0xa7, 0xb8, 0xb8,
  1235  	0xb5, 0xb5, 0xb5, 0x87, 0x87, 0xb6, 0xb6, 0xb6, 0x88, 0x99, 0xa6, 0xb7, 0xb7, 0x9a, 0xb8, 0xb8,
  1236  	0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, 0x88, 0x99, 0x99, 0x99, 0x89, 0x9a, 0x9a, 0xab, 0xab,
  1237  	0x97, 0x97, 0x97, 0x98, 0x98, 0xa9, 0xa9, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0x9a, 0xab, 0xab, 0xbc,
  1238  	0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0x99, 0xaa, 0xaa, 0xaa, 0xbb, 0xab, 0xab, 0xbc,
  1239  	0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xba, 0xba, 0x8c, 0xaa, 0xaa, 0xbb, 0xbb, 0xab, 0xbc, 0xbc,
  1240  	0xb9, 0xb9, 0xb9, 0x9c, 0x9c, 0xba, 0xba, 0xba, 0x9d, 0x9d, 0xbb, 0xbb, 0xbb, 0x9e, 0x9e, 0xbc,
  1241  	0xac, 0xac, 0xac, 0x9c, 0x9c, 0xad, 0xad, 0x9d, 0x9d, 0xae, 0xae, 0xae, 0x9e, 0x9e, 0xaf, 0xaf,
  1242  	0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xbe, 0xbe, 0xae, 0xae, 0xae, 0xbf, 0x9e, 0xaf, 0xaf, 0xb0,
  1243  	0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xae, 0xbf, 0xbf, 0xbf, 0xbf, 0xaf, 0xb0, 0xb0,
  1244  	0xb1, 0xb1, 0xb1, 0xce, 0xce, 0xb2, 0xb2, 0xcf, 0xcf, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4,
  1245  	0xb1, 0xb1, 0xb1, 0xce, 0xce, 0xb2, 0xb2, 0xcf, 0xcf, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4,
  1246  	0xb1, 0xb1, 0xb1, 0xc2, 0xc2, 0xb2, 0xb2, 0xc3, 0xc3, 0xa2, 0xa2, 0xb3, 0xb3, 0xc0, 0xb4, 0xb4,
  1247  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xa5, 0xc3, 0xc3, 0xc3, 0xa6, 0xc4, 0xc4, 0xc4, 0xa7, 0xb8,
  1248  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xa5, 0xb6, 0xc3, 0xc3, 0xc3, 0xa6, 0xc4, 0xc4, 0xc4, 0xb8, 0xb8,
  1249  	0xb5, 0xb5, 0xb5, 0xc2, 0xa5, 0xb6, 0xb6, 0xb6, 0xc3, 0xa6, 0xa6, 0xb7, 0xb7, 0xc4, 0xb8, 0xb8,
  1250  	0xb5, 0xb5, 0xb5, 0xa5, 0xb6, 0xb6, 0xb6, 0xb6, 0xc3, 0xa6, 0xb7, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8,
  1251  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xb6, 0xb6, 0xc7, 0xc7, 0xc7, 0xb7, 0xb7, 0xc8, 0xc8, 0xb8, 0xb8,
  1252  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xaa, 0xc8, 0xc8, 0xc8, 0xab, 0xbc,
  1253  	0xa8, 0xa8, 0xa8, 0xc6, 0xc6, 0xa9, 0xa9, 0xc7, 0xc7, 0xaa, 0xaa, 0xaa, 0xc8, 0xc8, 0xab, 0xbc,
  1254  	0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xba, 0xba, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xab, 0xbc, 0xbc,
  1255  	0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xba, 0xcb, 0xaa, 0xbb, 0xbb, 0xbb, 0xcc, 0xbc, 0xbc,
  1256  	0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xbc,
  1257  	0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xae, 0xcc, 0xcc, 0xcc, 0xaf, 0xaf,
  1258  	0xbd, 0xbd, 0xbd, 0xad, 0xbe, 0xbe, 0xbe, 0xbe, 0xae, 0xae, 0xbf, 0xbf, 0xcc, 0xaf, 0xaf, 0xb0,
  1259  	0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xaf, 0xb0, 0xb0,
  1260  	0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xb2, 0xcf, 0xcf, 0xcf, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4,
  1261  	0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xb2, 0xcf, 0xcf, 0xcf, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4,
  1262  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xb2, 0xc3, 0xc3, 0xc3, 0xb3, 0xb3, 0xc0, 0xc0, 0xd1, 0xb4,
  1263  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xd4, 0xc4, 0xc4, 0xc4, 0xd5, 0xd5,
  1264  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xb6, 0xc3, 0xc3, 0xc3, 0xd4, 0xc4, 0xc4, 0xc4, 0xd5, 0xb8,
  1265  	0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xb6, 0xb6, 0xc3, 0xc3, 0xd4, 0xb7, 0xb7, 0xc4, 0xd5, 0xd5, 0xb8,
  1266  	0xb5, 0xb5, 0xb5, 0xc2, 0xb6, 0xb6, 0xb6, 0xb6, 0xc3, 0xd4, 0xb7, 0xb7, 0xb7, 0xd5, 0xd5, 0xb8,
  1267  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xb6, 0xc7, 0xc7, 0xc7, 0xb7, 0xc8, 0xc8, 0xc8, 0xd9, 0xd9,
  1268  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xd8, 0xc8, 0xc8, 0xc8, 0xd9, 0xd9,
  1269  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xd7, 0xd7, 0xc7, 0xc7, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xbc,
  1270  	0xb9, 0xb9, 0xb9, 0xd7, 0xd7, 0xba, 0xba, 0xba, 0xd8, 0xd8, 0xbb, 0xbb, 0xbb, 0xd9, 0xd9, 0xbc,
  1271  	0xb9, 0xb9, 0xb9, 0xca, 0xca, 0xba, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xbc,
  1272  	0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xbb, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd,
  1273  	0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xdb, 0xdb, 0xcb, 0xcb, 0xdc, 0xdc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd,
  1274  	0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xb0,
  1275  	0xbd, 0xbd, 0xbd, 0xdb, 0xbe, 0xbe, 0xbe, 0xdc, 0xdc, 0xbf, 0xbf, 0xbf, 0xdd, 0xdd, 0xb0, 0xb0,
  1276  	0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xcf, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2,
  1277  	0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xcf, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2,
  1278  	0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xc3, 0xd0, 0xd0, 0xe1, 0xc0, 0xc0, 0xd1, 0xd1, 0xe2,
  1279  	0xd2, 0xd2, 0xd2, 0xc2, 0xd3, 0xd3, 0xd3, 0xc3, 0xc3, 0xd4, 0xd4, 0xc4, 0xc4, 0xd5, 0xd5, 0xe6,
  1280  	0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd3, 0xc3, 0xd4, 0xd4, 0xd4, 0xc4, 0xc4, 0xd5, 0xd5, 0xe6,
  1281  	0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xe4, 0xc3, 0xd4, 0xd4, 0xe5, 0xc4, 0xd5, 0xd5, 0xe6, 0xe6,
  1282  	0xe3, 0xe3, 0xe3, 0xd3, 0xd3, 0xe4, 0xb6, 0xd4, 0xd4, 0xe5, 0xe5, 0xb7, 0xd5, 0xd5, 0xe6, 0xe6,
  1283  	0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xd7, 0xc7, 0xc7, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xd9,
  1284  	0xd6, 0xd6, 0xd6, 0xc6, 0xd7, 0xd7, 0xd7, 0xc7, 0xd8, 0xd8, 0xd8, 0xc8, 0xc8, 0xd9, 0xd9, 0xea,
  1285  	0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xe8, 0xd8, 0xd8, 0xd8, 0xe9, 0xc8, 0xd9, 0xd9, 0xea, 0xea,
  1286  	0xe7, 0xe7, 0xe7, 0xd7, 0xd7, 0xe8, 0xe8, 0xd8, 0xd8, 0xe9, 0xe9, 0xe9, 0xd9, 0xd9, 0xea, 0xea,
  1287  	0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xba, 0xcb, 0xcb, 0xcb, 0xe9, 0xcc, 0xcc, 0xcc, 0xea, 0xea,
  1288  	0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xdb, 0xdb, 0xcb, 0xcb, 0xdc, 0xdc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd,
  1289  	0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xee,
  1290  	0xda, 0xda, 0xda, 0xdb, 0xdb, 0xec, 0xec, 0xdc, 0xdc, 0xed, 0xed, 0xed, 0xdd, 0xdd, 0xee, 0xee,
  1291  	0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee,
  1292  	0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2,
  1293  	0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2,
  1294  	0xef, 0xef, 0xef, 0xdf, 0xe0, 0xe0, 0xe0, 0xd0, 0xd0, 0xe1, 0xe1, 0xf2, 0xd1, 0xd1, 0xe2, 0xe2,
  1295  	0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xe4, 0xe4, 0xd4, 0xd4, 0xd4, 0xe5, 0xe5, 0xd5, 0xd5, 0xe6, 0xe6,
  1296  	0xe3, 0xe3, 0xe3, 0xd3, 0xe4, 0xe4, 0xe4, 0xd4, 0xd4, 0xe5, 0xe5, 0xf6, 0xd5, 0xd5, 0xe6, 0xe6,
  1297  	0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xd4, 0xe5, 0xe5, 0xe5, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7,
  1298  	0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7,
  1299  	0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xf5, 0xc7, 0xd8, 0xd8, 0xf6, 0xc8, 0xd9, 0xd9, 0xd9, 0xf7,
  1300  	0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xe8, 0xe8, 0xd8, 0xd8, 0xd8, 0xe9, 0xe9, 0xd9, 0xd9, 0xea, 0xea,
  1301  	0xe7, 0xe7, 0xe7, 0xd7, 0xe8, 0xe8, 0xe8, 0xd8, 0xd8, 0xe9, 0xe9, 0xe9, 0xd9, 0xea, 0xea, 0xea,
  1302  	0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xf9, 0xf9, 0xe9, 0xe9, 0xe9, 0xfa, 0xd9, 0xea, 0xea, 0xfb,
  1303  	0xf8, 0xf8, 0xf8, 0xe8, 0xf9, 0xf9, 0xf9, 0xcb, 0xe9, 0xe9, 0xfa, 0xfa, 0xcc, 0xea, 0xea, 0xfb,
  1304  	0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xee,
  1305  	0xda, 0xda, 0xda, 0xdb, 0xdb, 0xec, 0xec, 0xdc, 0xdc, 0xed, 0xed, 0xed, 0xdd, 0xdd, 0xee, 0xee,
  1306  	0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee,
  1307  	0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xfe, 0xfe, 0xee, 0xee, 0xee, 0xff,
  1308  	0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3,
  1309  	0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3,
  1310  	0xf0, 0xf0, 0xf0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1, 0xe1, 0xf2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf3,
  1311  	0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xd5, 0xe6, 0xe6, 0xf7,
  1312  	0xf4, 0xf4, 0xf4, 0xe4, 0xe4, 0xf5, 0xf5, 0xf5, 0xe5, 0xe5, 0xf6, 0xf6, 0xf6, 0xe6, 0xe6, 0xf7,
  1313  	0xf4, 0xf4, 0xf4, 0xe4, 0xf5, 0xf5, 0xf5, 0xf5, 0xe5, 0xf6, 0xf6, 0xf6, 0xf6, 0xe6, 0xf7, 0xf7,
  1314  	0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xe5, 0xf6, 0xf6, 0xf6, 0xf6, 0xe6, 0xf7, 0xf7,
  1315  	0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xd8, 0xf6, 0xf6, 0xf6, 0xd9, 0xd9, 0xf7, 0xf7,
  1316  	0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xd8, 0xe9, 0xe9, 0xe9, 0xfa, 0xd9, 0xea, 0xea, 0xea,
  1317  	0xf8, 0xf8, 0xf8, 0xe8, 0xe8, 0xf9, 0xf9, 0xf9, 0xe9, 0xe9, 0xfa, 0xfa, 0xfa, 0xea, 0xea, 0xfb,
  1318  	0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xe9, 0xfa, 0xfa, 0xfa, 0xfa, 0xea, 0xfb, 0xfb,
  1319  	0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xea, 0xfb, 0xfb,
  1320  	0xf8, 0xf8, 0xf8, 0xdb, 0xf9, 0xf9, 0xf9, 0xdc, 0xdc, 0xfa, 0xfa, 0xfa, 0xdd, 0xdd, 0xee, 0xfb,
  1321  	0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xdc, 0xed, 0xed, 0xed, 0xed, 0xdd, 0xee, 0xee, 0xee,
  1322  	0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xfd, 0xfd, 0xfd, 0xed, 0xed, 0xfe, 0xfe, 0xee, 0xee, 0xee, 0xff,
  1323  	0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xed, 0xfe, 0xfe, 0xfe, 0xfe, 0xee, 0xff, 0xff,
  1324  }