Challenge: 
Winner?: 
No
Code Snippet: 
Rem Project: Paint
Rem Created: 6/23/2006 3:30:08 PM

Rem ***** Main Source File *****

set window on
set display mode 800,600,32
set window size 800,600

sync on
sync rate 0

type __FloodFillType
   Initialised as integer
   CoverColour as integer
   BitmapWidth as integer
   BitmapHeight as integer
endtype
global __FloodFillGlobal as __FloodFillType

#constant __SpanListSize 15
type __FillSpan
   Left as integer
   Right as integer
endtype
global dim __FilledSpans() as __FillSpan
global dim __FilledSpansCount() as integer

global temp$
temp$=""

global color
color=rgb(0,0,0)

global paint_mode
global option_mode
paint_mode=0
option_mode=1

global img_origin_x
global img_origin_y
global img_width
global img_height

global palletx1
global pallety1
global palletx2
global pallety2

global buttonsx1
global buttonsy1
global buttonsx2
global buttonsy2

global rgbx1
global rgby1
global rgbx2
global rgby2

global brush_width

img_origin_x=76
img_origin_y=36
img_width=300
img_height=300

palletx1=1
pallety1=img_origin_y+20
palletx2=73
pallety2=img_origin_y+130

rgbx1=1
rgby1=img_origin_y+132
rgbx2=73
rgby2=img_origin_y+180

buttonsx1=1
buttonsy1=img_origin_y+184
buttonsx2=73
buttonsy2=img_origin_y+304

brush_width=10


get image 1,img_origin_x,img_origin_y,img_origin_x+img_width,img_origin_y+img_height,1
`create palette
cls rgb(255,255,255)
for x=0 to 73
   for y=0 to 110
      read rgbv
      dot x,y,rgbv
   next y
next x
sync
get image 2,0,0,73,110
cls rgb(255,255,255)

do
   cls rgb(255,255,255)
   draw_menu(0)
   draw_img()
   user_input()
   sync
loop

function draw_menu(not_draw_area)
   if not_draw_area=0
      box 0,0,screen width(),screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box 1,1,screen width()-1,screen height()-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150)
      box img_origin_x-1,img_origin_y-1,screen width(),screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box img_origin_x,img_origin_y,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255)
      box img_origin_x-1,img_origin_y-1,img_origin_x+1+img_width,img_origin_y+1+img_height,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box 0,0,screen width(),img_origin_y,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box 1,1,screen width()-1,img_origin_y-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150)
   else
      ink rgb(100,100,100),0
      line img_origin_x,screen height()-1,screen width(),screen height()-1
      line screen width()-1,img_origin_y,screen width()-1,screen height()
      line img_origin_x+img_width,img_origin_y,img_origin_x+img_width,img_origin_y+1+img_height
      line img_origin_x,img_origin_y+img_height,img_origin_x+1+img_width,img_origin_y+img_height

      box 0,0,screen width(),img_origin_y,rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box 0,img_origin_y-1,img_origin_x,screen height(),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100),rgb(100,100,100)
      box 1,1,screen width()-1,img_origin_y-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150)
      box 1,img_origin_y,img_origin_x-1,screen height()-1,rgb(150,150,150),rgb(150,150,150),rgb(150,150,150),rgb(150,150,150)
      box img_origin_x+1+img_width,img_origin_y,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255)
      box img_origin_x,img_origin_y+1+img_height,screen width()-1,screen height()-1,rgb(255,255,255),rgb(255,255,255),rgb(255,255,255),rgb(255,255,255)
   endif



   `RGB PALETTE
   ink rgb(0,0,255),0
   center text img_origin_x/2,img_origin_y,"Color"
   paste image 2,palletx1,pallety1
   `RGB DATA INPUT
   box rgbx1+20,rgby1+4,rgbx1+52,rgby1+48,rgb(0,0,0),rgb(0,0,0),rgb(0,0,0),rgb(0,0,0)
   text rgbx1,rgby1,"R:"+str$(rgbr(color))
   text rgbx1,rgby1+16,"G:"+str$(rgbg(color))
   text rgbx1,rgby1+32,"B:"+str$(rgbb(color))
   ink rgb(255,255,255),0
   box rgbx1+20,rgby1+17,rgbx1+52,rgby1+18
   box rgbx1+20,rgby1+33,rgbx1+52,rgby1+34
   ink color,0
   box rgbx1+54,rgby1+4,rgbx2,rgby2
   `BUTTONS
   draw_option(mode)
