]> gitweb.factorcode.org Git - factor.git/commitdiff
Techniques work
authorErik Charlebois <erikcharlebois@gmail.com>
Mon, 5 Apr 2010 01:57:58 +0000 (18:57 -0700)
committerErik Charlebois <erikcharlebois@gmail.com>
Mon, 5 Apr 2010 01:57:58 +0000 (18:57 -0700)
14 files changed:
extra/fluids/authors.txt [new file with mode: 0644]
extra/fluids/colors.ppm [new file with mode: 0644]
extra/fluids/fluids.factor [new file with mode: 0644]
extra/fluids/particle2.pgm [new file with mode: 0644]
extra/gpu/effects/blur/authors.txt [new file with mode: 0644]
extra/gpu/effects/blur/blur.factor [new file with mode: 0644]
extra/gpu/effects/blur/summary.txt [new file with mode: 0644]
extra/gpu/effects/quad/authors.txt [new file with mode: 0644]
extra/gpu/effects/quad/quad.factor [new file with mode: 0644]
extra/gpu/effects/quad/summary.txt [new file with mode: 0644]
extra/gpu/effects/step/authors.txt [new file with mode: 0644]
extra/gpu/effects/step/step.factor [new file with mode: 0644]
extra/gpu/effects/step/summary.txt [new file with mode: 0644]
extra/gpu/util/util.factor