endfunction

function draw_img()
   paste image 1,img_origin_x,img_origin_y
endfunction

function draw_option(mode)
   select option_mode
      case 1
         if paint_mode=0:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1,buttonsx2,buttonsy1+20,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1,"Circle"
         if paint_mode=1:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+20,buttonsx2,buttonsy1+40,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+20,"Box"
         if paint_mode=2:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+40,buttonsx2,buttonsy1+60,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+40,"Ellipse"
         if paint_mode=3:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+60,buttonsx2,buttonsy1+80,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+60,"Line"
         if paint_mode=4:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+80,buttonsx2,buttonsy1+100,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+80,"Brush"
         if paint_mode=5:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+100,buttonsx2,buttonsy1+120,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+100,"Flood"
         if paint_mode=6:ink rgb(255,0,0),0:else:ink rgb(0,0,255),0:endif
         box buttonsx1,buttonsy1+120,buttonsx2,buttonsy1+140,rgb(0,0,0),rgb(255,255,255),rgb(0,0,0),rgb(255,255,255)
         center text buttonsx2/2,buttonsy1+120,"Dropper"
      endcase
   endselect
endfunction

function user_input()
   if mouseclick()=1
      `RGB COLORS
      if mousex()>palletx1 and mousey()>pallety1 and mousex()<palletx2 and mousey()<pallety2
         color=point(mousex(),mousey())
      endif
      if mousex()>rgbx1+20 and mousey()>rgby1 and mousex()<rgbx1+52 and mousey()<rgby1+18`Edit R Value
         do
            cls rgb(255,255,255)
            ret$=get_color_val()
            if ret$<>""
               color=rgb(val(ret$),rgbg(color),rgbb(color))
               exitfunction
            else
               color=rgb(val(temp$),rgbg(color),rgbb(color))
            endif
            draw_menu(0)
            draw_img()
            ink rgb(255,0,0),0
            text rgbx1,rgby1,"R:"+str$(rgbr(color))
            sync
         loop
      endif
      if mousex()>rgbx1+20 and mousey()>rgby1+18 and mousex()<rgbx1+52 and mousey()<rgby1+36`Edit G Value
         do
            cls rgb(255,255,255)
            ret$=get_color_val()
            if ret$<>""
               color=rgb(rgbr(color),val(ret$),rgbb(color))
               exitfunction
            else
               color=rgb(rgbr(color),val(temp$),rgbb(color))
            endif
            draw_menu(0)
            draw_img()
            ink rgb(255,0,0),0
            text rgbx1,rgby1+16,"G:"+str$(rgbg(color))
            sync
         loop
      endif
      if mousex()>rgbx1+20 and mousey()>rgby1+36 and mousex()<rgbx1+52 and mousey()<rgby1+54`Edit B Value
         do
            cls rgb(255,255,255)
            ret$=get_color_val()
            if ret$<>""
               color=rgb(rgbr(color),rgbg(color),val(ret$))
               exitfunction
            else
               color=rgb(rgbr(color),rgbg(color),val(temp$))
            endif
            draw_menu(0)
            draw_img()
            ink rgb(255,0,0),0
            text rgbx1,rgby1+32,"B:"+str$(rgbb(color))
            sync
         loop
      endif
      `BUTTON INTERACTIONS
      if mousex()>buttonsx1 and mousey()>buttonsy1 and mousex()<buttonsx2 and mousey()<buttonsy2
         if mousex()>buttonsx1 and mousey()>buttonsy1 and mousex()<buttonsx2 and mousey()<buttonsy1+20      then paint_mode=0
         if mousex()>buttonsx1 and mousey()>buttonsy1+20 and mousex()<buttonsx2 and mousey()<buttonsy1+40   then paint_mode=1
         if mousex()>buttonsx1 and mousey()>buttonsy1+40 and mousex()<buttonsx2 and mousey()<buttonsy1+60   then paint_mode=2
         if mousex()>buttonsx1 and mousey()>buttonsy1+60 and mousex()<buttonsx2 and mousey()<buttonsy1+80   then paint_mode=3
         if mousex()>buttonsx1 and mousey()>buttonsy1+80 and mousex()<buttonsx2 and mousey()<buttonsy1+100  then paint_mode=4
         if mousex()>buttonsx1 and mousey()>buttonsy1+100 and mousex()<buttonsx2 and mousey()<buttonsy1+120 then paint_mode=5
         if mousex()>buttonsx1 and mousey()>buttonsy1+120 and mousex()<buttonsx2 and mousey()<buttonsy1+140 then paint_mode=6
      endif
      `IMG INTERACTION
      if mousex()>img_origin_x-1 and mousey()>img_origin_y-1 and mousex()<img_origin_x+img_width and mousey()<img_origin_y+img_height then input_option_1()
   endif
endfunction

function input_option_1()
         smx=mousex()
         smy=mousey()
         select paint_mode
            case 0`Circle
               repeat
                  cls rgb(255,255,255)
                  draw_img()
                  ink color,0
                  filled_circle(smx,smy,dist(smx,smy,mousex(),mousey()))
                  draw_menu(1)
                  if mouseclick()=2 or mouseclick()=3
                     exitfunction
                  endif
                  sync
               until mouseclick()=0
               get_image()
            endcase
            case 1`Box
               repeat
                  cls rgb(255,255,255)
                  draw_img()
                  ink color,0
                  box min(smx,mousex()),min(smy,mousey()),max(smx,mousex()),max(smy,mousey())
                  draw_menu(1)
                  if mouseclick()=2 or mouseclick()=3
                     exitfunction
                  endif
                  sync
               until mouseclick()=0
               get_image()
            endcase
            case 2`Ellipse
               repeat
                  cls rgb(255,255,255)
                  draw_img()
                  ink color,0
                  filled_ellipse(smx,smy,abs(mousex()-smx),abs(mousey()-smy))
                  draw_menu(1)
                  if mouseclick()=2 or mouseclick()=3
                     exitfunction
                  endif
                  sync
               until mouseclick()=0
               get_image()
            endcase
            case 3`Line
               repeat
                  cls rgb(255,255,255)
                  draw_img()
                  ink color,0
                  line smx,smy,mousex(),mousey()
                  draw_menu(1)
                  if mouseclick()=2 or mouseclick()=3
                     exitfunction
                  endif
                  sync
               until mouseclick()=0
               get_image()
            endcase
            case 4`Brush
               repeat
                  ink color,0
                  filled_circle(mousex(),mousey(),brush_width)
                  draw_menu(1)
                  if mouseclick()=2 or mouseclick()=3
                     exitfunction
                  endif
                  sync
               until mouseclick()=0
               get_image()
            endcase
            case 5`Flood
               FloodFill(mousex(),mousey(),color)
               get_image()
            endcase
            case 6`Ink Dropper
               repeat
                  color=point(mousex(),mousey())
               until mouseclick()=0
            endcase
         endselect
endfunction

function get_color_val()
   t_temp$=temp$
   if returnkey() or len(temp$)>=3
      ret$=temp$
      temp$=""
      exitfunction ret$
   endif
   if inkey$()<>""
      temp$=temp$+str$(val(inkey$()))
      wait 200
   endif
   if keystate(14) then temp$=left$(temp$,len(temp$)-1)
   temp$=str$(val(temp$))
   if val(temp$)>255 then temp$=t_temp$
endfunction ""

function wait_text(string$)
   center text screen width()/2,0,string$
   sync
endfunction

function get_image()
   get image 1,img_origin_x,img_origin_y,img_origin_x+img_width,img_origin_y+img_height,1
endfunction

function dist(x1#,y1#,x2#,y2#)
   ret#=sqrt((x2#-x1#)^2+(y2#-y1#)^2)
endfunction ret#

function filled_circle( CX as integer, CY as integer, R as integer )
   local x as integer
   local y as integer
   local i as integer
   local s as integer
   i=R*R
   s=R*0.70710678
   box CX-s, CY-s, CX+s+1, CY+s+1
   s=s+1
   for y=s to R
      x=sqrt( i-(y*y) )
      box CX-x, CY-y, CX+x+1, CY-y+1
      box CX-x, CY+y, CX+x+1, CY+y+1
      box CX-y, CY-x, CX-y+1, CY+x+1
      box CX+y, CY-x, CX+y+1, CY+x+1
   next y
endfunction

function filled_ellipse(x#,y#,xrad#,yrad#)
for i# =0.0 to 90.0 step 1
   x1#=sin(i#-90)*xrad#+x#
   x2#=sin(i#+90)*xrad#+x#
   y1#=cos(i#+90)*yrad#+y#
   y2#=cos(i#-90)*yrad#+y#
   box x1#,y1#,x2#,y2#
next i
endfunction

function draw_line(x1,y1,x2,y2,width)
   m#=(y2-y1)/(x2-x1)

endfunction

function min(v1,v2)
   if v1<v2
      exitfunction v1
   else
      exitfunction v2
   endif
endfunction 0

function max(v1,v2)
   if v1>v2
      exitfunction v1
   else
      exitfunction v2
   endif
endfunction 0

`FloodFill Commands are not mine, a thanks to "IanM"
function FloodFill(x,y,c)
   __FloodFillGlobal.BitmapWidth=bitmap width()-1
   __FloodFillGlobal.BitmapHeight=bitmap height()-1

   __InitialiseFillSpan()

   if x >= 0 and x <= __FloodFillGlobal.BitmapWidth
      if y >= 0 and y <= __FloodFillGlobal.BitmapHeight

         lock pixels

         __FloodFillGlobal.CoverColour = point(x,y)
         if __FloodFillGlobal.CoverColour <> c

            ink c,0

            __FloodLoop(x,y)
         endif

         unlock pixels

      endif
   endif