diff --git a/extra/fluids/authors.txt b/extra/fluids/authors.txt
new file mode 100644 (file)
index 0000000..6f03a12
--- /dev/null
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/extra/fluids/colors.ppm b/extra/fluids/colors.ppm
new file mode 100644 (file)
index 0000000..c12c455
Binary files /dev/null and b/extra/fluids/colors.ppm differ
diff --git a/extra/fluids/fluids.factor b/extra/fluids/fluids.factor
new file mode 100644 (file)
index 0000000..a0d75fd
--- /dev/null
@@ -0,0 +1,164 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors arrays classes.struct destructors game.loop
+game.worlds gpu gpu.buffers gpu.framebuffers gpu.render gpu.shaders
+gpu.state gpu.textures gpu.util images images.loader kernel literals
+locals make math math.rectangles math.vectors namespaces opengl.gl
+sequences specialized-arrays ui.gadgets.worlds images.ppm
+ui.gestures ui.pixel-formats images.pgm gpu.effects.blur ;
+FROM: alien.c-types => float ;
+SPECIALIZED-ARRAY: float
+IN: fluids
+
+STRUCT: float2_t
+    { x float }
+    { y float } ;
+
+: f2+ ( lhs rhs -- res )
+    [ [ x>> ] bi@ + ]
+    [ [ y>> ] bi@ + ]
+    2bi float2_t <struct-boa> ; inline
+
+: f2- ( lhs rhs -- res )
+    [ [ x>> ] bi@ - ]
+    [ [ y>> ] bi@ - ]
+    2bi float2_t <struct-boa> ; inline
+
+: f2*n ( lhs rhs -- res ) 
+    [ [ x>> ] dip * ]
+    [ [ y>> ] dip * ]
+    2bi float2_t <struct-boa> ; inline
+
+STRUCT: particle_t
+    { p  float2_t }
+    { p' float2_t }
+    { m  float    } ;
+SPECIALIZED-ARRAY: particle_t
+
+CONSTANT: gravity S{ float2_t f 0.0 -0.1 }
+
+:: verlet-integrate-particle ( p dt -- p' )
+    p p>> 2.0 f2*n :> v1
+    p p'>> :> v2
+    gravity dt dt * 1.0 p m>> 2.0 * / * f2*n :> v3
+    v1 v2 f2- v3 f2+
+    p p m>> particle_t <struct-boa> ; inline
+
+CONSTANT: initial-particles
+particle_t-array{
+    S{ particle_t f S{ float2_t f 0.5 0.6 } S{ float2_t f 0.499 0.599 } 1.0 }
+    S{ particle_t f S{ float2_t f 0.5 0.6 } S{ float2_t f 0.501 0.599 } 3.0 }
+    
+    S{ particle_t f S{ float2_t f 0.5 0.5 } S{ float2_t f 0.5 0.5 } 2.0 }
+    S{ particle_t f S{ float2_t f 0.5 0.6 } S{ float2_t f 0.5 0.599 } 1.0 }
+    S{ particle_t f S{ float2_t f 0.6 0.5 } S{ float2_t f 0.6 0.5 } 3.0 }
+    S{ particle_t f S{ float2_t f 0.7 0.5 } S{ float2_t f 0.7 0.5 } 1.0 }
+    S{ particle_t f S{ float2_t f 0.1 0.5 } S{ float2_t f 0.1 0.5 } 5.0 }
+    S{ particle_t f S{ float2_t f 0.2 0.5 } S{ float2_t f 0.2 0.5 } 1.0 }
+    S{ particle_t f S{ float2_t f 0.3 0.3 } S{ float2_t f 0.3 0.3 } 4.0 }
+    S{ particle_t f S{ float2_t f 0.5 0.15 } S{ float2_t f 0.5 0.15 } 1.0 }
+    S{ particle_t f S{ float2_t f 0.5 0.1 } S{ float2_t f 0.5 0.1 } 9.0 }
+}
+
+: integrate-particles! ( particles dt -- particles )
+    [ verlet-integrate-particle ] curry map! ;
+
+TUPLE: fluids-world < game-world
+    particles texture framebuffer color-texture ramp { paused boolean initial: f } ;
+
+: make-texture ( pathname -- texture )
+    load-image
+    [
+        [ component-order>> ]
+        [ component-type>> ] bi
+        T{ texture-parameters
+           { wrap clamp-texcoord-to-edge }
+           { min-filter filter-nearest }
+           { mag-filter filter-nearest }
+           { min-mipmap-filter f } }
+        <texture-2d>
+    ]
+    [
+        0 swap [ allocate-texture-image ] 3keep 2drop
+    ] bi ;
+
+SYMBOL: fluid
+
+: integrate ( world -- )
+    particles>> $[ 60 fps 1000000 /f ] integrate-particles! drop ;
+
+: pause ( -- )
+    fluid get [ not ] change-paused drop ;
+
+: step ( -- )
+    fluid get paused>> [ fluid get integrate ] when ;
+
+M: fluids-world begin-game-world
+    dup fluid set
+    init-gpu
+    initial-particles clone >>particles
+    "C:/Users/erikc/Pictures/particle2.pgm" make-texture >>texture
+    "C:/Users/erikc/Pictures/colors.ppm" make-texture >>ramp
+
+    RGB float-components T{ texture-parameters
+                           { wrap clamp-texcoord-to-edge }
+                           { min-filter filter-linear }
+                           { min-mipmap-filter f }
+    } <texture-2d> >>color-texture
+
+    dup color-texture>> 0 <texture-2d-attachment> 1array f f { 320 240 } <framebuffer> >>framebuffer
+    drop ;
+
+M: fluids-world end-game-world
+    framebuffer>> dispose ;
+
+M: fluids-world tick-game-world
+    dup paused>> [ drop ] [ integrate ] if ;
+
+M:: fluids-world draw-world* ( world -- )
+    world framebuffer>> { { default-attachment { 0 0 0 } } } clear-framebuffer
+    system-framebuffer { { default-attachment { 0 0 0 } } } clear-framebuffer
+
+    f eq-add func-one func-one <blend-mode> dup <blend-state> set-gpu-state
+    f origin-upper-left 1.0 <point-state> set-gpu-state
+    world particles>> [
+        [ p>> [ x>> , ] [ y>> , ] bi ] each
+    ] curry float-array{ } make :> verts
+    
+    { 0 0 } { 320 240 } <rect> <viewport-state> set-gpu-state
+    GL_POINT_SPRITE glEnable
+    world verts {
+        { "primitive-mode" [ 2drop points-mode ] }
+        { "uniforms"       [ drop texture>> 50.0 window-point-uniforms boa ] }
+        { "vertex-array"   [ nip stream-upload draw-usage vertex-buffer byte-array>buffer &dispose window-point-program <program-instance> &dispose <vertex-array> &dispose ] }
+        { "indexes"        [ nip length 2 / 0 swap <index-range> ] }
+        { "framebuffer"    [ drop framebuffer>> ] }
+    } 2<render-set> render
+    
+    world color-texture>> gaussian-blur
+    { 0 0 } { 640 480 } <rect> <viewport-state> set-gpu-state
+    world ramp>> {
+        { "primitive-mode" [ 2drop triangle-strip-mode ] }
+        { "uniforms"       [ step-uniforms boa ] }
+        { "vertex-array"   [ 2drop <window-vertex-buffer> step-program <program-instance> <vertex-array> ] }
+        { "indexes"        [ 2drop T{ index-range f 0 4 } ] }
+    } 2<render-set> render
+    ;
+
+GAME: fluids {
+    { world-class fluids-world }
+    { title "Fluids Test" }
+    { pixel-format-attributes {
+        windowed double-buffered T{ depth-bits { value 24 } } } }
+    { pref-dim { 640 480 } }
+    { tick-interval-micros $[ 60 fps ] }
+} ;
+
+MAIN: fluids
+
+fluids-world H{
+    { T{ button-down } [ [
+        hand-loc get { 640 480 } v/ 2 v*n 1 v-n { 1 -1 } v* first2 float2_t <struct-boa>
+        dup 2.0 particle_t <struct-boa> suffix
+    ] change-particles drop ] }
+} set-gestures
diff --git a/extra/fluids/particle2.pgm b/extra/fluids/particle2.pgm
new file mode 100644 (file)
index 0000000..99bf7a4
--- /dev/null
@@ -0,0 +1,16388 @@
+P2
+# CREATOR: GIMP PNM Filter Version 1.1
+128 128
+255
+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
+1
+1
+2
+2
+3
+3
+3
+4
+4
+4
+4
+4
+4
+4
+4
+3
+4
+3
+3
+3
+2
+2
+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
+1
+3
+3
+3
+4
+5
+6
+6
+7
+7
+7
+7
+8
+8
+8
+8
+8
+8
+8
+8
+7
+7
+6
+6
+5
+5
+4
+4
+2
+2
+1
+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
+1
+2
+4
+4
+5
+6
+7
+7
+8
+8
+10
+10
+10
+11
+12
+12
+12
+12
+12
+12
+12
+12
+12
+11
+11
+11
+11
+10
+10
+9
+8
+7
+7
+6
+5
+5
+3
+2
+1
+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
+2
+3
+5
+6
+7
+7
+9
+10
+10
+11
+12
+13
+13
+14
+14
+15
+15
+15
+15
+16
+16
+16
+15
+15
+16
+15
+15
+15
+15
+14
+13
+13
+12
+12
+11
+10
+9
+7
+6
+6
+5
+4
+3
+1
+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
+1
+1
+3
+4
+6
+7
+9
+9
+10
+12
+13
+13
+15
+15
+16
+17
+17
+18
+18
+19
+19
+19
+20
+20
+20
+20
+20
+20
+20
+19
+19
+19
+19
+18
+17
+17
+16
+15
+14
+13
+13
+12
+10
+9
+8
+7
+6
+5
+3
+2
+1
+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
+1
+2
+4
+6
+7
+9
+9
+11
+12
+14
+15
+15
+16
+17
+19
+19
+19
+20
+21
+21
+23
+23
+23
+23
+23
+24
+24
+24
+24
+24
+24
+24
+22
+23
+23
+21
+21
+20
+19
+19
+19
+18
+16
+16
+15
+13
+12
+11
+10
+8
+6
+5
+4
+2
+1
+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
+1
+3
+4
+6
+8
+9
+11
+12
+13
+14
+16
+17
+18
+19
+20
+21
+22
+23
+23
+25
+25
+26
+26
+26
+27
+27
+27
+27
+28
+27
+28
+28
+27
+27
+27
+26
+26
+26
+25
+25
+24
+23
+22
+21
+21
+19
+18
+17
+16
+15
+13
+12
+10
+9
+8
+5
+4
+3
+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
+1
+2
+5
+6
+8
+9
+11
+13
+14
+16
+17
+19
+19
+20
+21
+23
+24
+25
+26
+27
+28
+28
+28
+29
+30
+30
+31
+31
+31
+32
+31
+32
+31
+32
+31
+32
+31
+31
+30
+29
+29
+28
+27
+27
+26
+25
+24
+23
+22
+20
+19
+18
+16
+15
+14
+13
+11
+9
+8
+6
+5
+2
+1
+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
+3
+4
+7
+8
+10
+12
+13
+15
+16
+18
+19
+20
+22
+23
+25
+26
+27
+28
+29
+30
+30
+32
+32
+33
+33
+34
+34
+35
+35
+35
+35
+35
+36
+35
+35
+35
+35
+34
+35
+34
+33
+33
+32
+32
+30
+30
+28
+28
+27
+26
+25
+23
+22
+21
+19
+18
+17
+15
+13
+11
+10
+8
+6
+5
+2
+1
+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
+2
+3
+6
+7
+10
+12
+13
+15
+17
+18
+20
+21
+22
+24
+26
+27
+28
+30
+31
+31
+32
+33
+34
+35
+36
+37
+37
+37
+38
+38
+39
+39
+40
+39
+39
+39
+39
+40
+39
+39
+38
+38
+37
+36
+36
+36
+34
+33
+33
+32
+30
+30
+29
+26
+26
+25
+23
+22
+20
+19
+17
+15
+14
+11
+9
+8
+5
+3
+2
+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
+3
+5
+7
+9
+11
+13
+15
+16
+19
+20
+22
+23
+25
+27
+28
+30
+30
+32
+33
+34
+35
+37
+37
+39
+40
+39
+40
+41
+42
+42
+43
+43
+43
+43
+44
+43
+44
+43
+43
+43
+42
+43
+41
+41
+40
+40
+39
+38
+38
+37
+35
+34
+34
+32
+30
+30
+28
+27
+25
+24
+22
+21
+19
+17
+15
+13
+11
+9
+7
+5
+3
+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
+1
+4
+6
+8
+11
+13
+15
+16
+18
+21
+22
+23
+25
+27
+28
+30
+32
+33
+35
+35
+37
+38
+39
+40
+41
+42
+43
+44
+45
+45
+45
+46
+47
+47
+47
+47
+47
+48
+47
+47
+47
+47
+47
+46
+45
+45
+45
+43
+43
+42
+41
+41
+40
+38
+37
+36
+34
+33
+32
+30
+28
+27
+26
+24
+22
+20
+18
+16
+15
+12
+10
+9
+6
+4
+2
+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
+3
+5
+8
+10
+11
+14
+16
+17
+19
+22
+24
+25
+27
+29
+31
+32
+34
+36
+36
+38
+39
+40
+42
+42
+44
+45
+45
+47
+48
+48
+49
+49
+50
+51
+50
+51
+51
+52
+51
+51
+51
+51
+51
+50
+50
+50
+49
+48
+47
+47
+46
+44
+44
+43
+42
+41
+40
+38
+37
+35
+33
+32
+31
+28
+27
+25
+24
+22
+20
+18
+15
+13
+11
+10
+8
+5
+2
+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
+1
+4
+6
+8
+11
+12
+15
+17
+19
+21
+23
+25
+27
+29
+31
+32
+34
+35
+38
+39
+40
+42
+43
+44
+45
+47
+48
+49
+49
+51
+52
+52
+52
+53
+54
+54
+54
+55
+55
+55
+55
+55
+55
+55
+54
+54
+53
+54
+53
+52
+52
+50
+50
+49
+47
+46
+45
+44
+43
+42
+41
+39
+37
+36
+34
+32
+31
+29
+27
+25
+23
+21
+19
+17
+15
+13
+10
+8
+5
+3
+1
+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
+1
+4
+7
+8
+11
+13
+16
+18
+21
+22
+25
+27
+28
+30
+32
+34
+35
+37
+39
+41
+42
+44
+45
+47
+48
+50
+50
+51
+53
+54
+55
+55
+55
+56
+57
+58
+58
+58
+59
+58
+59
+59
+59
+59
+58
+58
+58
+57
+57
+57
+56
+55
+54
+53
+52
+52
+50
+49
+48
+47
+46
+44
+42
+41
+40
+37
+36
+34
+32
+31
+29
+26
+24
+22
+20
+18
+16
+13
+11
+9
+6
+4
+1
+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
+2
+4
+7
+9
+12
+14
+17
+19
+21
+23
+26
+28
+30
+32
+34
+36
+37
+39
+41
+43
+44
+46
+48
+49
+51
+52
+53
+55
+55
+56
+57
+58
+59
+59
+60
+61
+62
+62
+62
+63
+63
+63
+63
+63
+63
+62
+62
+62
+62
+61
+60
+60
+59
+58
+57
+56
+55
+54
+53
+52
+51
+49
+47
+46
+44
+43
+41
+40
+37
+36
+34
+32
+30
+28
+25
+23
+21
+19
+17
+15
+12
+10
+7
+5
+2
+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
+3
+5
+8
+10
+13
+15
+17
+20
+22
+24
+27
+29
+31
+33
+35
+37
+39
+41
+43
+45
+46
+48
+50
+51
+53
+54
+56
+57
+58
+60
+60
+61
+62
+63
+63
+64
+65
+66
+66
+66
+67
+67
+67
+66
+67
+67
+67
+66
+66
+65
+65
+64
+64
+63
+62
+61
+61
+59
+58
+57
+55
+54
+53
+51
+50
+49
+46
+44
+43
+41
+39
+37
+35
+33
+31
+29
+27
+24
+22
+20
+17
+15
+12
+10
+7
+5
+3
+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
+3
+5
+8
+10
+13
+16
+19
+21
+23
+26
+28
+30
+32
+34
+37
+38
+41
+43
+45
+47
+48
+50
+52
+53
+55
+57
+58
+59
+60
+61
+63
+64
+65
+65
+67
+68
+68
+69
+69
+70
+70
+70
+70
+70
+71
+71
+71
+70
+71
+70
+69
+68
+68
+67
+66
+66
+65
+64
+63
+62
+60
+59
+58
+56
+55
+53
+52
+50
+49
+46
+44
+43
+40
+38
+37
+34
+32
+30
+28
+26
+23
+21
+18
+16
+13
+11
+8
+6
+2
+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
+3
+5
+8
+11
+14
+16
+18
+21
+24
+26
+29
+31
+33
+36
+37
+40
+42
+44
+46
+48
+50
+51
+54
+55
+56
+58
+60
+61
+63
+64
+65
+67
+67
+69
+70
+71
+71
+72
+73
+73
+74
+74
+74
+74
+75
+75
+75
+75
+75
+74
+74
+73
+73
+72
+71
+70
+70
+69
+68
+66
+65
+64
+63
+62
+60
+59
+56
+55
+53
+51
+50
+48
+46
+44
+41
+39
+37
+35
+33
+31
+28
+26
+24
+21
+19
+16
+14
+11
+9
+6
+2
+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
+3
+5
+9
+11
+13
+16
+19
+22
+24
+26
+30
+32
+34
+36
+39
+41
+43
+46
+48
+50
+51
+53
+55
+57
+58
+60
+62
+63
+65
+66
+68
+70
+70
+72
+73
+73
+75
+75
+76
+76
+77
+78
+78
+79
+78
+78
+79
+79
+78
+78
+78
+78
+77
+76
+75
+75
+75
+73
+73
+72
+70
+69
+68
+66
+65
+64
+62
+60
+59
+57
+56
+53
+51
+50
+48
+45
+44
+40
+39
+36
+34
+32
+29
+27
+24
+21
+19
+16
+14
+11
+9
+6
+3
+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
+3
+6
+8
+11
+14
+16
+19
+22
+24
+27
+30
+32
+35
+37
+40
+42
+44
+46
+48
+50
+53
+55
+57
+58
+61
+62
+64
+65
+67
+69
+70
+72
+73
+74
+75
+77
+78
+78
+79
+80
+80
+81
+81
+82
+82
+82
+83
+83
+83
+83
+82
+82
+81
+81
+81
+80
+79
+78
+78
+77
+75
+74
+73
+72
+71
+68
+67
+66
+64
+62
+61
+59
+57
+55
+52
+50
+49
+46
+44
+42
+39
+37
+35
+32
+30
+28
+24
+22
+19
+17
+14
+11
+9
+6
+2
+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
+3
+6
+9
+11
+14
+17
+19
+22
+25
+28
+31
+33
+35
+38
+41
+43
+45
+48
+50
+52
+54
+56
+58
+61
+62
+64
+65
+67
+69
+71
+72
+74
+75
+77
+78
+79
+80
+81
+82
+83
+84
+84
+85
+85
+86
+87
+87
+86
+86
+86
+86
+86
+86
+85
+85
+84
+84
+82
+82
+81
+80
+79
+78
+76
+75
+74
+73
+71
+69
+68
+66
+64
+62
+60
+58
+56
+54
+52
+50
+48
+45
+43
+40
+38
+35
+33
+30
+27
+25
+22
+20
+16
+13
+11
+8
+6
+2
+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
+2
+5
+8
+11
+14
+17
+19
+22
+25
+28
+31
+33
+35
+38
+41
+43
+45
+48
+51
+52
+54
+57
+59
+62
+64
+65
+68
+69
+71
+73
+75
+76
+78
+79
+80
+82
+83
+84
+85
+86
+87
+87
+89
+89
+89
+90
+90
+90
+90
+90
+90
+91
+90
+90
+89
+89
+88
+88
+87
+85
+85
+84
+82
+81
+81
+79
+77
+76
+75
+73
+71
+69
+68
+66
+63
+61
+59
+57
+55
+52
+50
+48
+45
+43
+40
+38
+36
+33
+31
+28
+25
+22
+19
+16
+14
+11
+8
+5
+2
+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
+2
+5
+8
+10
+13
+16
+20
+22
+25
+27
+31
+33
+36
+38
+41
+43
+46
+49
+51
+54
+56
+58
+60
+62
+64
+67
+69
+71
+73
+75
+77
+78
+80
+81
+83
+84
+85
+87
+88
+88
+89
+91
+91
+92
+93
+93
+94
+94
+94
+94
+94
+95
+94
+94
+94
+93
+93
+92
+91
+90
+90
+89
+87
+87
+86
+84
+83
+81
+80
+78
+77
+75
+73
+70
+69
+67
+65
+62
+60
+58
+56
+54
+51
+48
+46
+43
+42
+38
+36
+33
+31
+28
+25
+22
+19
+16
+13
+11
+8
+5
+2
+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
+1
+4
+7
+10
+13
+17
+19
+22
+25
+28
+30
+33
+36
+39
+41
+44
+47
+50
+52
+54
+56
+59
+61
+64
+66
+68
+70
+72
+74
+76
+77
+80
+82
+83
+85
+87
+87
+89
+90
+92
+92
+93
+94
+96
+96
+97
+97
+97
+98
+98
+98
+98
+98
+98
+98
+98
+97
+97
+95
+95
+94
+93
+92
+92
+90
+89
+88
+86
+84
+83
+81
+79
+78
+76
+74
+72
+70
+68
+66
+64
+61
+59
+57
+54
+52
+50
+46
+44
+41
+39
+36
+33
+30
+27
+25
+22
+19
+16
+13
+10
+7
+4
+1
+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
+3
+6
+10
+13
+16
+19
+21
+24
+27
+30
+33
+36
+39
+41
+45
+47
+50
+53
+55
+57
+59
+62
+64
+67
+69
+72
+74
+76
+77
+79
+81
+84
+85
+86
+89
+90
+91
+92
+94
+95
+96
+97
+98
+99
+100
+100
+101
+101
+101
+102
+102
+102
+102
+102
+102
+101
+101
+100
+100
+99
+99
+98
+96
+95
+94
+93
+91
+90
+88
+87
+85
+83
+82
+79
+78
+75
+74
+71
+69
+66
+65
+63
+60
+57
+54
+52
+50
+47
+44
+42
+39
+36
+33
+30
+27
+24
+22
+19
+15
+12
+9
+6
+4
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+9
+12
+16
+18
+21
+24
+27
+30
+34
+36
+39
+41
+44
+48
+49
+53
+55
+57
+61
+63
+66
+68
+70
+73
+75
+77
+79
+81
+82
+85
+87
+89
+90
+92
+93
+95
+97
+98
+99
+100
+101
+102
+103
+104
+104
+105
+105
+106
+106
+106
+106
+106
+106
+105
+106
+104
+104
+104
+102
+102
+101
+100
+99
+97
+96
+95
+93
+91
+91
+88
+87
+85
+83
+81
+79
+77
+75
+72
+71
+67
+65
+63
+60
+58
+55
+53
+50
+47
+44
+41
+39
+36
+33
+30
+27
+25
+21
+18
+15
+12
+9
+5
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+5
+8
+11
+14
+18
+21
+24
+26
+30
+33
+35
+38
+42
+44
+47
+50
+53
+55
+58
+61
+63
+66
+68
+71
+73
+75
+77
+80
+82
+84
+87
+88
+90
+92
+94
+95
+97
+99
+100
+101
+103
+103
+105
+106
+107
+108
+108
+109
+109
+109
+110
+110
+110
+110
+110
+110
+109
+109
+108
+107
+106
+106
+105
+104
+102
+101
+100
+99
+97
+95
+94
+91
+90
+88
+86
+85
+82
+80
+77
+75
+73
+70
+69
+66
+63
+60
+58
+55
+53
+50
+47
+44
+41
+39
+36
+33
+30
+27
+24
+20
+18
+14
+12
+8
+5
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+4
+7
+11
+14
+17
+20
+23
+26
+29
+33
+35
+38
+41
+44
+47
+50
+53
+55
+58
+61
+64
+66
+69
+71
+73
+77
+78
+81
+83
+86
+87
+90
+92
+93
+96
+97
+99
+100
+102
+103
+105
+107
+107
+108
+110
+110
+111
+112
+113
+113
+113
+114
+113
+113
+114
+113
+114
+113
+113
+112
+112
+110
+110
+108
+108
+106
+105
+104
+102
+100
+99
+97
+96
+94
+92
+90
+88
+85
+84
+81
+79
+76
+74
+71
+69
+66
+63
+61
+59
+55
+53
+50
+47
+44
+41
+39
+35
+32
+29
+26
+23
+20
+17
+13
+10
+7
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+10
+13
+16
+19
+23
+26
+28
+32
+35
+38
+41
+44
+47
+50
+53
+56
+58
+61
+64
+67
+69
+72
+74
+77
+80
+82
+85
+86
+89
+91
+93
+95
+97
+99
+101
+103
+104
+106
+108
+108
+110
+111
+112
+114
+114
+115
+116
+117
+117
+117
+118
+118
+117
+118
+118
+117
+117
+116
+116
+115
+115
+113
+113
+111
+110
+108
+107
+106
+104
+102
+101
+99
+97
+95
+93
+91
+89
+86
+85
+82
+79
+76
+74
+72
+69
+66
+64
+61
+58
+56
+52
+49
+47
+44
+41
+38
+35
+31
+28
+26
+22
+19
+16
+12
+9
+6
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+5
+8
+12
+15
+19
+21
+25
+28
+30
+34
+37
+40
+43
+47
+49
+52
+56
+58
+61
+63
+67
+70
+72
+75
+78
+80
+83
+85
+87
+90
+92
+94
+96
+99
+100
+102
+104
+106
+108
+109
+111
+112
+114
+115
+116
+117
+118
+119
+120
+120
+121
+121
+121
+121
+121
+122
+121
+122
+120
+120
+120
+119
+118
+118
+116
+115
+113
+112
+111
+109
+108
+106
+104
+102
+101
+98
+97
+94
+92
+90
+87
+85
+82
+80
+78
+75
+72
+70
+66
+64
+61
+58
+55
+52
+50
+46
+44
+40
+37
+34
+31
+27
+25
+21
+18
+15
+12
+9
+5
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+7
+11
+13
+17
+20
+23
+27
+30
+34
+37
+39
+43
+46
+48
+52
+55
+58
+61
+63
+66
+69
+72
+75
+77
+80
+83
+85
+88
+91
+93
+95
+97
+99
+102
+104
+106
+107
+110
+111
+113
+115
+116
+117
+119
+120
+121
+122
+123
+123
+124
+124
+125
+125
+125
+126
+125
+125
+125
+125
+124
+124
+122
+122
+120
+120
+118
+117
+116
+115
+112
+111
+109
+108
+105
+104
+102
+99
+97
+95
+93
+90
+88
+86
+83
+80
+77
+75
+72
+70
+66
+64
+61
+58
+54
+52
+48
+46
+43
+39
+36
+33
+30
+26
+23
+21
+17
+13
+10
+7
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+6
+9
+12
+16
+19
+22
+25
+29
+32
+35
+39
+42
+45
+48
+51
+54
+57
+60
+63
+66
+70
+72
+75
+78
+81
+83
+86
+89
+90
+94
+96
+98
+101
+103
+105
+107
+109
+111
+113
+115
+116
+118
+119
+121
+122
+124
+125
+126
+127
+127
+128
+128
+129
+129
+129
+130
+129
+129
+129
+129
+128
+127
+126
+126
+124
+123
+122
+122
+119
+118
+116
+114
+113
+112
+109
+107
+105
+103
+101
+98
+96
+93
+91
+88
+86
+83
+81
+78
+75
+72
+69
+66
+63
+60
+57
+54
+51
+48
+45
+41
+38
+36
+32
+29
+26
+23
+19
+16
+13
+9
+5
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+4
+8
+11
+14
+18
+21
+24
+28
+31
+34
+38
+41
+44
+47
+51
+53
+57
+60
+62
+66
+68
+72
+75
+78
+80
+83
+86
+89
+92
+93
+97
+99
+102
+104
+106
+109
+111
+112
+115
+116
+118
+120
+122
+124
+125
+126
+128
+128
+129
+131
+131
+132
+133
+133
+133
+134
+134
+133
+134
+133
+132
+132
+132
+130
+129
+129
+127
+126
+125
+123
+122
+120
+119
+116
+115
+112
+110
+108
+106
+104
+102
+99
+97
+94
+91
+89
+86
+83
+80
+78
+75
+72
+69
+66
+63
+60
+57
+53
+50
+47
+44
+41
+38
+34
+32
+28
+25
+21
+18
+15
+11
+7
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+9
+13
+16
+20
+23
+27
+30
+33
+37
+40
+43
+46
+50
+53
+56
+59
+62
+65
+68
+72
+74
+77
+81
+83
+86
+89
+92
+94
+97
+100
+102
+105
+106
+109
+112
+114
+115
+118
+120
+122
+124
+125
+127
+129
+130
+131
+133
+134
+134
+135
+136
+136
+137
+137
+138
+137
+137
+137
+137
+137
+136
+135
+135
+133
+132
+131
+130
+128
+127
+125
+124
+122
+120
+118
+116
+114
+111
+109
+107
+105
+102
+100
+97
+95
+92
+89
+86
+83
+80
+77
+74
+71
+68
+66
+62
+59
+56
+53
+49
+46
+43
+39
+37
+33
+30
+27
+23
+20
+17
+13
+10
+6
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+5
+8
+12
+15
+19
+22
+25
+29
+32
+35
+38
+42
+46
+48
+51
+55
+58
+61
+64
+68
+71
+74
+77
+80
+83
+86
+88
+91
+94
+97
+99
+103
+105
+108
+110
+113
+115
+117
+119
+121
+123
+125
+127
+129
+130
+132
+133
+135
+136
+137
+138
+139
+140
+140
+140
+141
+141
+141
+141
+141
+140
+140
+140
+138
+138
+137
+136
+135
+133
+132
+130
+128
+127
+125
+123
+121
+119
+117
+115
+113
+110
+108
+105
+103
+100
+97
+94
+92
+88
+86
+83
+80
+77
+74
+71
+68
+65
+62
+58
+55
+52
+48
+45
+42
+39
+36
+31
+29
+26
+22
+19
+15
+11
+8
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+10
+14
+17
+20
+24
+27
+30
+34
+37
+41
+44
+47
+51
+53
+57
+61
+64
+67
+70
+73
+76
+80
+82
+85
+88
+91
+94
+97
+100
+102
+105
+108
+110
+113
+116
+118
+121
+122
+125
+126
+128
+131
+133
+134
+135
+137
+139
+139
+141
+142
+143
+144
+144
+145
+145
+146
+146
+145
+145
+144
+145
+143
+142
+142
+141
+140
+139
+137
+135
+134
+132
+131
+128
+127
+125
+123
+120
+118
+116
+113
+110
+107
+105
+103
+100
+97
+95
+91
+89
+85
+82
+79
+76
+73
+70
+67
+63
+61
+57
+54
+50
+48
+44
+41
+37
+34
+30
+27
+24
+20
+17
+13
+10
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+5
+8
+11
+15
+19
+21
+25
+29
+32
+36
+39
+43
+46
+50
+53
+56
+60
+63
+66
+69
+72
+76
+78
+82
+85
+87
+91
+94
+97
+100
+103
+106
+108
+111
+114
+116
+119
+121
+124
+126
+128
+130
+132
+134
+136
+138
+140
+141
+143
+143
+144
+145
+146
+147
+148
+148
+149
+149
+149
+149
+149
+148
+148
+148
+146
+146
+145
+144
+142
+141
+139
+138
+136
+134
+132
+130
+128
+126
+123
+121
+119
+116
+114
+111
+109
+105
+102
+99
+97
+94
+91
+88
+85
+81
+79
+76
+72
+69
+66
+63
+60
+56
+53
+49
+46
+43
+39
+36
+32
+29
+26
+22
+19
+15
+11
+8
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+6
+9
+13
+17
+20
+23
+27
+31
+34
+38
+41
+45
+48
+51
+55
+58
+61
+64
+68
+72
+74
+77
+81
+85
+87
+91
+93
+96
+99
+103
+106
+108
+111
+114
+116
+119
+121
+124
+126
+128
+131
+133
+136
+137
+139
+141
+143
+144
+146
+147
+148
+150
+151
+151
+152
+153
+153
+153
+153
+153
+152
+153
+152
+151
+151
+150
+149
+147
+146
+145
+143
+141
+140
+137
+136
+134
+131
+129
+126
+124
+121
+119
+116
+113
+110
+108
+105
+103
+99
+97
+93
+91
+88
+84
+81
+78
+74
+72
+68
+65
+61
+58
+55
+52
+48
+45
+41
+37
+34
+31
+27
+23
+20
+17
+13
+9
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+4
+8
+11
+15
+18
+22
+25
+29
+33
+36
+39
+42
+46
+49
+53
+57
+60
+64
+66
+70
+74
+77
+80
+84
+86
+90
+93
+96
+99
+102
+105
+108
+111
+113
+116
+119
+122
+125
+127
+130
+132
+134
+136
+139
+141
+143
+145
+147
+148
+150
+151
+153
+153
+155
+155
+156
+156
+157
+157
+157
+157
+157
+156
+156
+155
+154
+153
+153
+151
+150
+148
+146
+144
+142
+140
+139
+136
+134
+131
+129
+127
+124
+122
+119
+117
+114
+111
+108
+105
+102
+99
+96
+93
+89
+86
+84
+80
+76
+73
+70
+67
+63
+60
+56
+54
+50
+46
+43
+39
+36
+32
+29
+25
+22
+18
+14
+11
+7
+4
+0
+0
+0
+0
+0
+0
+0
+0
+2
+5
+9
+12
+16
+20
+24
+26
+31
+34
+38
+42
+45
+48
+52
+55
+59
+62
+65
+69
+72
+75
+79
+83
+86
+89
+92
+95
+98
+102
+104
+107
+111
+113
+116
+119
+122
+124
+128
+130
+133
+135
+137
+139
+142
+144
+146
+148
+150
+151
+153
+154
+156
+157
+158
+159
+160
+161
+161
+160
+161
+161
+161
+160
+160
+159
+158
+157
+156
+155
+154
+152
+150
+148
+147
+144
+142
+140
+137
+135
+133
+130
+128
+124
+122
+119
+116
+113
+111
+107
+104
+101
+98
+95
+92
+89
+85
+82
+79
+75
+72
+68
+65
+62
+58
+55
+52
+48
+45
+41
+38
+35
+30
+27
+23
+19
+16
+13
+9
+5
+2
+0
+0
+0
+0
+0
+0
+0
+4
+7
+11
+14
+18
+22
+25
+28
+32
+36
+39
+43
+46
+50
+54
+57
+60
+64
+67
+71
+74
+77
+81
+84
+87
+91
+94
+98
+100
+104
+107
+110
+113
+116
+119
+122
+124
+127
+130
+133
+135
+139
+140
+143
+145
+147
+149
+152
+153
+155
+157
+158
+159
+161
+162
+163
+164
+164
+164
+164
+165
+165
+164
+165
+164
+162
+162
+161
+159
+158
+156
+155
+153
+152
+150
+147
+145
+142
+141
+138
+136
+133
+130
+127
+124
+122
+119
+116
+113
+110
+107
+104
+101
+97
+94
+91
+88
+84
+81
+77
+74
+71
+67
+64
+61
+57
+54
+50
+47
+43
+39
+36
+33
+28
+25
+22
+18
+14
+11
+6
+3
+0
+0
+0
+0
+0
+0
+1
+5
+9
+12
+16
+19
+23
+26
+30
+33
+38
+41
+44
+48
+51
+55
+58
+62
+66
+69
+73
+76
+80
+83
+86
+90
+93
+96
+99
+103
+106
+109
+112
+115
+118
+122
+125
+127
+130
+133
+136
+138
+141
+144
+146
+149
+150
+152
+154
+157
+158
+160
+162
+163
+165
+166
+166
+167
+168
+168
+169
+169
+168
+169
+168
+167
+167
+166
+165
+164
+162
+160
+158
+157
+155
+153
+150
+149
+146
+144
+141
+139
+136
+133
+130
+127
+124
+121
+118
+116
+113
+109
+106
+102
+99
+96
+93
+89
+86
+83
+80
+77
+73
+69
+66
+62
+59
+55
+51
+48
+44
+41
+37
+34
+31
+26
+23
+19
+16
+12
+8
+5
+1
+0
+0
+0
+0
+0
+2
+6
+10
+13
+17
+21
+24
+28
+31
+35
+39
+43
+46
+50
+53
+57
+61
+63
+68
+71
+74
+78
+81
+85
+88
+92
+95
+99
+102
+105
+108
+112
+115
+118
+121
+124
+127
+130
+132
+136
+138
+142
+144
+146
+149
+151
+154
+157
+159
+160
+162
+164
+165
+167
+168
+169
+170
+171
+172
+172
+172
+172
+173
+173
+172
+172
+171
+169
+168
+167
+165
+164
+162
+160
+158
+156
+154
+152
+149
+147
+144
+142
+139
+136
+133
+131
+127
+124
+121
+118
+114
+112
+108
+105
+101
+98
+95
+92
+88
+85
+81
+78
+74
+71
+68
+64
+60
+57
+54
+49
+46
+43
+38
+35
+31
+28
+25
+21
+17
+13
+9
+6
+3
+0
+0
+0
+0
+0
+3
+7
+11
+14
+18
+22
+26
+29
+33
+37
+40
+44
+48
+51
+55
+58
+62
+66
+69
+73
+76
+80
+83
+86
+90
+94
+97
+100
+104
+107
+110
+114
+117
+120
+123
+127
+130
+133
+136
+139
+142
+144
+147
+150
+152
+155
+157
+159
+161
+163
+166
+168
+169
+171
+172
+173
+174
+175
+176
+176
+177
+177
+177
+176
+176
+175
+174
+174
+172
+170
+169
+167
+166
+164
+161
+159
+157
+154
+152
+149
+147
+144
+141
+138
+135
+133
+130
+127
+123
+120
+117
+114
+110
+107
+104
+101
+97
+93
+90
+87
+83
+80
+77
+73
+69
+66
+62
+58
+55
+51
+48
+44
+40
+37
+33
+30
+26
+22
+18
+15
+11
+7
+4
+0
+0
+0
+0
+1
+5
+8
+12
+16
+20
+23
+27
+30
+34
+38
+42
+45
+49
+53
+57
+60
+63
+67
+71
+75
+78
+81
+85
+89
+92
+95
+99
+102
+106
+109
+113
+116
+119
+122
+126
+128
+132
+135
+138
+141
+144
+147
+149
+153
+155
+157
+160
+163
+165
+167
+169
+171
+173
+174
+175
+177
+178
+178
+179
+181
+180
+180
+180
+180
+179
+178
+178
+177
+175
+174
+172
+171
+169
+167
+165
+163
+160
+158
+155
+152
+150
+147
+144
+141
+138
+135
+132
+129
+126
+122
+119
+116
+112
+109
+106
+102
+99
+96
+92
+88
+85
+82
+78
+74
+71
+68
+63
+60
+56
+52
+49
+45
+42
+38
+34
+30
+27
+24
+19
+16
+12
+9
+4
+1
+0
+0
+0
+2
+6
+10
+13
+17
+21
+24
+28
+32
+35
+40
+43
+47
+51
+54
+58
+62
+65
+68
+72
+76
+79
+83
+87
+90
+93
+97
+101
+104
+108
+111
+114
+118
+121
+125
+128
+131
+134
+137
+141
+144
+147
+150
+153
+155
+158
+161
+163
+166
+168
+170
+172
+174
+177
+178
+179
+181
+182
+182
+184
+184
+184
+185
+185
+184
+184
+182
+182
+181
+179
+177
+176
+174
+172
+170
+168
+166
+163
+160
+158
+155
+152
+149
+147
+144
+140
+137
+134
+131
+128
+125
+121
+118
+115
+111
+108
+104
+101
+98
+94
+90
+87
+84
+80
+76
+72
+69
+65
+62
+58
+54
+50
+47
+43
+40
+36
+32
+29
+24
+21
+17
+13
+10
+6
+2
+0
+0
+0
+3
+7
+10
+15
+18
+22
+25
+30
+33
+37
+40
+45
+48
+52
+56
+59
+63
+67
+71
+74
+78
+81
+84
+88
+92
+95
+99
+102
+106
+109
+113
+117
+120
+124
+126
+130
+134
+137
+140
+143
+146
+150
+153
+155
+158
+161
+164
+166
+169
+171
+173
+176
+178
+179
+181
+183
+184
+186
+187
+187
+187
+188
+189
+189
+188
+187
+187
+186
+184
+183
+181
+180
+178
+175
+174
+171
+169
+166
+163
+160
+158
+155
+153
+149
+146
+143
+140
+137
+133
+130
+126
+123
+120
+116
+113
+110
+106
+103
+99
+95
+92
+88
+84
+82
+78
+73
+70
+66
+63
+59
+55
+52
+48
+45
+40
+37
+33
+29
+25
+22
+18
+14
+11
+7
+3
+0
+0
+0
+4
+8
+12
+15
+19
+23
+26
+31
+35
+38
+42
+46
+50
+53
+57
+61
+64
+67
+71
+75
+79
+83
+87
+90
+93
+97
+100
+104
+107
+112
+115
+119
+122
+125
+129
+132
+136
+139
+142
+145
+148
+152
+155
+158
+161
+164
+166
+169
+171
+174
+176
+179
+181
+183
+185
+186
+188
+190
+190
+191
+192
+192
+192
+193
+192
+191
+190
+189
+188
+187
+185
+183
+181
+179
+177
+174
+172
+169
+166
+164
+161
+158
+154
+151
+149
+145
+142
+138
+136
+132
+129
+125
+122
+118
+114
+111
+108
+105
+100
+97
+94
+89
+86
+82
+79
+76
+71
+68
+64
+60
+56
+53
+49
+46
+42
+39
+34
+31
+27
+23
+19
+16
+11
+8
+4
+1
+0
+1
+5
+9
+13
+16
+20
+24
+28
+32
+35
+39
+43
+47
+50
+55
+58
+61
+65
+69
+73
+77
+80
+84
+87
+91
+94
+99
+102
+106
+110
+113
+116
+120
+123
+127
+130
+134
+137
+140
+145
+148
+151
+154
+157
+160
+163
+166
+169
+172
+175
+177
+180
+182
+185
+186
+189
+190
+192
+193
+194
+195
+196
+196
+196
+196
+195
+195
+194
+193
+191
+190
+188
+187
+184
+182
+180
+177
+174
+171
+169
+166
+163
+160
+157
+153
+151
+148
+144
+140
+137
+134
+130
+127
+124
+121
+116
+113
+110
+105
+102
+98
+95
+91
+87
+84
+80
+77
+73
+69
+65
+62
+58
+54
+50
+46
+43
+39
+36
+32
+27
+24
+21
+17
+12
+9
+5
+2
+0
+2
+6
+9
+14
+17
+21
+25
+29
+32
+36
+40
+44
+48
+51
+55
+59
+63
+66
+70
+74
+78
+82
+85
+89
+92
+96
+100
+103
+108
+111
+114
+118
+121
+125
+128
+132
+136
+140
+143
+146
+149
+153
+156
+160
+162
+166
+169
+171
+174
+177
+180
+183
+185
+188
+189
+192
+194
+195
+197
+198
+199
+199
+200
+200
+200
+200
+199
+198
+197
+195
+194
+191
+190
+188
+185
+182
+180
+177
+175
+172
+169
+166
+163
+159
+156
+153
+150
+146
+143
+140
+136
+132
+129
+126
+121
+118
+115
+111
+107
+103
+100
+97
+93
+89
+85
+81
+78
+74
+71
+66
+63
+60
+55
+51
+47
+44
+40
+36
+32
+29
+25
+21
+17
+14
+10
+6
+2
+0
+3
+7
+11
+15
+18
+22
+26
+29
+33
+37
+41
+45
+49
+53
+56
+60
+63
+68
+72
+75
+79
+83
+87
+90
+94
+97
+101
+105
+109
+113
+116
+119
+124
+127
+131
+134
+137
+141
+145
+148
+152
+155
+158
+162
+165
+168
+171
+175
+177
+180
+183
+185
+188
+191
+193
+195
+197
+199
+200
+201
+203
+203
+204
+204
+204
+203
+202
+202
+200
+199
+197
+195
+193
+190
+188
+186
+183
+180
+177
+174
+171
+168
+165
+162
+158
+155
+151
+148
+144
+142
+138
+134
+131
+127
+123
+119
+116
+113
+109
+105
+102
+98
+94
+90
+86
+83
+79
+76
+71
+68
+64
+60
+56
+53
+49
+45
+41
+38
+34
+30
+26
+22
+18
+14
+10
+7
+3
+0
+4
+7
+11
+16
+19
+23
+26
+31
+35
+38
+42
+46
+49
+53
+57
+61
+65
+69
+72
+77
+80
+84
+87
+92
+96
+99
+102
+106
+110
+113
+117
+122
+124
+128
+132
+135
+139
+143
+146
+150
+153
+157
+160
+163
+167
+170
+173
+177
+180
+183
+186
+188
+191
+194
+196
+199
+200
+203
+204
+206
+207
+207
+208
+208
+208
+208
+206
+206
+204
+203
+201
+198
+196
+194
+191
+189
+186
+183
+180
+177
+174
+170
+167
+164
+160
+157
+153
+150
+146
+143
+140
+135
+132
+128
+125
+121
+117
+113
+110
+106
+103
+99
+95
+92
+88
+84
+80
+76
+72
+69
+64
+62
+57
+53
+50
+46
+42
+38
+35
+30
+27
+23
+19
+15
+11
+8
+3
+1
+4
+8
+12
+16
+20
+23
+28
+31
+36
+39
+43
+47
+51
+54
+59
+62
+66
+70
+74
+78
+81
+85
+89
+93
+96
+100
+104
+108
+111
+115
+119
+122
+126
+130
+134
+137
+140
+144
+148
+152
+155
+159
+162
+165
+169
+173
+176
+179
+183
+185
+189
+191
+194
+197
+199
+201
+204
+206
+208
+209
+211
+211
+212
+212
+212
+212
+210
+209
+208
+206
+204
+201
+199
+197
+194
+191
+188
+185
+182
+179
+175
+173
+169
+166
+162
+159
+155
+151
+148
+144
+140
+137
+134
+130
+126
+122
+119
+115
+112
+107
+104
+100
+96
+92
+89
+85
+81
+77
+73
+70
+66
+62
+58
+54
+50
+47
+43
+39
+36
+32
+28
+24
+20
+16
+12
+8
+5
+2
+6
+9
+13
+16
+21
+25
+28
+32
+36
+40
+44
+47
+51
+55
+59
+63
+66
+71
+74
+78
+82
+86
+89
+93
+97
+101
+104
+108
+113
+116
+120
+124
+128
+131
+135
+139
+142
+145
+149
+153
+156
+160
+164
+168
+171
+174
+178
+181
+184
+187
+191
+194
+196
+200
+202
+205
+208
+210
+211
+213
+214
+215
+216
+216
+215
+215
+214
+213
+211
+209
+207
+205
+202
+199
+197
+194
+191
+187
+185
+181
+178
+174
+170
+168
+164
+160
+157
+154
+149
+145
+142
+139
+135
+131
+128
+124
+120
+116
+112
+108
+104
+101
+98
+94
+90
+86
+82
+78
+74
+70
+67
+63
+59
+55
+51
+47
+43
+40
+36
+32
+28
+24
+21
+17
+13
+9
+5
+1
+5
+10
+13
+17
+21
+25
+29
+33
+37
+40
+45
+48
+52
+56
+60
+63
+67
+71
+75
+79
+83
+87
+90
+94
+98
+102
+106
+109
+113
+117
+121
+124
+128
+132
+136
+139
+143
+147
+151
+155
+158
+162
+165
+169
+172
+176
+179
+183
+187
+190
+193
+196
+199
+202
+205
+208
+210
+213
+215
+216
+218
+219
+219
+220
+219
+219
+218
+217
+215
+213
+211
+207
+205
+202
+200
+197
+193
+190
+187
+183
+179
+176
+172
+169
+165
+162
+158
+155
+151
+148
+143
+140
+136
+132
+128
+124
+121
+117
+113
+110
+106
+102
+98
+94
+90
+87
+83
+79
+76
+72
+67
+64
+60
+56
+52
+48
+45
+40
+37
+32
+29
+25
+21
+17
+13
+10
+6
+3
+7
+10
+14
+18
+21
+26
+30
+33
+37
+41
+45
+49
+52
+56
+61
+64
+68
+72
+76
+80
+84
+87
+92
+95
+99
+103
+107
+110
+114
+118
+121
+125
+130
+133
+137
+141
+145
+148
+152
+155
+160
+163
+167
+171
+174
+178
+181
+185
+189
+192
+195
+198
+202
+205
+208
+211
+214
+216
+218
+220
+222
+222
+224
+223
+224
+223
+221
+220
+218
+216
+213
+211
+208
+205
+202
+199
+195
+192
+188
+185
+181
+178
+174
+171
+167
+164
+159
+156
+152
+149
+145
+141
+138
+133
+129
+126
+122
+118
+114
+110
+107
+103
+99
+96
+91
+87
+84
+80
+75
+72
+69
+64
+61
+57
+53
+49
+45
+41
+37
+34
+30
+26
+22
+18
+13
+10
+6
+2
+7
+10
+14
+18
+22
+26
+30
+34
+38
+41
+46
+49
+54
+57
+61
+65
+68
+73
+76
+81
+84
+88
+92
+96
+100
+103
+107
+111
+115
+119
+123
+127
+130
+134
+138
+142
+146
+150
+153
+157
+161
+164
+168
+172
+175
+180
+183
+186
+190
+193
+197
+200
+204
+208
+211
+214
+217
+219
+222
+223
+225
+226
+227
+228
+227
+227
+225
+223
+222
+219
+216
+214
+211
+207
+204
+200
+197
+194
+190
+187
+183
+179
+175
+172
+168
+164
+161
+157
+153
+150
+145
+142
+138
+134
+130
+126
+123
+118
+115
+111
+107
+103
+100
+96
+92
+88
+85
+80
+76
+73
+69
+65
+61
+57
+53
+49
+45
+41
+37
+34
+29
+27
+22
+18
+15
+10
+7
+3
+7
+11
+15
+19
+22
+27
+30
+34
+38
+42
+46
+50
+53
+58
+62
+66
+70
+73
+77
+81
+85
+89
+93
+97
+101
+104
+109
+112
+116
+119
+123
+128
+132
+135
+139
+143
+146
+151
+154
+158
+161
+165
+169
+173
+177
+181
+185
+188
+191
+196
+199
+203
+206
+209
+212
+215
+219
+222
+224
+226
+229
+231
+231
+231
+231
+230
+229
+226
+224
+221
+219
+216
+212
+209
+206
+203
+199
+195
+191
+188
+184
+180
+177
+174
+170
+166
+162
+158
+155
+151
+146
+142
+139
+135
+131
+127
+123
+119
+116
+112
+109
+104
+100
+96
+92
+89
+85
+81
+78
+73
+70
+66
+62
+57
+54
+50
+46
+42
+39
+34
+31
+27
+23
+19
+15
+11
+7
+3
+7
+11
+15
+19
+23
+27
+31
+34
+39
+43
+46
+51
+54
+58
+62
+66
+70
+73
+78
+82
+86
+90
+93
+97
+101
+105
+109
+113
+116
+120
+124
+128
+132
+136
+139
+143
+147
+152
+155
+159
+163
+167
+170
+175
+178
+182
+185
+189
+193
+197
+200
+205
+207
+211
+215
+218
+221
+225
+227
+229
+232
+234
+235
+235
+235
+234
+232
+230
+227
+225
+221
+218
+215
+211
+207
+204
+200
+197
+193
+189
+185
+181
+178
+175
+170
+166
+163
+159
+155
+152
+147
+144
+140
+135
+132
+128
+124
+120
+116
+112
+108
+105
+101
+97
+93
+89
+85
+82
+78
+74
+69
+66
+62
+58
+54
+51
+46
+42
+39
+35
+31
+27
+23
+19
+15
+11
+7
+4
+7
+12
+16
+19
+24
+28
+31
+35
+39
+43
+46
+51
+55
+59
+63
+66
+70
+74
+78
+82
+86
+90
+93
+97
+102
+105
+110
+113
+117
+121
+125
+129
+133
+136
+140
+144
+148
+152
+156
+159
+163
+168
+171
+175
+179
+183
+187
+191
+194
+198
+202
+205
+209
+213
+216
+220
+224
+227
+230
+233
+235
+237
+239
+239
+239
+237
+235
+232
+230
+226
+224
+220
+217
+213
+209
+205
+201
+198
+194
+190
+186
+183
+179
+175
+171
+167
+164
+160
+156
+152
+148
+144
+141
+137
+132
+129
+125
+121
+117
+113
+109
+105
+101
+98
+94
+90
+85
+82
+78
+74
+70
+66
+62
+59
+55
+51
+47
+43
+39
+35
+31
+28
+23
+19
+15
+12
+7
+4
+8
+12
+15
+19
+23
+27
+31
+36
+39
+43
+47
+51
+55
+59
+63
+67
+70
+75
+78
+82
+86
+90
+94
+97
+102
+106
+110
+113
+117
+122
+125
+129
+133
+137
+141
+144
+148
+152
+156
+160
+164
+168
+171
+175
+180
+183
+188
+191
+195
+199
+203
+207
+210
+214
+218
+222
+225
+229
+232
+235
+238
+241
+242
+243
+242
+241
+238
+235
+232
+228
+225
+222
+218
+214
+210
+206
+203
+199
+195
+192
+187
+183
+180
+176
+172
+168
+164
+160
+156
+152
+148
+145
+141
+137
+133
+129
+126
+122
+117
+113
+109
+105
+102
+98
+93
+90
+86
+82
+79
+75
+70
+67
+63
+59
+55
+51
+47
+43
+39
+35
+31
+28
+23
+20
+16
+12
+8
+4
+8
+12
+16
+20
+24
+28
+32
+36
+39
+44
+47
+51
+55
+59
+63
+67
+70
+74
+79
+83
+87
+91
+94
+98
+102
+106
+110
+114
+117
+122
+125
+129
+133
+138
+141
+145
+149
+153
+156
+161
+165
+168
+172
+176
+180
+184
+188
+191
+195
+199
+203
+207
+212
+215
+219
+222
+226
+230
+234
+237
+241
+244
+246
+247
+246
+244
+240
+237
+234
+230
+227
+222
+219
+215
+212
+208
+204
+200
+196
+192
+188
+184
+181
+176
+173
+168
+165
+160
+157
+153
+149
+145
+141
+137
+133
+129
+125
+121
+117
+114
+110
+106
+102
+98
+94
+90
+86
+83
+78
+74
+71
+67
+63
+59
+55
+51
+47
+43
+40
+35
+31
+28
+24
+19
+15
+12
+8
+4
+8
+12
+16
+20
+23
+28
+31
+36
+39
+44
+47
+51
+55
+59
+63
+67
+71
+75
+79
+83
+86
+91
+95
+98
+102
+106
+110
+114
+118
+121
+126
+130
+134
+137
+141
+145
+149
+153
+157
+160
+165
+169
+173
+177
+180
+185
+188
+193
+196
+200
+204
+207
+211
+215
+219
+223
+227
+232
+235
+239
+243
+246
+249
+252
+250
+247
+243
+239
+235
+231
+227
+223
+220
+215
+212
+208
+204
+200
+196
+192
+188
+185
+181
+177
+172
+169
+165
+161
+157
+153
+149
+145
+141
+137
+134
+129
+126
+121
+118
+114
+110
+106
+102
+98
+94
+91
+86
+83
+79
+74
+71
+67
+63
+59
+55
+52
+47
+43
+39
+36
+31
+28
+24
+20
+16
+12
+8
+4
+8
+12
+16
+20
+24
+27
+31
+36
+40
+43
+47
+51
+55
+59
+62
+67
+70
+75
+78
+83
+87
+90
+95
+98
+102
+106
+110
+114
+118
+122
+126
+130
+133
+138
+141
+145
+149
+153
+157
+161
+165
+169
+173
+176
+181
+184
+189
+193
+196
+200
+204
+208
+212
+216
+220
+224
+227
+231
+235
+239
+243
+247
+251
+255
+251
+247
+243
+240
+236
+232
+227
+224
+219
+216
+212
+208
+204
+200
+196
+192
+189
+184
+180
+177
+173
+169
+165
+161
+157
+153
+149
+145
+142
+138
+134
+130
+126
+122
+117
+114
+110
+106
+102
+98
+95
+90
+86
+83
+78
+75
+71
+67
+63
+59
+55
+51
+47
+43
+39
+36
+32
+27
+24
+20
+16
+12
+8
+4
+8
+12
+16
+20
+24
+28
+32
+36
+39
+43
+47
+51
+55
+59
+63
+66
+70
+75
+78
+83
+86
+90
+94
+99
+102
+106
+110
+114
+118
+122
+126
+130
+133
+137
+142
+145
+149
+153
+157
+161
+164
+168
+173
+176
+180
+184
+188
+192
+196
+200
+203
+208
+211
+216
+220
+223
+227
+231
+235
+239
+243
+246
+249
+251
+249
+246
+243
+238
+235
+231
+228
+224
+219
+215
+212
+208
+204
+200
+196
+192
+188
+184
+181
+177
+172
+168
+165
+161
+157
+153
+149
+145
+141
+138
+133
+129
+126
+122
+118
+114
+110
+106
+102
+98
+94
+91
+86
+82
+79
+75
+70
+66
+63
+59
+55
+51
+47
+43
+39
+36
+32
+28
+24
+20
+16
+12
+9
+4
+8
+12
+15
+20
+23
+28
+32
+35
+39
+43
+47
+51
+55
+59
+63
+67
+70
+75
+79
+82
+86
+90
+94
+98
+102
+105
+110
+114
+118
+121
+125
+130
+133
+138
+141
+145
+149
+153
+156
+161
+165
+168
+172
+177
+180
+184
+188
+192
+196
+199
+203
+207
+211
+215
+219
+222
+227
+230
+234
+237
+241
+244
+246
+247
+246
+244
+241
+237
+234
+231
+226
+222
+218
+215
+211
+207
+204
+200
+195
+192
+188
+184
+181
+176
+173
+168
+165
+161
+157
+153
+149
+145
+141
+138
+133
+130
+125
+122
+117
+114
+109
+106
+102
+98
+94
+90
+86
+83
+79
+74
+71
+67
+62
+59
+55
+51
+47
+43
+39
+35
+31
+28
+24
+19
+16
+12
+8
+4
+8
+12
+16
+19
+23
+27
+31
+35
+39
+43
+47
+50
+55
+59
+63
+67
+70
+74
+79
+82
+86
+90
+94
+98
+102
+105
+110
+113
+118
+121
+125
+129
+133
+137
+141
+145
+149
+152
+156
+160
+164
+168
+172
+176
+180
+184
+188
+191
+195
+199
+202
+207
+211
+214
+217
+221
+225
+229
+232
+236
+239
+241
+242
+244
+242
+241
+238
+235
+232
+229
+226
+222
+218
+214
+210
+206
+202
+199
+195
+191
+188
+183
+180
+176
+171
+168
+164
+160
+157
+152
+148
+145
+141
+137
+133
+129
+125
+121
+118
+114
+109
+106
+102
+98
+94
+90
+86
+82
+79
+75
+70
+66
+62
+59
+55
+51
+47
+43
+39
+35
+31
+28
+23
+20
+16
+12
+8
+4
+8
+12
+16
+20
+24
+27
+31
+35
+39
+43
+47
+50
+54
+59
+62
+66
+70
+74
+78
+82
+85
+90
+93
+98
+101
+105
+109
+113
+117
+121
+124
+128
+133
+136
+140
+144
+148
+152
+155
+160
+163
+167
+171
+176
+179
+183
+187
+190
+194
+198
+201
+206
+209
+213
+216
+220
+223
+227
+230
+233
+236
+237
+238
+239
+238
+237
+236
+233
+230
+227
+223
+220
+216
+212
+209
+205
+202
+198
+194
+190
+186
+182
+179
+175
+171
+167
+164
+160
+156
+152
+148
+144
+140
+136
+132
+129
+125
+121
+117
+113
+109
+105
+101
+98
+93
+89
+86
+82
+78
+74
+70
+66
+62
+59
+54
+51
+47
+43
+39
+35
+31
+27
+23
+20
+15
+12
+7
+4
+8
+11
+15
+19
+23
+27
+31
+34
+39
+43
+47
+50
+54
+58
+62
+66
+70
+73
+77
+82
+85
+89
+93
+97
+101
+105
+109
+113
+116
+120
+124
+128
+132
+136
+139
+143
+148
+151
+155
+158
+163
+167
+170
+174
+178
+182
+185
+190
+193
+197
+201
+204
+207
+211
+214
+218
+222
+224
+227
+229
+232
+234
+235
+236
+235
+234
+232
+230
+228
+224
+221
+218
+215
+211
+207
+204
+200
+197
+193
+189
+186
+182
+178
+174
+171
+166
+162
+159
+155
+151
+148
+143
+140
+135
+132
+128
+124
+120
+117
+113
+109
+104
+101
+97
+93
+89
+86
+81
+78
+73
+69
+66
+62
+58
+55
+51
+46
+42
+39
+35
+31
+27
+23
+19
+15
+12
+7
+3
+7
+11
+14
+19
+23
+26
+30
+34
+38
+42
+46
+50
+53
+58
+61
+66
+69
+74
+77
+81
+84
+89
+93
+97
+101
+104
+108
+112
+116
+119
+124
+128
+131
+135
+139
+142
+146
+151
+154
+158
+162
+165
+170
+174
+177
+181
+185
+188
+192
+196
+199
+202
+206
+209
+213
+216
+219
+222
+224
+227
+228
+230
+232
+232
+231
+231
+229
+227
+225
+222
+219
+216
+213
+209
+205
+202
+199
+196
+192
+188
+185
+180
+176
+173
+169
+166
+162
+158
+154
+151
+146
+143
+139
+135
+131
+127
+124
+120
+116
+112
+108
+105
+100
+96
+92
+89
+85
+81
+77
+73
+69
+65
+61
+58
+54
+50
+46
+42
+38
+34
+30
+26
+23
+19
+14
+10
+6
+2
+6
+11
+15
+18
+22
+26
+30
+34
+37
+42
+46
+50
+53
+57
+61
+65
+69
+73
+76
+80
+84
+88
+92
+96
+100
+103
+107
+112
+115
+119
+122
+126
+131
+134
+138
+142
+146
+149
+153
+157
+161
+164
+169
+172
+176
+179
+183
+186
+190
+194
+197
+200
+204
+208
+210
+214
+216
+219
+222
+224
+225
+227
+227
+228
+227
+226
+225
+224
+221
+219
+217
+214
+210
+207
+204
+201
+197
+194
+190
+186
+183
+180
+176
+172
+169
+164
+160
+157
+153
+150
+146
+142
+138
+134
+131
+126
+123
+119
+115
+111
+107
+103
+99
+96
+92
+88
+84
+80
+76
+73
+69
+65
+61
+57
+54
+49
+45
+42
+37
+34
+30
+26
+23
+18
+14
+11
+7
+2
+6
+10
+14
+18
+22
+26
+29
+33
+38
+41
+45
+49
+53
+56
+60
+64
+68
+72
+76
+79
+84
+87
+91
+95
+99
+103
+106
+111
+114
+119
+122
+126
+129
+133
+137
+141
+145
+149
+152
+155
+160
+163
+167
+170
+175
+178
+182
+185
+188
+191
+196
+198
+201
+205
+208
+210
+213
+216
+218
+220
+222
+222
+223
+224
+224
+222
+222
+220
+218
+215
+213
+210
+208
+205
+201
+198
+195
+192
+188
+185
+181
+178
+174
+171
+167
+163
+160
+156
+152
+149
+145
+141
+137
+134
+130
+126
+122
+118
+115
+110
+106
+103
+99
+95
+91
+88
+84
+80
+76
+72
+68
+64
+60
+57
+53
+48
+45
+41
+38
+33
+29
+25
+22
+17
+14
+10
+6
+2
+5
+9
+13
+18
+22
+25
+29
+33
+36
+41
+44
+49
+52
+56
+60
+64
+67
+72
+75
+79
+83
+87
+91
+94
+98
+102
+106
+109
+114
+117
+121
+125
+129
+132
+136
+140
+144
+147
+151
+155
+158
+162
+165
+169
+173
+177
+179
+183
+187
+190
+193
+196
+199
+202
+205
+207
+210
+213
+215
+216
+218
+218
+220
+220
+220
+218
+218
+216
+214
+213
+210
+208
+205
+202
+199
+197
+193
+190
+187
+183
+180
+176
+172
+169
+165
+162
+159
+154
+151
+147
+144
+140
+136
+133
+129
+125
+121
+117
+114
+109
+106
+102
+98
+94
+91
+87
+83
+79
+76
+71
+67
+63
+60
+56
+52
+48
+44
+40
+36
+32
+29
+25
+21
+17
+13
+9
+5
+1
+5
+8
+13
+17
+21
+25
+28
+32
+36
+39
+44
+48
+51
+55
+59
+63
+67
+70
+74
+78
+82
+86
+90
+94
+97
+102
+105
+108
+112
+116
+120
+124
+127
+131
+135
+139
+142
+146
+149
+153
+157
+161
+164
+167
+171
+175
+177
+181
+184
+188
+191
+194
+197
+200
+202
+205
+207
+209
+211
+213
+214
+215
+215
+216
+216
+215
+214
+212
+211
+209
+207
+205
+202
+200
+197
+194
+191
+188
+184
+181
+177
+174
+171
+167
+164
+161
+156
+153
+150
+146
+142
+138
+134
+131
+128
+123
+120
+116
+112
+108
+105
+101
+98
+94
+89
+86
+82
+78
+75
+70
+67
+63
+59
+55
+51
+48
+44
+39
+36
+32
+28
+24
+20
+17
+12
+9
+5
+1
+5
+9
+12
+16
+20
+24
+27
+31
+35
+39
+43
+47
+50
+54
+58
+62
+65
+70
+74
+77
+81
+85
+88
+92
+96
+100
+104
+107
+112
+115
+118
+122
+126
+130
+133
+137
+140
+144
+148
+151
+155
+159
+162
+166
+169
+173
+175
+179
+183
+185
+188
+191
+194
+197
+199
+201
+204
+206
+208
+209
+210
+211
+212
+212
+212
+211
+210
+209
+207
+206
+204
+201
+199
+197
+194
+191
+189
+186
+182
+179
+176
+172
+169
+165
+162
+158
+155
+151
+148
+145
+140
+138
+133
+130
+126
+123
+119
+115
+111
+107
+103
+100
+96
+93
+89
+85
+81
+77
+74
+69
+65
+62
+58
+54
+51
+47
+42
+39
+35
+32
+27
+24
+20
+16
+13
+8
+4
+0
+3
+8
+12
+16
+19
+23
+27
+31
+35
+38
+42
+45
+49
+54
+57
+61
+65
+69
+72
+76
+80
+84
+88
+91
+96
+99
+103
+106
+110
+114
+118
+121
+125
+128
+132
+135
+140
+143
+146
+150
+153
+157
+160
+163
+167
+170
+174
+177
+179
+183
+186
+188
+191
+194
+197
+198
+201
+202
+204
+206
+207
+207
+208
+208
+208
+207
+207
+205
+204
+203
+200
+199
+196
+194
+191
+188
+185
+183
+180
+176
+174
+170
+167
+163
+160
+156
+154
+149
+147
+143
+139
+135
+132
+129
+125
+121
+117
+113
+110
+106
+102
+99
+96
+91
+87
+84
+80
+76
+73
+68
+65
+61
+57
+54
+49
+46
+42
+39
+34
+31
+26
+23
+19
+15
+12
+7
+4
+0
+3
+6
+11
+15
+18
+23
+26
+30
+34
+37
+41
+44
+49
+52
+57
+61
+64
+68
+71
+75
+79
+83
+86
+90
+94
+98
+101
+105
+108
+113
+116
+120
+123
+127
+130
+134
+137
+141
+145
+148
+152
+155
+158
+162
+165
+168
+171
+174
+177
+180
+183
+186
+189
+191
+193
+195
+197
+199
+201
+202
+203
+203
+204
+204
+204
+203
+203
+202
+201
+199
+197
+195
+193
+191
+188
+186
+183
+180
+177
+174
+171
+168
+164
+162
+158
+155
+151
+148
+144
+141
+137
+134
+130
+127
+123
+120
+116
+112
+108
+105
+101
+98
+94
+90
+87
+83
+79
+75
+71
+68
+64
+60
+57
+53
+49
+45
+42
+38
+33
+29
+26
+22
+18
+15
+11
+7
+3
+0
+2
+5
+10
+14
+17
+21
+25
+29
+33
+36
+40
+44
+48
+52
+55
+59
+63
+67
+70
+74
+78
+81
+85
+89
+93
+96
+100
+104
+108
+111
+114
+118
+122
+125
+129
+132
+135
+140
+143
+146
+149
+153
+156
+160
+162
+166
+168
+172
+174
+177
+180
+182
+186
+188
+190
+191
+194
+195
+196
+198
+199
+200
+200
+201
+200
+200
+199
+198
+197
+195
+194
+191
+189
+187
+185
+183
+180
+177
+174
+171
+168
+166
+162
+160
+156
+153
+149
+147
+143
+139
+135
+132
+129
+125
+122
+119
+114
+111
+108
+103
+100
+96
+93
+89
+85
+81
+78
+74
+70
+67
+63
+59
+55
+52
+48
+44
+40
+37
+33
+28
+25
+22
+18
+14
+10
+6
+2
+0
+1
+5
+9
+13
+17
+21
+24
+28
+32
+35
+39
+42
+47
+51
+54
+58
+61
+65
+69
+72
+77
+80
+84
+88
+91
+95
+99
+102
+106
+109
+113
+117
+120
+123
+127
+130
+134
+138
+141
+144
+148
+150
+154
+157
+160
+163
+166
+169
+172
+174
+177
+179
+182
+185
+186
+188
+190
+192
+193
+195
+195
+196
+196
+197
+196
+196
+195
+194
+193
+191
+190
+188
+186
+184
+182
+180
+177
+174
+171
+169
+166
+163
+160
+157
+154
+150
+148
+144
+141
+137
+134
+130
+127
+124
+120
+116
+113
+109
+106
+102
+98
+94
+91
+87
+84
+81
+76
+73
+69
+65
+61
+58
+54
+50
+47
+43
+39
+35
+31
+28
+24
+20
+17
+13
+9
+5
+1
+0
+0
+4
+8
+11
+16
+19
+23
+26
+30
+34
+39
+42
+45
+49
+53
+57
+60
+64
+68
+72
+75
+79
+83
+86
+89
+93
+97
+101
+104
+107
+111
+115
+118
+122
+125
+129
+132
+136
+139
+142
+145
+148
+151
+155
+157
+161
+164
+166
+169
+171
+174
+176
+179
+181
+183
+185
+186
+188
+189
+191
+191
+192
+192
+193
+192
+192
+191
+190
+190
+188
+187
+184
+183
+181
+179
+177
+174
+172
+169
+166
+163
+161
+158
+155
+152
+148
+145
+142
+139
+135
+132
+129
+125
+122
+118
+115
+111
+108
+104
+100
+97
+93
+89
+86
+83
+79
+75
+71
+68
+64
+61
+57
+53
+49
+46
+42
+38
+35
+31
+27
+23
+19
+15
+11
+8
+4
+0
+0
+0
+3
+7
+10
+14
+18
+22
+25
+29
+33
+37
+40
+44
+48
+52
+55
+60
+63
+66
+71
+74
+77
+81
+85
+88
+92
+95
+99
+102
+106
+110
+113
+117
+120
+123
+127
+130
+134
+137
+140
+143
+146
+149
+152
+155
+158
+161
+163
+166
+169
+171
+173
+176
+178
+179
+182
+183
+184
+186
+187
+187
+188
+188
+188
+188
+188
+187
+186
+186
+184
+183
+181
+179
+178
+175
+173
+171
+169
+166
+164
+161
+158
+155
+153
+150
+146
+143
+139
+136
+134
+130
+126
+124
+120
+116
+113
+109
+106
+102
+99
+96
+91
+89
+85
+81
+78
+74
+70
+66
+63
+59
+56
+52
+48
+44
+41
+37
+33
+30
+26
+22
+18
+15
+11
+7
+3
+0
+0
+0
+2
+6
+10
+13
+17
+21
+24
+29
+32
+36
+39
+43
+47
+50
+54
+58
+61
+65
+69
+73
+76
+80
+83
+86
+90
+94
+97
+101
+105
+107
+111
+114
+118
+121
+124
+128
+131
+134
+138
+140
+144
+147
+150
+153
+155
+158
+160
+163
+166
+168
+170
+172
+174
+176
+177
+179
+180
+181
+183
+184
+184
+184
+184
+184
+184
+184
+183
+181
+181
+179
+177
+176
+174
+172
+170
+168
+166
+163
+160
+158
+155
+153
+149
+146
+143
+141
+138
+135
+131
+128
+124
+121
+118
+115
+111
+108
+105
+100
+97
+94
+90
+86
+84
+80
+75
+73
+69
+65
+61
+57
+54
+51
+47
+43
+40
+35
+32
+28
+24
+20
+17
+13
+10
+6
+2
+0
+0
+0
+1
+5
+8
+12
+16
+19
+23
+27
+31
+35
+38
+41
+46
+49
+53
+56
+60
+64
+67
+71
+75
+78
+81
+85
+89
+92
+96
+99
+102
+105
+109
+112
+116
+119
+122
+126
+128
+132
+135
+138
+141
+144
+147
+150
+153
+155
+157
+160
+162
+164
+167
+169
+171
+173
+175
+176
+177
+178
+179
+179
+180
+180
+180
+181
+180
+179
+179
+178
+177
+175
+174
+172
+171
+169
+167
+164
+162
+160
+158
+155
+152
+149
+146
+144
+141
+138
+135
+132
+129
+125
+123
+119
+116
+112
+109
+106
+102
+99
+95
+92
+88
+85
+82
+78
+74
+71
+67
+63
+60
+56
+53
+49
+46
+42
+38
+35
+31
+27
+23
+20
+16
+12
+8
+5
+1
+0
+0
+0
+0
+3
+7
+11
+15
+18
+22
+26
+29
+33
+37
+41
+44
+47
+51
+55
+59
+62
+66
+70
+72
+76
+80
+83
+87
+90
+93
+97
+101
+103
+107
+111
+113
+117
+121
+124
+126
+130
+133
+136
+138
+141
+144
+147
+149
+152
+155
+157
+159
+162
+163
+165
+167
+169
+171
+172
+173
+174
+175
+176
+176
+176
+177
+177
+176
+176
+175
+174
+173
+172
+170
+169
+167
+165
+163
+162
+159
+157
+155
+152
+149
+147
+144
+141
+138
+136
+133
+129
+127
+123
+120
+117
+114
+110
+107
+104
+101
+97
+94
+91
+87
+83
+80
+76
+72
+69
+65
+62
+59
+55
+51
+48
+44
+40
+37
+33
+29
+26
+22
+18
+15
+11
+8
+3
+0
+0
+0
+0
+0
+3
+5
+10
+14
+17
+20
+24
+28
+32
+35
+39
+42
+46
+50
+54
+57
+60
+64
+67
+71
+74
+78
+82
+84
+88
+91
+95
+99
+102
+105
+108
+112
+114
+117
+121
+124
+128
+130
+133
+136
+139
+141
+144
+147
+149
+151
+154
+156
+158
+160
+163
+164
+165
+167
+169
+169
+170
+171
+172
+173
+173
+173
+173
+172
+172
+171
+170
+170
+169
+167
+166
+164
+162
+160
+158
+156
+154
+151
+149
+146
+144
+142
+139
+136
+133
+130
+127
+124
+121
+118
+114
+111
+108
+105
+102
+99
+95
+92
+89
+84
+81
+78
+75
+71
+68
+64
+61
+57
+53
+50
+46
+42
+39
+35
+32
+28
+24
+20
+17
+14
+9
+6
+2
+0
+0
+0
+0
+0
+1
+4
+8
+12
+16
+19
+23
+26
+30
+34
+37
+41
+45
+48
+52
+56
+58
+62
+66
+69
+73
+76
+80
+83
+87
+90
+93
+97
+100
+103
+106
+110
+112
+116
+118
+121
+124
+127
+131
+133
+136
+138
+141
+144
+146
+148
+151
+153
+155
+157
+159
+161
+161
+163
+165
+165
+167
+167
+168
+169
+169
+168
+168
+168
+168
+167
+166
+166
+165
+163
+162
+160
+159
+157
+155
+153
+151
+148
+146
+144
+141
+139
+136
+133
+131
+127
+125
+122
+118
+115
+113
+109
+106
+103
+100
+96
+93
+90
+86
+83
+80
+76
+72
+69
+66
+63
+59
+55
+52
+48
+45
+41
+38
+33
+30
+27
+23
+20
+16
+12
+9
+4
+0
+0
+0
+0
+0
+0
+0
+3
+6
+11
+14
+17
+21
+25
+29
+32
+36
+39
+43
+47
+50
+53
+57
+61
+63
+67
+71
+74
+77
+81
+84
+88
+91
+94
+97
+101
+103
+107
+110
+113
+116
+119
+122
+125
+128
+130
+133
+135
+138
+141
+143
+145
+148
+149
+152
+154
+155
+157
+158
+159
+161
+162
+162
+163
+164
+165
+165
+165
+165
+164
+164
+164
+163
+162
+160
+159
+158
+157
+156
+153
+152
+149
+147
+146
+143
+140
+138
+136
+133
+130
+127
+125
+122
+119
+116
+113
+109
+107
+103
+100
+97
+94
+90
+88
+84
+81
+77
+74
+71
+67
+64
+60
+57
+53
+50
+47
+43
+39
+36
+32
+28
+25
+22
+18
+15
+11
+7
+3
+0
+0
+0
+0
+0
+0
+0
+2
+6
+10
+13
+16
+20
+24
+27
+30
+34
+37
+42
+44
+48
+52
+55
+59
+62
+65
+68
+73
+76
+79
+82
+86
+89
+92
+95
+99
+101
+104
+108
+111
+114
+116
+119
+122
+125
+128
+130
+132
+135
+137
+139
+142
+144
+146
+148
+150
+151
+153
+155
+156
+157
+158
+159
+160
+160
+161
+161
+161
+161
+161
+161
+160
+159
+158
+157
+156
+154
+153
+152
+149
+148
+146
+144
+142
+140
+137
+135
+133
+130
+127
+125
+122
+120
+116
+114
+110
+107
+105
+102
+98
+95
+92
+89
+86
+82
+79
+76
+72
+68
+66
+62
+58
+55
+51
+48
+45
+42
+38
+34
+31
+27
+24
+20
+17
+13
+9
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+4
+8
+11
+15
+19
+21
+26
+28
+32
+36
+40
+43
+47
+50
+54
+56
+60
+64
+67
+70
+74
+77
+80
+83
+87
+90
+93
+95
+99
+102
+105
+108
+111
+114
+117
+119
+122
+125
+127
+130
+132
+134
+136
+139
+141
+143
+145
+146
+148
+150
+151
+153
+153
+154
+156
+155
+156
+157
+157
+157
+157
+157
+156
+156
+155
+154
+153
+152
+151
+149
+148
+146
+145
+143
+140
+139
+137
+134
+131
+129
+127
+125
+122
+120
+116
+114
+111
+108
+105
+102
+99
+96
+93
+90
+87
+84
+80
+77
+74
+70
+67
+63
+60
+57
+53
+50
+46
+43
+40
+36
+33
+29
+25
+21
+18
+14
+11
+8
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+10
+13
+16
+20
+24
+27
+31
+34
+37
+41
+45
+48
+52
+54
+58
+61
+65
+68
+71
+74
+77
+81
+84
+87
+90
+94
+96
+100
+102
+105
+108
+111
+113
+116
+119
+122
+124
+127
+129
+131
+133
+135
+137
+139
+141
+143
+144
+146
+147
+148
+149
+150
+151
+152
+152
+153
+153
+153
+153
+153
+152
+152
+151
+150
+149
+148
+147
+146
+144
+143
+141
+140
+138
+136
+133
+131
+129
+127
+124
+121
+119
+117
+114
+111
+108
+105
+103
+99
+96
+94
+91
+88
+84
+81
+78
+74
+71
+68
+64
+61
+58
+55
+51
+48
+45
+41
+38
+34
+30
+27
+24
+20
+17
+13
+10
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+4
+8
+11
+15
+19
+21
+25
+29
+32
+36
+39
+43
+46
+50
+53
+56
+59
+63
+66
+69
+72
+75
+78
+82
+85
+88
+91
+94
+97
+100
+103
+105
+108
+111
+113
+116
+118
+121
+124
+126
+128
+130
+132
+134
+135
+138
+139
+141
+142
+144
+145
+146
+147
+147
+148
+149
+149
+149
+149
+149
+149
+149
+148
+147
+147
+146
+144
+143
+143
+140
+139
+138
+136
+134
+132
+130
+128
+126
+124
+121
+119
+116
+113
+111
+108
+106
+102
+100
+97
+94
+91
+88
+85
+82
+78
+76
+72
+69
+66
+62
+59
+56
+52
+49
+46
+43
+39
+36
+32
+29
+25
+22
+18
+15
+11
+8
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+10
+13
+17
+20
+24
+27
+31
+34
+37
+41
+44
+47
+51
+54
+58
+60
+63
+66
+70
+73
+76
+79
+82
+85
+88
+92
+94
+97
+100
+103
+105
+108
+110
+113
+116
+118
+121
+122
+125
+126
+129
+130
+132
+134
+136
+137
+138
+140
+141
+142
+143
+144
+144
+145
+145
+145
+145
+145
+145
+145
+144
+144
+143
+142
+141
+140
+138
+137
+135
+134
+132
+130
+128
+127
+124
+122
+121
+118
+116
+113
+111
+108
+105
+102
+100
+97
+94
+91
+88
+85
+82
+79
+76
+73
+70
+67
+63
+60
+57
+54
+50
+48
+44
+40
+37
+34
+30
+27
+24
+20
+16
+14
+10
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+4
+8
+11
+15
+18
+22
+25
+28
+32
+35
+39
+41
+45
+48
+51
+55
+58
+61
+65
+68
+70
+74
+77
+80
+83
+86
+88
+92
+95
+97
+99
+102
+105
+107
+110
+112
+115
+117
+119
+121
+123
+125
+128
+128
+131
+132
+134
+135
+136
+137
+138
+139
+139
+140
+140
+141
+141
+141
+141
+141
+141
+141
+140
+139
+138
+137
+136
+135
+133
+132
+131
+129
+127
+125
+123
+121
+119
+116
+115
+112
+110
+108
+104
+103
+100
+97
+94
+91
+89
+86
+83
+79
+76
+74
+71
+68
+64
+61
+58
+55
+52
+48
+45
+42
+39
+35
+32
+29
+25
+22
+19
+15
+12
+7
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+6
+10
+13
+17
+20
+23
+26
+30
+33
+37
+39
+43
+46
+50
+53
+56
+59
+62
+65
+69
+71
+75
+77
+80
+83
+86
+89
+92
+94
+97
+100
+102
+104
+107
+109
+112
+114
+116
+118
+120
+122
+123
+125
+127
+128
+130
+131
+132
+133
+135
+135
+136
+137
+136
+137
+137
+138
+138
+137
+137
+136
+136
+135
+134
+133
+133
+131
+130
+128
+126
+125
+124
+122
+120
+118
+115
+114
+112
+109
+107
+105
+102
+100
+97
+94
+91
+89
+86
+83
+81
+78
+74
+72
+68
+66
+62
+59
+56
+53
+49
+47
+43
+40
+36
+33
+30
+27
+23
+20
+16
+13
+10
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+4
+8
+11
+14
+18
+21
+24
+27
+31
+35
+37
+41
+44
+47
+50
+53
+57
+59
+63
+66
+69
+72
+74
+78
+80
+83
+86
+88
+91
+94
+97
+99
+101
+104
+106
+108
+110
+112
+115
+116
+118
+120
+121
+123
+124
+126
+127
+128
+130
+130
+132
+132
+132
+133
+134
+134
+134
+134
+133
+133
+132
+132
+131
+130
+130
+129
+127
+126
+125
+123
+122
+120
+118
+116
+115
+113
+111
+109
+106
+103
+101
+99
+97
+94
+91
+89
+86
+83
+80
+77
+75
+72
+69
+66
+63
+60
+56
+54
+50
+47
+44
+41
+38
+34
+31
+28
+24
+22
+18
+14
+11
+7
+4
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+5
+9
+12
+16
+19
+22
+25
+29
+32
+36
+39
+42
+45
+48
+51
+54
+58
+60
+63
+66
+69
+72
+74
+78
+81
+83
+85
+89
+91
+93
+96
+98
+100
+103
+105
+107
+109
+112
+113
+115
+116
+118
+120
+121
+122
+123
+125
+126
+127
+127
+128
+129
+129
+130
+129
+130
+130
+129
+129
+128
+128
+127
+126
+126
+125
+123
+122
+121
+119
+118
+116
+115
+113
+111
+109
+108
+105
+103
+101
+98
+96
+94
+90
+88
+86
+83
+81
+77
+75
+72
+69
+66
+64
+60
+57
+54
+51
+48
+45
+42
+38
+36
+32
+29
+25
+22
+19
+16
+12
+9
+5
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+4
+7
+10
+14
+17
+20
+24
+27
+30
+33
+36
+39
+42
+45
+49
+51
+54
+58
+61
+64
+67
+69
+72
+75
+77
+80
+82
+85
+88
+90
+93
+95
+98
+100
+102
+103
+105
+108
+109
+111
+113
+115
+116
+118
+119
+120
+121
+122
+123
+124
+125
+124
+125
+125
+125
+126
+126
+125
+125
+125
+124
+124
+123
+122
+121
+119
+119
+118
+116
+114
+113
+111
+110
+107
+106
+104
+101
+100
+97
+95
+92
+90
+88
+85
+83
+80
+78
+75
+72
+69
+67
+64
+60
+58
+55
+52
+49
+45
+43
+39
+36
+33
+30
+26
+24
+20
+17
+13
+10
+7
+4
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+5
+8
+12
+15
+18
+21
+24
+27
+31
+34
+37
+40
+43
+47
+49
+52
+55
+58
+61
+64
+66
+69
+72
+75
+77
+80
+82
+84
+87
+90
+92
+94
+96
+99
+100
+103
+104
+106
+107
+109
+111
+113
+113
+115
+116
+117
+118
+119
+119
+120
+120
+121
+122
+122
+122
+122
+122
+122
+121
+121
+120
+119
+118
+117
+116
+115
+114
+113
+111
+110
+108
+106
+104
+103
+101
+98
+96
+94
+92
+90
+88
+85
+82
+80
+77
+74
+72
+69
+66
+64
+61
+58
+55
+52
+49
+46
+43
+40
+37
+34
+31
+28
+25
+22
+18
+15
+12
+9
+5
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+9
+13
+16
+19
+22
+26
+28
+31
+34
+38
+40
+43
+47
+49
+53
+55
+58
+61
+64
+67
+69
+72
+74
+77
+79
+82
+84
+86
+88
+91
+93
+95
+97
+98
+101
+103
+104
+106
+107
+108
+110
+111
+112
+113
+114
+115
+116
+116
+117
+117
+118
+117
+118
+118
+118
+118
+117
+117
+116
+115
+115
+113
+112
+112
+110
+109
+108
+106
+104
+102
+101
+99
+97
+95
+93
+91
+89
+86
+85
+82
+80
+77
+74
+72
+69
+67
+63
+61
+58
+56
+53
+50
+47
+44
+41
+38
+34
+32
+28
+25
+22
+19
+16
+13
+10
+6
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+4
+7
+10
+13
+17
+20
+23
+26
+29
+32
+36
+38
+41
+44
+47
+49
+53
+56
+58
+61
+63
+66
+69
+71
+74
+76
+78
+81
+84
+86
+88
+89
+91
+93
+96
+97
+99
+100
+102
+104
+105
+106
+108
+108
+110
+111
+111
+112
+112
+113
+113
+114
+114
+114
+114
+114
+113
+113
+112
+112
+111
+110
+110
+108
+108
+107
+105
+103
+102
+101
+99
+97
+96
+93
+92
+90
+88
+85
+83
+81
+79
+76
+74
+71
+69
+66
+64
+61
+59
+55
+53
+50
+47
+44
+41
+39
+35
+32
+30
+27
+23
+20
+16
+13
+10
+8
+4
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+2
+5
+8
+12
+15
+18
+20
+24
+27
+30
+33
+36
+39
+41
+44
+47
+50
+53
+55
+58
+60
+63
+66
+69
+70
+73
+76
+78
+80
+82
+84
+86
+88
+90
+92
+93
+95
+97
+98
+99
+101
+102
+104
+105
+106
+106
+107
+108
+109
+109
+110
+109
+110
+110
+110
+110
+109
+109
+109
+108
+108
+107
+106
+104
+104
+103
+102
+100
+99
+97
+96
+93
+92
+90
+88
+86
+85
+83
+80
+78
+75
+73
+71
+68
+65
+64
+61
+59
+55
+53
+50
+47
+44
+41
+39
+36
+33
+29
+27
+24
+21
+17
+14
+12
+8
+4
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+3
+6
+8
+12
+15
+18
+22
+25
+27
+30
+33
+36
+39
+42
+45
+47
+50
+53
+55
+58
+60
+63
+65
+68
+70
+72
+75
+77
+78
+81
+83
+85
+87
+89
+90
+92
+93
+95
+96
+97
+99
+100
+101
+102
+102
+103
+104
+105
+105
+105
+106
+106
+106
+106
+106
+105
+105
+104
+104
+104
+103
+102
+101
+100
+99
+98
+96
+95
+94
+92
+91
+88
+87
+85
+83
+81
+79
+76
+74
+73
+70
+67
+66
+63
+60
+58
+55
+53
+49
+47
+44
+42
+39
+36
+33
+30
+27
+24
+21
+18
+15
+12
+9
+6
+2
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+3
+6
+10
+12
+16
+18
+22
+25
+27
+31
+33
+36
+39
+41
+44
+47
+49
+52
+55
+57
+60
+62
+64
+67
+69
+71
+73
+76
+77
+79
+81
+83
+85
+87
+88
+90
+92
+93
+94
+95
+96
+98
+99
+99
+100
+100
+101
+101
+102
+102
+102
+102
+102
+102
+102
+102
+100
+100
+100
+99
+98
+97
+96
+95
+94
+92
+92
+90
+88
+87
+85
+84
+82
+79
+78
+76
+73
+71
+69
+67
+64
+62
+59
+58
+55
+52
+50
+47
+45
+42
+39
+36
+33
+31
+27
+24
+22
+18
+16
+13
+9
+7
+3
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+4
+8
+10
+13
+16
+19
+22
+25
+27
+30
+34
+36
+39
+41
+44
+47
+49
+52
+55
+57
+59
+61
+64
+66
+68
+70
+73
+74
+76
+78
+79
+81
+83
+84
+87
+88
+89
+90
+92
+93
+93
+94
+95
+96
+96
+97
+98
+98
+98
+99
+98
+99
+98
+98
+97
+97
+97
+95
+95
+94
+94
+92
+92
+90
+89
+87
+86
+85
+83
+81
+80
+78
+76
+74
+72
+71
+68
+66
+64
+61
+59
+57
+54
+52
+49
+47
+45
+41
+39
+36
+33
+30
+27
+24
+22
+19
+16
+13
+11
+7
+4
+1
+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
+1
+4
+7
+11
+14
+16
+19
+23
+25
+28
+31
+34
+35
+38
+41
+44
+46
+48
+51
+53
+56
+58
+60
+62
+64
+67
+69
+70
+73
+75
+76
+78
+79
+81
+82
+84
+86
+87
+87
+89
+90
+91
+91
+92
+93
+93
+93
+94
+95
+94
+94
+94
+94
+94
+94
+93
+92
+92
+91
+90
+89
+88
+87
+87
+86
+84
+83
+81
+79
+78
+76
+74
+73
+71
+68
+67
+65
+63
+61
+58
+56
+54
+51
+49
+46
+43
+41
+38
+36
+33
+30
+27
+25
+22
+19
+17
+14
+11
+8
+5
+2
+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
+2
+5
+8
+11
+13
+17
+20
+22
+25
+27
+30
+33
+36
+38
+40
+43
+45
+48
+50
+53
+55
+57
+59
+61
+63
+66
+67
+69
+71
+73
+74
+76
+77
+79
+81
+82
+83
+84
+84
+86
+86
+88
+88
+88
+89
+90
+90
+90
+91
+90
+91
+91
+90
+90
+89
+89
+88
+87
+87
+86
+85
+84
+83
+82
+80
+79
+78
+76
+75
+73
+71
+69
+68
+66
+63
+61
+59
+57
+55
+52
+50
+48
+46
+43
+40
+38
+35
+33
+30
+27
+25
+22
+20
+16
+13
+11
+8
+5
+2
+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
+2
+5
+9
+11
+13
+16
+20
+22
+25
+28
+30
+33
+36
+38
+40
+42
+44
+48
+50
+51
+54
+56
+58
+60
+62
+64
+66
+68
+69
+70
+72
+74
+75
+77
+78
+79
+80
+81
+82
+83
+84
+85
+85
+86
+86
+86
+86
+86
+86
+86
+86
+86
+86
+86
+84
+85
+83
+83
+82
+81
+80
+79
+78
+77
+76
+73
+72
+71
+69
+68
+65
+64
+62
+60
+58
+56
+54
+51
+49
+47
+45
+42
+40
+37
+35
+33
+30
+27
+25
+22
+20
+17
+14
+11
+8
+5
+2
+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
+3
+6
+9
+11
+14
+16
+19
+22
+25
+27
+30
+32
+34
+37
+39
+42
+44
+46
+49
+50
+52
+55
+57
+59
+60
+62
+64
+65
+68
+68
+70
+72
+72
+74
+75
+76
+77
+78
+79
+79
+80
+81
+81
+82
+82
+82
+83
+83
+83
+82
+83
+82
+81
+81
+80
+80
+79
+78
+77
+76
+76
+74
+72
+71
+70
+68
+67
+66
+64
+62
+61
+58
+56
+55
+53
+50
+48
+46
+45
+42
+39
+37
+35
+32
+29
+27
+25
+22
+20
+16
+14
+11
+9
+6
+2
+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
+3
+6
+8
+11
+13
+17
+20
+21
+25
+27
+29
+32
+34
+36
+39
+41
+43
+45
+48
+49
+51
+53
+55
+57
+58
+60
+62
+63
+65
+67
+68
+70
+70
+71
+72
+73
+75
+76
+75
+77
+77
+77
+78
+78
+79
+78
+78
+78
+78
+78
+78
+78
+77
+77
+76
+75
+75
+74
+73
+72
+70
+69
+67
+67
+65
+64
+62
+61
+59
+57
+56
+53
+51
+49
+47
+46
+43
+41
+39
+36
+34
+31
+29
+27
+24
+22
+19
+17
+14
+11
+8
+5
+3
+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
+2
+5
+8
+11
+13
+16
+18
+21
+24
+26
+29
+30
+33
+36
+37
+40
+42
+44
+46
+48
+50
+51
+53
+55
+56
+58
+60
+61
+62
+64
+66
+66
+67
+69
+70
+70
+71
+72
+73
+74
+73
+74
+75
+75
+74
+75
+74
+75
+74
+74
+74
+73
+73
+72
+72
+70
+70
+68
+67
+67
+65
+64
+62
+61
+60
+58
+57
+55
+54
+52
+50
+48
+46
+44
+42
+40
+37
+35
+33
+31
+29
+27
+24
+22
+19
+16
+14
+11
+8
+6
+3
+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
+3
+6
+8
+11
+13
+16
+18
+21
+23
+25
+28
+30
+32
+34
+36
+39
+40
+43
+44
+46
+48
+50
+52
+53
+55
+56
+58
+59
+60
+62
+63
+64
+65
+66
+67
+67
+68
+68
+70
+70
+70
+70
+71
+70
+71
+70
+71
+70
+70
+70
+69
+68
+69
+67
+66
+66
+64
+64
+62
+62
+60
+59
+58
+57
+55
+53
+52
+50
+48
+46
+45
+43
+40
+38
+36
+35
+32
+29
+28
+25
+23
+20
+18
+16
+13
+11
+8
+5
+2
+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
+2
+5
+8
+10
+13
+15
+18
+20
+22
+25
+27
+29
+31
+33
+35
+37
+39
+41
+42
+45
+47
+48
+49
+51
+53
+54
+55
+56
+58
+59
+60
+61
+62
+63
+63
+64
+65
+65
+66
+67
+66
+67
+67
+67
+67
+67
+67
+66
+66
+66
+64
+65
+64
+63
+62
+61
+60
+59
+58
+57
+56
+54
+53
+51
+50
+48
+46
+45
+43
+41
+40
+37
+35
+33
+31
+29
+26
+24
+22
+20
+18
+15
+13
+10
+7
+5
+2
+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
+2
+5
+7
+9
+12
+14
+17
+19
+22
+24
+26
+28
+30
+31
+34
+35
+37
+39
+41
+43
+45
+46
+48
+49
+50
+52
+53
+54
+56
+56
+57
+59
+59
+60
+61
+61
+61
+62
+63
+62
+63
+63
+63
+63
+62
+63
+62
+62
+61
+61
+61
+59
+59
+58
+57
+56
+55
+54
+53
+52
+50
+49
+47
+46
+44
+43
+41
+40
+37
+36
+34
+32
+30
+28
+25
+24
+21
+19
+17
+14
+12
+10
+7
+4
+2
+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
+1
+4
+6
+9
+12
+14
+16
+18
+21
+22
+24
+27
+28
+30
+32
+35
+36
+37
+40
+41
+43
+44
+45
+47
+48
+49
+50
+52
+52
+54
+55
+55
+56
+56
+58
+57
+58
+59
+58
+58
+59
+59
+59
+59
+59
+59
+58
+58
+57
+57
+56
+55
+55
+53
+53
+52
+51
+49
+48
+47
+45
+44
+42
+41
+39
+37
+36
+34
+32
+31
+29
+27
+25
+22
+20
+18
+16
+14
+11
+8
+6
+4
+2
+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
+1
+3
+6
+9
+11
+12
+15
+17
+19
+21
+23
+25
+27
+28
+31
+33
+34
+36
+37
+39
+40
+42
+43
+44
+46
+46
+48
+49
+50
+51
+52
+52
+53
+54
+54
+54
+54
+55
+55
+55
+55
+56
+55
+54
+54
+54
+54
+53
+52
+52
+52
+50
+49
+49
+48
+47
+46
+44
+43
+42
+40
+39
+37
+36
+34
+33
+30
+29
+27
+25
+23
+21
+19
+16
+15
+12
+11
+8
+6
+4
+1
+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
+2
+5
+7
+9
+12
+14
+16
+18
+20
+22
+24
+26
+27
+29
+31
+33
+33
+35
+37
+38
+40
+40
+41
+42
+44
+45
+46
+46
+48
+48
+49
+50
+49
+51
+50
+51
+51
+52
+51
+51
+51
+51
+50
+50
+50
+49
+48
+49
+47
+47
+46
+45
+44
+43
+42
+41
+39
+38
+37
+35
+34
+32
+30
+28
+27
+25
+23
+21
+19
+17
+15
+14
+12
+10
+7
+5
+3
+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
+2
+4
+6
+8
+10
+13
+15
+17
+18
+21
+22
+23
+25
+27
+29
+30
+32
+33
+35
+35
+37
+38
+39
+40
+41
+42
+43
+44
+44
+45
+46
+46
+46
+47
+47
+47
+48
+47
+47
+47
+47
+47
+47
+46
+46
+45
+44
+43
+43
+42
+41
+40
+39
+38
+37
+35
+34
+33
+32
+30
+29
+27
+26
+24
+22
+20
+19
+17
+15
+13
+11
+8
+6
+4
+2
+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
+1
+3
+5
+7
+9
+11
+13
+15
+17
+18
+20
+22
+23
+25
+27
+28
+29
+30
+32
+33
+34
+36
+36
+37
+38
+39
+40
+40
+41
+42
+42
+42
+43
+43
+44
+43
+43
+44
+43
+43
+43
+42
+42
+41
+41
+41
+40
+39
+38
+37
+37
+35
+34
+33
+32
+31
+29
+28
+26
+25
+23
+22
+20
+19
+16
+15
+12
+11
+9
+7
+5
+3
+1
+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
+2
+4
+5
+7
+9
+12
+13
+15
+16
+19
+20
+21
+23
+24
+25
+27
+29
+29
+31
+32
+33
+33
+34
+35
+35
+37
+37
+38
+39
+38
+38
+39
+39
+39
+40
+40
+39
+39
+39
+38
+38
+38
+37
+37
+36
+35
+34
+34
+33
+31
+31
+30
+28
+26
+26
+25
+23
+21
+20
+18
+17
+14
+13
+11
+10
+7
+6
+4
+2
+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
+1
+2
+4
+6
+8
+9
+11
+13
+15
+17
+17
+19
+20
+22
+23
+24
+26
+27
+28
+29
+30
+31
+32
+32
+33
+34
+34
+34
+35
+35
+35
+35
+36
+35
+36
+35
+35
+35
+35
+34
+34
+33
+32
+32
+31
+31
+29
+29
+28
+27
+26
+25
+24
+22
+21
+19
+18
+16
+15
+13
+12
+10
+7
+6
+4
+3
+1
+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
+1
+3
+5
+6
+8
+9
+11
+13
+14
+16
+17
+18
+20
+20
+21
+23
+24
+25
+26
+26
+28
+28
+29
+29
+30
+31
+31
+31
+32
+31
+31
+31
+31
+32
+31
+31
+30
+30
+30
+29
+28
+29
+28
+27
+26
+25
+24
+23
+21
+21
+20
+18
+17
+15
+14
+13
+11
+10
+8
+6
+4
+2
+1
+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
+3
+4
+6
+7
+9
+10
+12
+13
+15
+15
+17
+18
+19
+20
+21
+22
+23
+24
+24
+25
+26
+26
+26
+27
+27
+27
+28
+28
+28
+28
+28
+27
+27
+27
+27
+26
+26
+25
+25
+24
+23
+22
+21
+20
+20
+18
+17
+15
+15
+13
+12
+11
+9
+8
+6
+5
+2
+1
+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
+3
+4
+5
+7
+8
+10
+10
+12
+14
+15
+16
+16
+18
+19
+19
+19
+20
+21
+22
+22
+23
+23
+23
+24
+23
+24
+24
+24
+24
+23
+24
+23
+23
+22
+22
+21
+20
+20
+19
+19
+18
+16
+15
+14
+13
+12
+11
+10
+9
+7
+6
+4
+3
+1
+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
+1
+3
+4
+6
+7
+9
+10
+11
+11
+12
+13
+14
+15
+16
+17
+17
+18
+18
+18
+19
+20
+20
+20
+20
+20
+19
+19
+19
+19
+19
+19
+18
+18
+17
+17
+16
+15
+14
+14
+13
+11
+11
+9
+8
+8
+6
+4
+4
+2
+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
+1
+3
+4
+4
+6
+6
+8
+9
+9
+11
+11
+12
+13
+14
+14
+14
+15
+15
+15
+16
+16
+16
+16
+16
+16
+15
+15
+15
+15
+14
+14
+13
+13
+12
+11
+11
+9
+9
+8
+7
+5
+4
+4
+2
+1
+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
+1
+2
+3
+4
+5
+6
+7
+8
+9
+9
+9
+10
+10
+11
+11
+11
+12
+11
+12
+12
+12
+12
+12
+11
+11
+11
+11
+10
+9
+9
+8
+7
+7
+6
+6
+4
+3
+2
+1
+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
+1
+2
+3
+4
+5
+5
+6
+6
+7
+7
+7
+7
+8
+8
+8
+8
+8
+8
+8
+7
+8
+7
+6
+6
+6
+5
+5
+4
+3
+2
+1
+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
diff --git a/extra/gpu/effects/blur/authors.txt b/extra/gpu/effects/blur/authors.txt
new file mode 100644 (file)
index 0000000..6f03a12
--- /dev/null
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/extra/gpu/effects/blur/blur.factor b/extra/gpu/effects/blur/blur.factor
new file mode 100644 (file)
index 0000000..0a25654
--- /dev/null
@@ -0,0 +1,81 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: destructors fry gpu.render gpu.shaders gpu.state gpu.textures
+gpu.util images kernel locals math math.rectangles sequences ;
+IN: gpu.effects.blur
+
+GLSL-SHADER: blur-fragment-shader fragment-shader
+uniform sampler2D texture;
+uniform bool horizontal;
+uniform float blurSize;
+varying vec2 texcoord;
+void main()
+{
+    vec4 col = 0.16 * texture2D(texture, texcoord);
+    if (horizontal)
+    {
+        const vec2 blurX1 = vec2(blurSize, 0.0);
+        const vec2 blurX2 = vec2(blurSize * 2.0, 0.0);
+        const vec2 blurX3 = vec2(blurSize * 3.0, 0.0);
+        const vec2 blurX4 = vec2(blurSize * 4.0, 0.0);
+        col += 0.15 * (  texture2D(texture, texcoord - blurX1)
+                       + texture2D(texture, texcoord + blurX1));
+        col += 0.12 * (  texture2D(texture, texcoord - blurX2)
+                       + texture2D(texture, texcoord + blurX2));
+        col += 0.09 * (  texture2D(texture, texcoord - blurX3)
+                       + texture2D(texture, texcoord + blurX3));
+        col += 0.05 * (  texture2D(texture, texcoord - blurX4)
+                       + texture2D(texture, texcoord + blurX4));
+    }
+    else
+    {
+        const vec2 blurY1 = vec2(0.0, blurSize);
+        const vec2 blurY2 = vec2(0.0, blurSize * 2.0);
+        const vec2 blurY3 = vec2(0.0, blurSize * 3.0);
+        const vec2 blurY4 = vec2(0.0, blurSize * 4.0);
+        col += 0.15 * (  texture2D(texture, texcoord - blurY1)
+                       + texture2D(texture, texcoord + blurY1));
+        col += 0.12 * (  texture2D(texture, texcoord - blurY2)
+                       + texture2D(texture, texcoord + blurY2));
+        col += 0.09 * (  texture2D(texture, texcoord - blurY3)
+                       + texture2D(texture, texcoord + blurY3));
+        col += 0.05 * (  texture2D(texture, texcoord - blurY4)
+                       + texture2D(texture, texcoord + blurY4));
+    }
+    gl_FragColor = col ;
+}
+;
+   
+UNIFORM-TUPLE: blur-uniforms
+    { "texture"    texture-uniform f }
+    { "horizontal" bool-uniform    f }
+    { "blurSize"   float-uniform   f } ;
+
+GLSL-PROGRAM: blur-program window-vertex-shader blur-fragment-shader window-vertex-format ;
+
+:: (blur) ( texture horizontal? framebuffer dim -- )
+    { 0 0 } dim <rect> <viewport-state> set-gpu-state
+    texture horizontal? 1.0 dim horizontal? [ first ] [ second ] if / blur-uniforms boa framebuffer {
+        { "primitive-mode" [ 2drop triangle-strip-mode ] }
+        { "uniforms"       [ drop ] }
+        { "vertex-array"   [ 2drop blur-program <program-instance> <window-vertex-array> &dispose ] }
+        { "indexes"        [ 2drop T{ index-range f 0 4 } ] }
+        { "framebuffer"    [ nip ] }
+    } 2<render-set> render ;
+                         
+:: blur ( texture horizontal? -- texture )
+    texture 0 texture-dim :> dim
+    dim L ubyte-components <2d-render-texture> :> ( target-framebuffer target-texture )
+    texture horizontal? target-framebuffer dim (blur)
+    target-framebuffer dispose
+    target-texture ;
+                         
+: horizontal-blur ( texture -- texture ) t blur ; inline
+                         
+: vertical-blur ( texture -- texture ) f blur ; inline
+
+: discompose ( quot1 quot2 -- compose )
+    '[ @ &dispose @ ] with-destructors ; inline
+
+: gaussian-blur ( texture -- texture )
+    [ horizontal-blur ] [ vertical-blur ] discompose ;
diff --git a/extra/gpu/effects/blur/summary.txt b/extra/gpu/effects/blur/summary.txt
new file mode 100644 (file)
index 0000000..a9c5314
--- /dev/null
@@ -0,0 +1 @@
+Blur effects for textures.
diff --git a/extra/gpu/effects/quad/authors.txt b/extra/gpu/effects/quad/authors.txt
new file mode 100644 (file)
index 0000000..6f03a12
--- /dev/null
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/extra/gpu/effects/quad/quad.factor b/extra/gpu/effects/quad/quad.factor
new file mode 100644 (file)
index 0000000..5a770ba
--- /dev/null
@@ -0,0 +1,4 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: ;
+IN: gpu.effects.quad
diff --git a/extra/gpu/effects/quad/summary.txt b/extra/gpu/effects/quad/summary.txt
new file mode 100644 (file)
index 0000000..8952404
--- /dev/null
@@ -0,0 +1 @@
+Render a screen-aligned quad.
diff --git a/extra/gpu/effects/step/authors.txt b/extra/gpu/effects/step/authors.txt
new file mode 100644 (file)
index 0000000..6f03a12
--- /dev/null
@@ -0,0 +1 @@
+Erik Charlebois
diff --git a/extra/gpu/effects/step/step.factor b/extra/gpu/effects/step/step.factor
new file mode 100644 (file)
index 0000000..eff2a47
--- /dev/null
@@ -0,0 +1,23 @@
+! Copyright (C) 2010 Erik Charlebois.
+! See http://factorcode.org/license.txt for BSD license.
+USING: ;
+IN: gpu.effects.step
+
+GLSL-SHADER: step-fragment-shader fragment-shader
+const vec4 luminance = vec4(0.3, 0.59, 0.11, 0.0);
+uniform sampler2D texture;
+uniform sampler2D ramp;
+varying vec2 texcoord;
+void main()
+{
+    vec4 col = texture2D(texture, texcoord);
+    float l = dot(col, luminance);
+    gl_FragColor = texture2D(ramp, vec2(l, 0.0));
+}
+;
+
+UNIFORM-TUPLE: step-uniforms
+    { "texture" texture-uniform f }
+    { "ramp"    texture-uniform f } ;
+
+GLSL-PROGRAM: step-program window-vertex-shader step-fragment-shader window-vertex-format ;
diff --git a/extra/gpu/effects/step/summary.txt b/extra/gpu/effects/step/summary.txt
new file mode 100644 (file)
index 0000000..61028dd
--- /dev/null
@@ -0,0 +1 @@
+Render a quad with a step texture.
index d33fcf8c09799f8a99d3b50a4c2b4b40a8db35e1..ffca3a54780e98e148a45256398c6d4807494cf0 100644 (file)
@@ -1,6 +1,6 @@
 ! (c)2009 Joe Groff bsd license
-USING: gpu.buffers gpu.render gpu.shaders gpu.textures images kernel
-specialized-arrays ;
+USING: arrays gpu.buffers gpu.framebuffers gpu.render gpu.shaders
+gpu.textures images kernel locals specialized-arrays ;
 FROM: alien.c-types => float ;
 SPECIALIZED-ARRAY: float
 IN: gpu.util
@@ -44,10 +44,58 @@ CONSTANT: environment-cube-map-mv-matrices
             {  0.0  0.0  0.0  1.0 }
         } }
     }