endfunction

function __FloodLoop(x as integer,y as integer)
   local Left as integer
   local Right as integer
   local SpanSize as integer

   for Left=x-1 to 0 step -1
      if point(Left,y) <> __FloodFillGlobal.CoverColour then exit
   next Left
   inc Left

   for Right=x+1 to __FloodFillGlobal.BitmapWidth
      if point(Right,y) <> __FloodFillGlobal.CoverColour then exit
   next Right

   ` draw this line
   box Left,y,Right,y+1

   ` and remember it
   __AddFillSpan(y,Left-1,Right+1)

   ` Fill upwards
   if y > 0
      dec y
      x=Left
      while x < Right
         SpanSize=__CheckFillSpan(x,y)
         if SpanSize = 0
            if point(x,y) = __FloodFillGlobal.CoverColour
               __FloodLoop(x,y)
            endif
            inc x
         else
            inc x,SpanSize
         endif
      endwhile
      inc y
   endif

   ` Fill downwards
   if y < __FloodFillGlobal.BitmapHeight
      inc y
      x=Left
      while x < Right
         SpanSize=__CheckFillSpan(x,y)
         if SpanSize = 0
            if point(x,y) = __FloodFillGlobal.CoverColour
               __FloodLoop(x,y)
            endif
            inc x
         else
            inc x,SpanSize
         endif
      endwhile
   endif
endfunction

function __InitialiseFillSpan()
   local i as integer
   if __FloodFillGlobal.Initialised = 0

      ` First time called, create the arrays - bigger than we should ever need
      undim __FilledSpans()
      global dim __FilledSpans(__SpanListSize,2048) as __FillSpan
      undim __FilledSpansCount()
      global dim __FilledSpansCount(2048) as integer
      __FloodFillGlobal.Initialised=1

   else

      ` Subsequent call, just reset the spans we'll be using
      for i=__FloodFillGlobal.BitmapHeight to 0 step -1
         __FilledSpansCount(i)=0
      next i

   endif
endfunction

function __AddFillSpan(y as integer,Left as integer,Right as integer)
   local i as integer

   i=__FilledSpansCount(y)
   if i < __SpanListSize
      __FilledSpans(i, y).Left=Left
      __FilledSpans(i, y).Right=Right
      inc __FilledSpansCount(y)
   endif
endfunction

function __CheckFillSpan(x as integer,y as integer)
   local i as integer

   for i=__FilledSpansCount(y)-1 to 0 step -1
      if x >= __FilledSpans(i, y).Left
         if x < __FilledSpans(i, y).Right then exitfunction __FilledSpans(i, y).Right-x
      endif
   next i
endfunction 0