+    
+GLSL-SHADER: window-vertex-shader vertex-shader
+attribute vec2 vertex;
+varying vec2 texcoord;
+void main()
+{
+    texcoord = vertex * vec2(0.5) + vec2(0.5);
+    gl_Position = vec4(vertex, 0.0, 1.0);
+}
+;
 
-VERTEX-FORMAT: window-vertex
+GLSL-SHADER: window-fragment-shader fragment-shader
+uniform sampler2D texture;
+varying vec2 texcoord;
+void main()
+{
+    gl_FragColor = texture2D(texture, texcoord);
+}
+;
+
+VERTEX-FORMAT: window-vertex-format
     { "vertex" float-components 2 f } ;
 
+UNIFORM-TUPLE: window-uniforms
+    { "texture" texture-uniform f } ;
+
+GLSL-PROGRAM: window-program window-vertex-shader window-fragment-shader window-vertex-format ;
+
+GLSL-SHADER: window-point-vertex-shader vertex-shader
+uniform float point_size;
+attribute vec2 vertex;
+void main()
+{
+    gl_Position  = vec4(vertex, 0.0, 1.0);
+    gl_PointSize = point_size;
+}
+;
+
+GLSL-SHADER: window-point-fragment-shader fragment-shader
+uniform sampler2D texture;
+void main()
+{
+    gl_FragColor = texture2D(texture, gl_PointCoord);
+}
+;
+
+UNIFORM-TUPLE: window-point-uniforms
+    { "texture"    texture-uniform f }
+    { "point_size" float-uniform   f } ;
+
+GLSL-PROGRAM: window-point-program window-point-vertex-shader window-point-fragment-shader window-vertex-format ;
+
 CONSTANT: window-vertexes
     float-array{
         -1.0 -1.0
@@ -62,4 +110,17 @@ CONSTANT: window-vertexes
     byte-array>buffer ; inline
 
 : <window-vertex-array> ( program-instance -- vertex-array )
-    [ <window-vertex-buffer> ] dip window-vertex <vertex-array*> ; inline
+    [ <window-vertex-buffer> ] dip window-vertex-format <vertex-array*> ; inline
+
+:: <2d-render-texture> ( dim order type -- renderbuffer texture )
+    order type T{ texture-parameters { wrap clamp-texcoord-to-edge }
+       { min-filter filter-linear } { min-mipmap-filter f } } <texture-2d>
+    [ 0 <texture-2d-attachment> 1array f f dim <framebuffer> ] keep ;
+
+: draw-texture ( texture -- )
+    {
+        { "primitive-mode" [ drop triangle-strip-mode ] }
+        { "uniforms"       [ window-uniforms boa ] }
+        { "vertex-array"   [ drop <window-vertex-buffer> window-program <program-instance> <vertex-array> ] }
+        { "indexes"        [ drop T{ index-range f 0 4 } ] }
+    } <render-set> render ;