`//////////////////////////////////RGB COLOR INFORMATION//////////////////////////////////////////
data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data 393216,393216,393216,393472,393472,393472,393728,393728,393728,393984,393984,394240,394240,394240,394496,394496,394752,394752,394752,394752,394752,394752,329216,329216,263680,263680,263680,198144,198144,132608,132608,132608,67072,67072,67072,1536,1536,1536,1536,1536,1537,1537,1537,1538,1538,1539,1539,1539,1540,1540,1540,1541,1541,1542,1542,1542,1542,1542,1286,1286,1286,1030,1030,1030,774,774,518,518,518,262,262,6,6,6,6,6,6,65542,65542,65542,131078,131078,196614,196614,196614,262150,262150,327686,327686,327686,393222,393222,393222,393222,393222,393221,393221,393221,393220,393220,393219,393219,393219,393218,393218,393218,393217,393217,393216,393216,393216
data 851968,851968,852224,852480,852480,852736,852992,853248,853248,853504,853760,854016,854272,854272,854528,854784,855040,855040,855296,855296,789760,789760,724224,658688,593152,527616,527616,462080,396544,331008,331008,265472,199936,134400,134400,68864,3328,3328,3328,3329,3330,3331,3331,3332,3333,3334,3334,3335,3336,3337,3337,3338,3339,3340,3341,3341,3341,3085,2829,2829,2573,2317,2061,2061,1805,1549,1293,1037,1037,781,525,269,269,13,13,13,65549,131085,196621,196621,262157,327693,393229,393229,458765,524301,589837,655373,655373,720909,786445,851981,851981,851981,851980,851979,851979,851978,851977,851976,851975,851975,851974,851973,851972,851972,851971,851970,851969,851969,851968
data 1310720,1310720,1311232,1311488,1311744,1312000,1312256,1312512,1312768,1313280,1313536,1313792,1314048,1314304,1314560,1315072,1315328,1315584,1315840,1315840,1250304,1184768,1053696,988160,922624,857088,791552,726016,594944,529408,463872,398336,332800,267264,201728,70656,5120,5120,5121,5122,5123,5124,5125,5126,5127,5129,5130,5131,5132,5133,5134,5136,5137,5138,5139,5140,5140,4884,4372,4116,3860,3604,3348,3092,2580,2324,2068,1812,1556,1300,1044,532,276,20,20,65556,131092,196628,262164,327700,458772,524308,589844,655380,720916,786452,851988,983060,1048596,1114132,1179668,1245204,1310740,1310740,1310738,1310737,1310736,1310735,1310734,1310733,1310731,1310730,1310729,1310728,1310727,1310726,1310725,1310723,1310722,1310721,1310720
data 1769472,1769728,1770240,1770496,1770752,1771264,1771776,1772032,1772288,1772800,1773312,1773568,1774080,1774336,1774848,1775360,1775616,1775872,1776384,1776384,1645312,1579776,1448704,1383168,1252096,1121024,1055488,989952,858880,727808,662272,596736,465664,334592,269056,137984,72448,6912,6913,6915,6916,6918,6919,6921,6922,6924,6925,6927,6929,6930,6931,6933,6935,6936,6938,6939,6939,6427,5915,5659,5403,4891,4379,4123,3611,3355,2843,2331,2075,1819,1307,795,539,283,27,65563,196635,327707,393243,458779,589851,720923,786459,851995,983067,1114139,1179675,1310747,1376283,1507355,1638427,1703963,1769499,1769499,1769497,1769495,1769494,1769492,1769491,1769489,1769487,1769486,1769485,1769483,1769481,1769480,1769479,1769477,1769475,1769474,1769472
data 2293760,2294016,2294784,2295040,2295552,2296064,2296576,2297088,2297344,2298112,2298368,2298880,2299648,2299904,2300416,2300928,2301440,2301952,2302464,2171648,2106112,1975040,1843968,1712896,1581824,1450752,1319680,1188608,1057536,926464,860928,729856,598784,467712,336640,205568,74496,8960,8962,8964,8965,8968,8969,8971,8973,8975,8977,8978,8981,8983,8984,8987,8988,8990,8992,8994,8483,8227,7459,6947,6691,5923,5667,5155,4643,4131,3619,3107,2595,2339,1827,1059,803,291,35,131107,262179,393251,524323,589859,786467,917539,983075,1114147,1245219,1376291,1507363,1638435,1769507,1835043,2031651,2097187,2228259,2293793,2293791,2293789,2293787,2293785,2293783,2293782,2293779,2293778,2293776,2293774,2293772,2293770,2293769,2293766,2293764,2293763,2293760
data 2686976,2687232,2688000,2688512,2689024,2689792,2690304,2690816,2691328,2692096,2692608,2693120,2693888,2694400,2694912,2695680,2696192,2696704,2697472,2631936,2500864,2369792,2173184,2042112,1911040,1714432,1583360,1452288,1255680,1124608,993536,862464,665856,534784,403712,207104,76032,10496,10498,10500,10502,10505,10507,10509,10511,10514,10516,10518,10521,10523,10525,10528,10530,10532,10535,10537,10281,9769,9001,8489,7977,7209,6697,6185,5417,4905,4393,3625,3113,2601,2089,1321,809,297,41,131113,262185,458793,589865,720937,917545,1048617,1179689,1310761,1507369,1638441,1769513,1966121,2097193,2228265,2424873,2555945,2687017,2687016,2687013,2687011,2687009,2687006,2687004,2687002,2686999,2686997,2686995,2686992,2686990,2686988,2686986,2686983,2686981,2686979,2686976
data 3080192,3080704,3081472,3081984,3082752,3083520,3084032,3084800,3085312,3086080,3086592,3087360,3088128,3088640,3089408,3090176,3090688,3091456,3092224,3026688,2895616,2699008,2502400,2371328,2174720,1978112,1847040,1650432,1453824,1322752,1191680,995072,798464,667392,470784,274176,143104,12032,12035,12037,12039,12043,12045,12047,12050,12053,12055,12057,12061,12063,12065,12069,12071,12073,12077,12079,11823,11311,10287,9775,9263,8239,7727,7215,6191,5679,5167,4143,3631,3119,2607,1583,1071,559,65583,196655,327727,589871,720943,852015,1048623,1245231,1376303,1507375,1769519,1900591,2031663,2293807,2424879,2555951,2752559,2949167,3080239,3080238,3080234,3080232,3080230,3080227,3080224,3080222,3080219,3080216,3080214,3080211,3080208,3080206,3080204,3080201,3080198,3080196,3080193
data 3604480,3604992,3606016,3606784,3607296,3608320,3609088,3609600,3610368,3611392,3611904,3612672,3613696,3614208,3614976,3616000,3616512,3617280,3618304,3487488,3290880,3094272,2897664,2701056,2504448,2242304,2111232,1914624,1652480,1521408,1324800,1193728,931584,734976,603904,341760,145152,14080,14083,14086,14089,14092,14095,14098,14100,14104,14107,14109,14113,14116,14118,14122,14125,14127,14131,14134,13623,12855,11831,11063,10551,9527,8759,8247,7223,6455,5943,4919,4151,3639,2871,1847,1335,567,65591,196663,393271,655415,786487,983095,1245239,1441847,1572919,1769527,2031671,2162743,2359351,2621495,2752567,2949175,3211319,3342391,3538999,3604533,3604529,3604526,3604523,3604520,3604517,3604514,3604511,3604508,3604505,3604502,3604499,3604496,3604494,3604490,3604487,3604485,3604481
data 3997696,3998208,3999488,4000256,4001024,4002048,4002816,4003584,4004352,4005376,4006144,4006912,4007936,4008704,4009472,4010752,4011264,4012032,4013312,3882240,3685632,3489024,3226880,3030272,2833664,2571520,2374912,2178304,1916160,1719552,1522944,1326336,1064192,867584,670976,343296,146688,15616,15620,15623,15626,15630,15633,15636,15639,15643,15646,15649,15653,15656,15659,15664,15667,15669,15674,15677,15165,14397,13373,12605,11837,10813,10045,9277,8253,7485,6717,5437,4669,4157,3389,2109,1341,573,65597,262205,458813,720957,917565,1114173,1376317,1572925,1769533,1966141,2293821,2424893,2621501,2949181,3145789,3342397,3604541,3801149,3997757,3997755,3997751,3997748,3997745,3997741,3997738,3997735,3997731,3997728,3997725,3997720,3997717,3997714,3997712,3997707,3997704,3997701,3997697
data 4456448,4457216,4458496,4459264,4460032,4461312,4462080,4462848,4463872,4465152,4465920,4466688,4467968,4468736,4469504,4470784,4471808,4472576,4473856,4342784,4146176,3949568,3621888,3359744,3163136,2835456,2638848,2442240,2114560,1917952,1655808,1459200,1131520,934912,738304,410624,214016,17408,17412,17416,17419,17424,17427,17430,17433,17438,17442,17445,17450,17453,17456,17461,17464,17468,17472,17476,16964,16196,14916,14148,13124,12100,11076,10308,9028,8260,7492,6212,5444,4420,3652,2372,1604,836,65604,262212,524356,786500,1048644,1245252,1572932,1769540,1966148,2228292,2490436,2752580,2949188,3276868,3473476,3670084,3997764,4194372,4456516,4456514,4456509,4456506,4456503,4456498,4456495,4456491,4456486,4456483,4456480,4456475,4456472,4456469,4456465,4456460,4456457,4456454,4456449