Thursday, 31 May 2012

Creating images and diagrams

This is a simple example of how to create a presentation image with few lines of code:
 Here the source:

REBOL [
    Title: "Block Diagram"
    Date: 24-Apr-2001
    Version: 1.0.1    
    Author:   ["Carl Sassenrath" "Massimiliano Vessi"]
    Purpose: {An example of REBOL code creating a useful diagram.}
]
i1: to-image layout [
    style box box font [valign: 'top ] edge [size: 2x2]
    b1: box 180x120 "View / Pro" effect [gradient 0x1 purple navy]
    at b1/offset + 20x30
    box 140x90 "View" effect [gradient 0x1 sky navy]
    at b1/offset + 40x60
    box 100x60 "Core" effect [gradient 0x1 pink   navy]
    at b1/offset + 0x118
    image 180x32 "REBOL Client" blue  
]
i2: to-image layout [
    style box box font [ valign: 'top ] edge [size: 2x2]
    b1: box 180x120 "Command" effect [gradient 0x1 wheat navy]
    at b1/offset + 20x30
    box 140x90 "Core / Pro" effect [gradient 0x1 leaf navy ]
    at b1/offset + 40x60
    box 100x60 "Core" effect [gradient 0x1 magenta navy]
    at b1/offset + 0x118
    image 180x32 "REBOL Server" blue
]
view layout [
    across
    space -40 ; this is to compact the result
    image i1
    box   180x180 effect [arrow rotate 270]
    box   80x180 "Internet" font [color: black size: 20 shadow: none ]
    box   180x180 effect [arrow rotate 90]    
    image i2
]

Wednesday, 30 May 2012

Advanced random demo

Table of contents:



Foreword

If you studied how PC usually generate random number, you know that it's impossible to create a real random number. A PC is a machine extremely rigid, it doesn't possess any device to obtain something absolutely random.
On the other side, mathematicians and software expert concluded that it's very near to a random number the "result of a calculus that you can't forecast". What does it mean?
It means that you ask to a PC to make a calculus that you can't forecast (but another PC can forecast), for you seem random. Every PC with any software works this way.
Let's make a real world example:

>> now/time/precise
== 13:55:05.015

the command now/time/precise return the time with milliseconds precision. If you want just the millisecond, you can type:

>> next parse to-string now/precise/time "."
== ["484"]


Every time you'll send the command, the result will be different, because you can't know or calculate the milliseconds of the time of your request; but  another PC can calculate when "he" requests and can exactly forecast the result.
The problem is that the result depends always on the time of the request, a machine will give you always the same results in the same conditions.
Numbers generated this way are called pseudo-random 

Mathematical approach

The majority of situation don't need to know "how much random" is the result, but some scientific tasks require that the random distribution of the results are similar to specific mathematical distributions.
Fortunately there is the randomr.r library for this purpose.
Here a script that shows how it works:

The randomr.r lib contains the following distributions:
UNIFORM:
  • uniform law on 
  • exponential law
  • exponential law with a l degree 
  • normal law
  • normal polar law
  • logarithmic normal law
  • gamma law
  • geometric law in a disc
  • geometric law in a rectangle 
  • χ2 law (chi square)
  • Erlang law
  • Student law
  • Fisher law
  • Laplace Law
  • beta law 
  • weibull law
  • Rayleigh law
DISCRETE:
  • Bernouilli law
  • binomial law
  • binomial negative law
  • geometric law
  • Poisson law

    Here the source:
    REBOL [
        File: %demorandom.r
        Date: 17-June-2009
        Title: "Random Number Generator Demo"
        Version: 1.0
        Author: "François Jouen."
        Rights: {Copyright © EPHE 2009}
        Purpose: {Some examples how to use randomr lib}  
    ]
    ; load random library

    if not exists?   %randomr.r [write %randomr.r   (read http://www.rebol.org/download-a-script.r?script-name=randomr.r )]
    do %randomr.r
    ; some variables
    psample: 500
    baseline: 250
    xpas: 1
    yscale: 40
    col: yellow
    xy1: 0x59
    xy2: 500x59
    plot: copy [pen col line]
    plot2: copy [pen col line]
    ; for fun
    app-styles: stylize [
        app_btn: button 60   edge [size: 1x1 color: 0.0.0 ] font [style: none colors/1: black shadow: none]
    ]  
    ; update slider
    fix_slider: does [
                        either 0 = length? calc/data [calc/sld/redrag 1]
                                    [calc/sld/redrag calc/lc / length? calc/data]
    ]
    Clear_Screen: does [
       
       
        x: 0
        plot: copy [pen col line]  
        append clear visu/effect reduce ['draw plot]
        plot2: copy [pen white line xy1 xy2 pen col line-width 2 line]
        append clear visu2/effect reduce ['draw plot2]
        show [visu visu2]
    ]
    ; Data visualization
    show_law: func [lawname] [
        Clear_Screen
        buffer: copy calc/data
        n: length? calc/data
        normalized: copy []
        ; calculate mean
        sigma: 0
        for i 1 n 1 [v: pick buffer i sigma: sigma + v]
        m: round/to sigma / n .001
        ; calculate variance and SD
        sigma: 0
        for i 1 n 1 [v: pick buffer i sigma: sigma + power (v - m) 2]
        variance: round/to sigma   / (n - 1) .001
        sd: round/to square-root variance .001
       
        ; show   data in normal reduced law (x - m /sd)
        for i 1 n 1 [x: x + xpas   v: ((pick buffer i) - m ) / sd y: baseline -   ( yscale * v)
                append plot to-pair compose [(x) (y)]
                append normalized v]
        str: join lawname   [newline " mean: " m newline "variance: " variance newline " SD: " sd]
        visu/text: str
        buffer: copy sort normalized
        x: 0
       
        ;now show random value distribution in second window

        visu2/text: "Sorted Normalized Data [(x-m)/sd]"
        for i 1 n 1 [
            x: x + xpas v: pick buffer i y: 59 -   ( 29 * v)
        append plot2 to-pair compose [(x) (y)]
        ]
        show [visu visu2]
       
    ]
    MainWin: layout/size [
        styles app-styles
        origin 5x5
        space 2x2
        across
        at   5x2 box   875x30 bevel
        at 95x2 text "Parameters" text "Sample" fsample: field 50 to-string psample [
            if error? try [psample: to-integer fsample/text][psample: 320]]
           
           
        ; //CONTINUOUS LAWS//
        at 5x35   app_btn 90 "Exponential" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_exp]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        at 5x60   app_btn 90 "Exp with L°" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_expm to-decimal expmp/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        expmp: field 35 "1.0"
        at 5x85 app_btn 90 "Normal" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_norm to-decimal normp/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        normp: field 35 "1.0"
        at 5x110   app_btn 90 "Gamma" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_gamma to-integer gamp1/text to-decimal gamp2/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        gamp1: field 35 "1" gamp2: field 35 "1.0"
        at 5x135 app_btn 90 "Chi-2" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_chi2 to-integer chip/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        chip: field 35 "2"
        at 5x160 app_btn 90 "Erlang" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_erlang to-integer erp/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        erp: field 35 "1"
        at 5x185 app_btn 90 "Student" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_student to-integer stud/text to-decimal stud2/text]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        stud: field 35 "3" stud2: field 35 "1.0"
        at 5x210 app_btn 90 "Fischer" [if error? try [clear calc/data
                            for i 1 psample 1 [append calc/data rand_fischer to-integer fisc1/text to-integer fisc2/text ]
                            fix_slider show calc show_law face/text]
                            [Alert "Error in processing"]
        ]
        fisc1: field 35 "1" fisc2: field 35 "1"
        at 5x235 app_btn 90 "Laplace" [if error? try [ clear calc/data
                            for i 1 psample 1 [   append calc/data rand_laplace to-decimal lp/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        lp: field 35 "1.0"
        at 5x260 app_btn 90 "Beta" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_beta to-integer beta1/text to-integer beta2/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        beta1: field 35 "1" beta2: field 35 "1"
        at 5x285 app_btn 90 "Weibull" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_weibull to-decimal a/text to-decimal lambda/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        a: field 35 "1.0" lambda: field 35 "1.0"
        at 5x310 app_btn 90 "Rayleigh" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_rayleigh to-decimal ra/text to-decimal rb/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        ra: field 35 "1.0" rb: field 35 "1.0"
       
        ; DISCRETE LAWS
       
        at 5x335   app_btn 90 "Bernouilli" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_bernouilli to-decimal bp/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        bp: field 35 "0.5"
        at 5x360 app_btn 90 "Binomial" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_binomial to-integer ob/text to-decimal bpp/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        ob: field 35 "1" bpp: field 35 "0.5"
        at 5x385 app_btn 90 "NegBinomial" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_binomialneg to-integer onb/text to-decimal nbpp/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        onb: field 35 "1" nbpp: field 35 "0.5"
        at 5x410 app_btn 90 "Geometric" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_geo to-decimal geop/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
    geop: field 35 "0.25"
    at 5x435 app_btn 90 "Poisson" [if error? try [clear calc/data
                            for i 1 psample 1 [   append calc/data rand_poisson to-decimal pp/text]
                            fix_slider show calc show_law face/text ]
                            [Alert "Error in processing"]
        ]
        pp: field 35 "1.5"
        ; REBOL LAWS
        at 5x460 app_btn 90 "Rebol Rand" [if error? try [clear calc/data
                        for i 1 psample 1 [   append calc/data random to-integer rpp/text]
                        fix_slider show calc show_law face/text ]
                        [Alert "Error in processing"]
        ]
        rpp: field 35 "10"
        at 5x485 app_btn 90 "Rebol   Real" [if error? try [clear calc/data
                        for i 1 psample 1 [   append calc/data rand_real]
                        fix_slider show calc show_law face/text ]
                        [Alert "Error in processing"]
        ]
        at 175x35 calc: text-list 200x475
        pad 5   visu: box blue + 100   500x350 font [valign: 'top] frame navy
        at 382x390 visu2: box blue + 100   500x118 font [valign: 'top] frame navy
        at 370x2 text "X Step" fxpas: field 50 to-string xpas [if error? try
                            [xpas: to-integer fxpas/text]
                            [xpas: 1 fxpas/text: "1"]]
        pad 5 text "Y Scale" fyscale: field 50 to-string yscale [if error? try
                                [yscale: to-integer fyscale/text]
                                [yscale: 40 fyscale/text: to-string yscale]]
        pad 200 app_btn 90 "Quit" [Quit]
    ]885x520
    view center-face MainWin


    Practical approach

    Another way is getting number from the site www.random.org, this site extract random numbers form radio wave noise. Nobody can predict the exact amount of radio wave used every day, so the noise is totally random.
    Here the source of the script:
    REBOL[
        File: %random-org.r
        Date: 17-6-2008
        Title: "Random.org"
        Purpose: "Get really random numbers (come from atmospheric noise) from http://random.org"
    ]
    random-org: func [
        "Get block of random numbers from http://random.org"
        /size   "Size of block (default = 100)"
            siz
        /interval   "Number interval (default = 1 - 100)"
            min max
        /base   "Numerical base - 2, 8, 10, 16 (default = 10)"
            base-num
    ][
        if not size [siz: 100]
        if not interval [min: 1 max: 100]
        if not base [base-num: 10]
        load read rejoin [http://random.org/integers/?num= siz "&min=" min "&max=" max "&col=1&base=" base-num "&format=plain&rnd=new"]
    ]


    It usually get a casual list numbers from the site, but if you want just a number or two between 1 and 10:

    >> random-org/size/interval 1 1 10
    == 9
    >> random-org/size/interval 2 1 10
    == [2 6 ]


    As usual for more information digit:
    ? random-org
    Here a web app from random.org:

    Friday, 25 May 2012

    Wolfenstein 3D (part 2)

    As promised I'll show how to add images.

    First of all let's create an image. Rebol has many images inside, one of the is old icon image:
    to see it:
    view layout [icon]
    The game script shows just column of 4 pixel (see last post), so we need to divide enlarge and divide the image:

    ;let's create the image using the an rebol internal image:
    layout [temp: icon]  
    my_image: temp/pane/image ;icon is ane image 48x48
    layout [temp: image my_image 1024x1024 ]
    my_image: to-image temp
    ; now we slices in columns the image
    imgs: copy []
    size: 4x1024   ; width and height of each subimage
    reps: my_image/size / size ;number of repetions
    repeat y reps/y   [
        repeat x reps/x   [
            xy: size * as-pair x - 1 y - 1
            append imgs copy/part at my_image xy size
        ]
    ]
    thelay: copy []
    a: 1
    b: 4
    foreach item imgs [append thelay reduce ['image item (as-pair a 1) (as-pair b 1024 )]
        a: a + 4
        b: b + 4
        ]
    view layout [box 1024x1024 effect [ draw   thelay     ]]

    This will be the result:
    Ok, now just decide a color, for example 4 of the map, will be a block with this image and we'll substitute the color slice with the image slice. A simple calculus will indicate wich slice to use, and the xx position if it's an horizontal wall or a vertical wall:
     Here the commented source:
    REBOL [
    subject: "raycasting engine"
    version: 0.8
    ]
    ;let's create the image using the an rebol internal image:
    layout [temp: icon]  
    my_image: temp/pane/image ;icon is ane image 48x48
    layout [temp: image my_image 1024x1024 ]
    my_image: to-image temp
    ; now we slices in columns the image
    imgs: copy []
    size: 4x1024   ; width and height of each subimage
    reps: my_image/size / size ;number of repetions
    repeat y reps/y   [
        repeat x reps/x   [
            xy: size * as-pair x - 1 y - 1
            append imgs copy/part at my_image xy size
        ]
    ]
    ;note some values are scaled to 1024 to create smooth movements
    px: 9 * 1024 ; initial position
    py: 11 * 1024 ; initial position
    stride: 5 ;step
    heading: 0 ;initial view (degree)
    turn: 10 ;rotating step

    ;labirinth map
    laby: [
    [   8   7   8   7   8   7   8   7   8   7   8   7 ]
    [7   0   0   0   0   0   0   0 13   0   0   8 ]
    [8   0   0   0   12 0   0   0 14   0   9   7 ]
    [7   0   0   0   12 0   4   0 13   0   0   8 ]
    [8   0   4   11 11 0   3   0   0   0   0   7 ]
    [7   0   3   0   12 3   4   3   4   3   0   8 ]
    [8   0   4   0   0   0   3   0   3   0   0   7 ]
    [7   0   3   0   0   0   4   0   4   0   9   8 ]
    [8   0   4   0   0   0   0   0   0   0   0   7 ]
    [7   0   5   6   5   6   0   0   0   0   0   8 ]
    [8   0   0   0   0   0   0   0   0   0   0   7 ]
    [8   7   8   7   8   7   8   7   8   7   8   7 ]
    ]
    ;function to scale the projection of the ray
    get-angle: func [v ] [to-integer (((cosine v ) * 1024) / 10 )]
    get-angles: func [v ] [to-integer (((sine v ) * 1024)   / 10)]
    ;colors
    palette: [
        0.0.128
        0.128.0
        0.128.128
        0.0.128
        128.0.128
        128.128.0
        192.192.192
        128.128.128
        0.0.255
        0.255.0
        255.255.0
        0.0.255
        255.0.255
        0.255.255
        255.255.255
        ]
    ;this will be player view
    screen: layout [
        display: box 360x200 effect [
            gradient 0x1 0.0.0 128.128.128
            draw []
            ] edge [
            size: 1x1
            color: 255.255.255
            ]
        ]
    ;main function to raycasting
    retrace: does [
        clear display/effect/draw
        xy1: 0x0
        xy2: 4x0
        angle: remainder (heading - 44) 360 ;this formula put angle between 0 and 359, and since the angle of view (heading) is in the middle of the cone, put the scanning ray at the beggining of the view
        if angle < 0 [ angle: angle + 360 ] ;this make alway positive the angle
        ;starting scanning
        temp: copy []
        for a angle (angle + 89) 1 [
            ;temporary coordinates
            xx: px
            yy: py
            ;get the ray direction
            stepx: get-angles a
            stepy: get-angle a  
            ;distance or lenght of the ray fro eyes to the wall
            l: 0        
            until [
                ;walk in the current ray direction in order to find a wall
                xx: xx - stepx
                yy: yy - stepy
                l: l + 1
                column: to-integer (xx / 1024)
                line: to-integer (yy / 1024)
                laby/:line/:column <> 0
                ]
            h: to-integer (900 / l)
            xy1/y: 100 - h
            xy2/y: 100 + h      
            color: pick palette laby/:line/:column
            ; block with color 4 will be   our blocks with image
            either   laby/:line/:column = 4 [
                slice: to-integer (((xx // 1024 ) / 1024 ) * 256)
                if   any [((xx // 1024) < 55)   ((xx // 1024) > 945 )   ]   [slice:   (to-integer (((yy // 1024 ) / 1024 ) * 256) )]                
                append display/effect/draw reduce ['image imgs/:slice xy1 xy2 ]
                ][
                    append display/effect/draw reduce [
                        'pen color
                        'fill-pen color
                        'box xy1 xy2
                        ]
                    ]
            xy1/x: xy1/x + 4
            xy2/x: xy2/x + 4
            ]
       
        show display    
        ]
       
    ;this function   calculate the new position
    player-move: function [/backwards ] [mul ] [
        either backwards [ mul: -1 ] [mul: 1 ]
        newpx: px - ((get-angles heading ) * stride * mul)
        newpy: py - ((get-angle heading) * stride * mul)
        c: to-integer (newpx / 1024)
        l: to-integer (newpy / 1024)
        if laby/:l/:c = 0 [
            px: newpx
            py: newpy      
            retrace
            ]  
        ]
    ;this control when user press keyboard buttons
    insert-event-func [
        if (event/type = 'key) [
            switch event/key [
                up [ player-move ]
                down [player-move/backwards ]
                left [
                    heading: remainder (heading + (360 - turn)) 360
                    retrace
                    ]
                right [
                    heading: remainder (heading + turn) 360
                    retrace
                    ]
                ]
            ]
        event  
        ]
    retrace
    view/title screen join "Raycaster " system/script/header/version


    This is just a very simple example. This script can be optimized in many, many ways.
    This post just show you can Rebol language can be applied or every task, it's so powerful and simple, that I consider it better than Java, C++, C#, etc.

    Monday, 21 May 2012

    Wolfenstein 3d (part 1)

    It's the anniversary of the game of Wolfenstein3D, and the question is: is possible to realize such a game with Rebol?
    The answer is: YES!
    First of all you have to know that the technique used with Wolfenstein 3D is called ray casting, you can find a great guide to it here: http://www.permadi.com/tutorial/raycast/index.html
    A short explanation is the following:
    • map is only 2D, not 3D, the ray casting give you the effect of 3D
    • map is made of blocks
    • you can walk inside transparent block
    • you can make many steps inside a transparent block (for example 64x64 steps or 1024 x 1024  steps)
    • you can't walk inside visible blocks
    • visible blocks make walls
    • Your view is 90°
    • Your view is divided in 90 rays
    • You view is spread on screen each vertical line is a ray. For example in a screen 360x200, every column of 4 pixels is a ray.
    Well the first simple example is taken from the fantastic book of   Olivier Auverlot: "Rebol A programmer’s guide" (you can buy it on www.lulu.com)

    Here the commented code:
    REBOL [
    subject: "raycasting engine"
    version: 0.7
    ]
    ;note some values are scaled to 1024 to create smooth movements
    px: 9 * 1024 ; initial position
    py: 11 * 1024 ; initial position
    stride: 5 ;step
    heading: 0 ;view
    turn: 10 ;rotating step

    ;labirinth map
    laby: [
    [   8   7   8   7   8   7   8   7   8   7   8   7 ]
    [7   0   0   0   0   0   0   0 13   0   0   8 ]
    [8   0   0   0   12 0   0   0 14   0   9   7 ]
    [7   0   0   0   12 0   4   0 13   0   0   8 ]
    [8   0   4   11 11 0   3   0   0   0   0   7 ]
    [7   0   3   0   12 3   4   3   4   3   0   8 ]
    [8   0   4   0   0   0   3   0   3   0   0   7 ]
    [7   0   3   0   0   0   4   0   4   0   9   8 ]
    [8   0   4   0   0   0   0   0   0   0   0   7 ]
    [7   0   5   6   5   6   0   0   0   0   0   8 ]
    [8   0   0   0   0   0   0   0   0   0   0   7 ]
    [8   7   8   7   8   7   8   7   8   7   8   7 ]
    ]
    ;function to scale the projection of the ray
    get-angle: func [v ] [to-integer (((cosine v ) * 1024) / 10)]
    ;colors
    palette: [
        0.0.128
        0.128.0
        0.128.128
        0.0.128
        128.0.128
        128.128.0
        192.192.192
        128.128.128
        0.0.255
        0.255.0
        255.255.0
        0.0.255
        255.0.255
        0.255.255
        255.255.255
        ]
    ;this will be player view
    screen: layout [
        display: box 360x200 effect [
            gradient 0x1 0.0.0 128.128.128
            draw []
            ] edge [
            size: 1x1
            color: 255.255.255
            ]
        ]
    ;main function to raycasting
    retrace: does [
        clear display/effect/draw
        xy1: xy2: 0x0
        angle: remainder (heading - 44) 360 ;this formula put angle between 0 and 359, and since the angle of view (heading) is in the middle of the cone, put the scanning ray at the beggining of the view
        if angle < 0 [ angle: angle + 360 ] ;this make alway positive the angle
        ;starting scanning
        for a angle (angle + 89) 1 [
            ;temporary coordinates
            xx: px
            yy: py
            ;get the ray direction
            stepx: get-angle (a + 90)
            stepy: get-angle a  
           
            l: 0
            until [
                ;walk in the current ray direction in order to find a wall
                xx: xx - stepx
                yy: yy - stepy
                l: l + 1
                column: to-integer (xx / 1024)
                line: to-integer (yy / 1024)
                laby/:line/:column <> 0
                ]
            h: to-integer (900 / l)
            xy1/y: 100 - h
            xy2/y: 100 + h
            xy2/x: xy1/x + 3
            color: pick palette laby/:line/:column
            append display/effect/draw reduce [
                'pen color
                'fill-pen color
                'box xy1 xy2
                ]
            xy1/x: xy2/x + 1
            ]
        show display    
        ]
       
    ;this function   calculate the new position
    player-move: function [/backwards ] [mul ] [
        either backwards [ mul: -1 ] [mul: 1 ]
        newpx: px - ((get-angle (heading + 90)) * stride * mul)
        newpy: py - ((get-angle heading) * stride * mul)
        c: to-integer (newpx / 1024)
        l: to-integer (newpy / 1024)
        if laby/:l/:c = 0 [
            px: newpx
            py: newpy
            retrace
            ]
        ]
    ;this control when user press keyboard buttons
    insert-event-func [
        if (event/type = 'key) [
            switch event/key [
                up [ player-move ]
                down [player-move/backwards ]
                left [
                    heading: remainder (heading + (360 - turn)) 360
                    retrace
                    ]
                right [
                    heading: remainder (heading + turn) 360
                    retrace
                    ]
                ]
            ]
        event  
        ]
    retrace
    view/title screen join "Raycaster " system/script/header/version


    You can see that the labyrinth is a simple array of numbers, if number is zero, than is a transparent block, otherwise is a wall. The number represent the color of the wall.
    The main function is the retace function.
    I hope that the comments are sufficient clear to understand all the script.
    In the next post we'll see how to adding images to the wall.

    Thursday, 10 May 2012

    Sound chip PSG AY-3-8912 emulator

    Here there is a sound 8 bit emulator:
    Here the source: REBOl [         Title: "Demo Emulate PSG AY-3-8912... MSX PoWaaaa !!!!"         Author: "Guest2"         Thanks: "Goldevil"         Date: 09-Feb-2007         Version: 0.0.2         File: %demo-ay.r         Purpose: "Emulate the PSG AY-3-8912"         History: [                 [0.0.1 7-Feb-2007 "First version"]                 [0.0.2 9-Feb-2007 "use less memory"]         ] ]             txt: rejoin parse/all {                                                                                                                                                         In the beginning was the word, then REBOL appeared .... hum ...   ok! it sucks! I need to stop with this vanity. Good! Seriously, this demo shows my attempt to make an emulator for PSG AY-3-8912 (sound chip). So you're going to tel me: why did you do that!?? First a little history: The PSG was on many PC (Personal Computer) in '80 years. These include for example the standard MSX and the ZX-Spectrum or Amstrad CPC which although having the same PSG, managed the feat of producing a sound of pan ... Anyway, I digress. These wonderful machines 8bits are not dead, many communities continue to develop for and with these antiques. So we come to speak of my passion, play and develop on MSX. And yes good people, games on dual core PC and other consoles last generation have little interest for me, I prefer to break out on a good old Konami families. Incidentally, I am developing in assembler on MSX and that's where REBOL intervenes. I use REBOL to develop tools for the design of programs in Z80 assembler. And now you know everything. Now, let's talk about this demo. Music you hear is from the game "Auf Wiedersehen Monty". It is completely synthesized by Rebol. I mean is, there is no wav file compressed as a starter but a series of data correspond to the values contained in the records of the PSG. These values are limited to three frequencies + 3 heights volume, treated 50 times per second by REBOL that works like a synthesizer three ways. And the worst (best rather) is that REBOL has still time to make unnecessary animations ... Of course this summary is far from perfect, for example, instead of the drum sound means a small bell. And then there ZE problem: sound is injected into the port of sound rebol every 5 seconds. Unfortunately on this occasion means a "white" unpleasant (Whose duration also depends on the speed of your PC) and a light blocking script. It's sad because due to this bug, real-time audio streaming is not possible, or else I did something that was not in the script, sniff!! To finish this long speech, I want to thank the forum Goldevil REBOL France for her indispensable help in the understanding and husking operation of the PSG. Vala! See you .... Arghhhhh! Push 1 to scroll jerky!!                                                                                                         } join newline tab   inter: 50   wait 0 ; nécessaire pour que le port sound fonctionne   sound-port: open sound://     ; Set up the sound sample parameters:     sample: make sound [         rate: 44100         channels: 1         bits: 8         volume: 1         data: #{}     ]   clock: 3579545 / 32   cache: make list! 100     ; get the semi period of a frequency   make-period: func [freq /local note rep ret pitch phase] [         if freq = 0 [return cp [0 10000 10000]]         periode: to integer! sample/rate / freq   / 2 + 1         reduce [1 periode periode]     ]     tone: make binary! len: to-integer sample/rate / inter + 0.5     draw-oscillo: make block! 4000     insert/dup draw-oscillo [vline 50 'hline 0] 1000     cache: make block! 8 * inter     insert/dup/only cache [move 0x0] 8 * inter + 1     scroll: 0     image: make image! as-pair to integer! len / 2 100     mix: func [/local noise][         pitch: 1         tone: clear head tone         draw-oscillo: next head draw-oscillo         while [pitch <= len] [                 if toneA/2 = 0 [poke toneA 2 toneA/3 change toneA negate toneA/1]                 if toneB/2 = 0 [poke toneB 2 toneB/3 change toneB negate toneB/1]                 if toneC/2 = 0 [poke toneC 2 toneC/3 change toneC negate toneC/1]                 split: min min toneA/2 toneB/2 toneC/2                 val: to integer! (toneA/1 * volA / 15) + (toneB/1 * volB   / 15) + (toneC/1 * volC / 15) * 25                 val: max -127 min 127 val                 change draw-oscillo val / 2 + 50                 change skip draw-oscillo 2 split / 2                 draw-oscillo: skip draw-oscillo 4                 insert/dup tone to char! val + 128 split                 poke toneA 2 toneA/2 - split                 poke toneB 2 toneB/2 - split                 poke toneC 2 toneC/2 - split                 tone: tail tone                 pitch: pitch + split         ]         oscillo: cp/part head draw-oscillo back draw-oscillo         insert tail oscillo [move 0x0]         image/rgb: black         ii/image: draw image pick cache time + 1         scroll: scroll + 1 // 4         if scroll = 0 [txt: next txt if tail? txt [txt: head txt]]         poke cache time + 1   head insert/only tail compose [                 text (as-pair   scroll * -1 0) (cp/part txt 130)                 line-width 4 line-pattern 15 1                 pen blue black line 0x87 (as-pair to integer! volA * len / 30 87)                 pen yellow black line 0x92 (as-pair to integer! volB * len / 30 92)                 pen green black line 0x97 (as-pair to integer! volB * len / 30 97)                 line-pattern 1                 line-width 2 pen red line 0x50 0x50 shape         ] oscillo         ;stats/text: system/stats         show ii ;show [stats ii]         ;recycle         wait max 0 1 + time / inter + third refresh - now/time/precise         head tone     ]         song: load decompress #{ 789CEC9D0D92DB380E85AFE22388B628DBF7BFD8B6F56301143E10E8583DD924 355BB33509411010F908828FF078298FC76598FFB9DE864BFDFAFFF2182FE5F5 07E5762965FEABF22C97EB70FFFA6BBBF9F3F5FF63DBBADCBDE687CEC7B5F575 38B62F96C0EB4F50E269083CB1FDC36C5F2FD77A35DB7F8DC712F8FA1392B047 F470DA3F9C11AD76847CC412B68FA8BDEDA3711DFBB1BDE32390C011617BCB47 DB8856CFC67C8412DE888EEDC947EBD80FEDD94724D199D9467B7B1E9DBDD61E E9B526B0629CBE7CE622D108CD01891E5EF31E12A9F621EF2889001289F6B8CA 244E68FF44902830226E0FAB4CE2C4385C6EBE8FAA23F034BED9C36FDF032ED1 3E045CA23DB9942510DCB13D80BB8495BE4B5BE00A8FE8D8DE5F94C7F641E00A 7C356E6F4F3BBD70223E6289C8D2ECCFA31D5A6E57E9A05E04255A0702A8B675 C735AAB9ED1947A08FE8A239CE9DAFFF38B676668ED91E0703AD61BB7BB55EC6 1FF0CC0DDBC38C315B477027E4181088844B5DD7BC87F33221E41A6AEF0EA669 ED2FA5B63503B2DDDE9FBFC7D6FD082936674E5C4D859A836F72A874BD9E0A34 49D73C73AE194F059A670A68C6DF0868B670E22CA07970732FBAF97F049A1BB4 F7E76F0C687EBFD5244E4A5F1FC1478E0ACD2319A1B679EF94AADAC7823D2911 38A58AF6B677AECD2949F9C7C6ED844099FF3AABA13DE9F56C6E4F7AB27DE4A4 17F90A2C1139BAF5BE427B100BF908244239A7888FD4C12AE4239408E49C023E D207ABBE8F58A2B3768CF6819CD309ABB93DBA457DB4B41E7A5112350FE59C86 5450F57B1C6C354E440EFF241143A2FEE15FE3443F2FE708782643FBC3376E81 ABD77F9BD3EAA5FD7408174CFB81440CE802693F054391D4284B4480AE9F1AD5 3014F11149C472547D1FFD7EE9E31D8AA6DABBE52B766B1FB7ACC67EFCD7EDFA BD615CC7B679C78D470177036B9BFB09ADB675EF9C191BCC135B77CF9931CF40 FBEE39B3EB97711DF4A1B98351B60002023507845A9ABF4C08B986DABB83695A FBF9F3B675E89C199EBFC7D66EF875D26A7AE656530E9254822A8C49BF8FA929 E0A0F67E263C061CF554E078A480A3FE038E5082EAE3C0F1C4D66E38F37BAC26 99712A63173946681E08500ECD19536FF743FB8E6F0C09D73987F6B8194F2F34 383477D6942D80D3989AC39A9ADE8010F30F0A38C3393647EF2C033FB477DC03 1238206C0F59F1B9FD6246CC412400274EBB79E7C2BF6DDE3D4BC586F3E4E62E F4FC46EB4BE0C3FCDF2EFA54681E419FB679CF3BAA7DC83B4A22E01DD13E823E DA3D10EA8000CE666A0E8B4BA0C3E3D64BA98DDC1EB23F4EF30E5689E621AC12 ED8358151910B607301758D277678355E1F11C9A77123F6DF31856058683CD03 5815708F27E1E62B0EED0391D2F599496FCBE681F4F6A1792788D4ED2351A496 E88791B23D4D9FF1F63E3735EE81E90302341E6C6E4F9FB9F9BA1643FE410167 38C7E691A44EC43D2C81588EED01CCE7F68B192107A180379E43737F711D9AF7 D027389C2737EF1FD27E8FF595421F95E1F97FC4937A329E3C727852FFDFF1E4 96C49367124FC693F1E499C3936D42FF2678524F5F5F8FE4FA92B752C968E6FE DDD681D0A76DCD4835FFF93DE1C8A3808B536D73FF88D6B6EEE587A283A1D6DD EC50C833D4BE7BDEEAFAA5AE833E34771C630B607841CD21DA99FF643621E61A 680FAE315B070E5A21CFD8ED03C7ACC094F9CD56530665548CD3058E7AB2A98F 9CA9F51F7010A09E0A1CCF1C708CFFC7C041ED3BF337041C67AFA66F02C72AA4 E999909C24093B3B79ABBEC041C1ED89020FD3A5B73B0ADC2F7727848BB45FB8 D0B9FE1D0BA6AF7F0C40AE0F9478DD0474BFC2F5FEBE2F08B517CFA0E7F687AF D67CB4DBEDD7FABF1EDB0FEB3F72EC738B721CCBBBADE8776E3138FD8A31DBDB A0D3EFC11FCE780D5F60BFEE186EF13174FBDDDBDEA73704F48620D0A23782C7 B5D3AB18AC98CC5D278C836EEB3921D16F62B80927FC826B9D05D18EF5B01E78 AC87E5203CFB2BD3D68087F83273FAFD2D61E19B7EF8282C38E375BFC53F5808 F49B18EEB79CD0752D2FE0C3826008FB1D61E143BBEF2FC182335ECF0FFF60E1 F28B73D719C1476141B6EDC142FD56BF7F2B2C6482DC6F06CF1F8D169C65F65B C2C287FCFB4BB0F0BDC3C92761E15BEBECFF0216BE858D9F8485C4218221EC97 60E17738449C050B1F8A6EFEA6DC42C159F67F8E20DF3BC7FC5169883F184132 E78D3F390DF11B20C8BF34C469E78D3F363BF9A18DFA1F2C04DAFEB569883F16 1612E78D3F370DF12767273FE4DFFFF334C49F9B9DFC9613FE5FD210D76B59DE 78BC64EBF352EEDB7061DE6C02F334DB050A4ECAB7C04D0AD8E419567047B8B4 2DA8081676FF153D747BFDE17B05F6DCB3B61E646BF6CDD27A438D8E638CAE6D 360E34B6792660A24562C161583DD77532BF16E2BC18DCB935CAD64FD99A9DB7 B49E978437ABE440165C783ADE1B55EB41B4668F587DB34BD6F9378FDB5F706A BECE5EF1D79BEA7FF6797CB9E9EEADD536F2E8ADC556B9775E6B0934F21673DF 3B27A0916741D7417F2C1A551AF52F038C828C2EC02838FA2CC03008B043FE3F 0146B7EF028C03011F001867F0D6F29113514D71C733DF593E6A92DB0F9EA031 6F47F65A03071A2632FCD86BAD83CE1A3BCF40678D9EDF40E75E7B65814DD875 D1D9FB505BE81F02E72D4C0F4DAE2DFC0F41F376040A41F376B60A41B3EA999D 11C72107283E8143C940C741D18FE1D099814EF6D8E54DF54F043AD96317860C 1F46EA6EA08310D945EA5EA0E381EF2F063AB993948C467E21D0E98E44473ADD A1E8DE7B635103FF80530AB5B6DEE3E0D7E98D5AF5CC386498C88BCCE8F92387 AD7FA91F178330A47B0DE4CF40AC7FB99F78DF9F0889FEE57EFE9F723FBF171C FDCBFD04F773079EFFEFE0E85FA6E8B370744EA608974476B1FD4BFE24923F1E FCF35AFA97FCF913923FBF6112FA5FF2873DA48E520A4E6FBF1C177D1FAA3F1B 17FD4B15FD62AAA860F35E86E6D389A5EF5F2BFEFFE48ACA3497705A97F09703 C76D09BFC6617BA54C772933099942BE29D343CA3C958CED21578DE5A7D25AA3 45ECD22A8E030A38D81D98BD334CD7D7CFCA2E7BEC73FE469E8BC7CB54F6F6D3 DE1EDD3B0D7BFB9B6C6F6F0BD8BD8D6830FA02F104F66EA1DAD7BFEB5CDD7259 C1AFF6FEFC1BA54079DEDF4BDE1198760DC38E28ECCEEB5D08DCA480E5CFA215 74DBAB012DFF7EFA1F405A7C5506D8BB0AF70FF5888A98D0B3011D1018B71F30 5A450621025EADAF416C12CB77EB21C075221D57885FAE7732C45ECCD5D161AF E5F56300607813300398455B12C3582D1281586F5CF64EE4196FA3A5A7C37670 0E2C1D34FB04583A70661334E5E8BBE8772EB6D6DF0E2AB79F323B42D315A0EF 9941BE11BBB71D7475900F1673C989AC25F1B25ABE81AF63165F8BD2D14AD85F C31B958DC89EE936227B3A6CC0783EB745F178D53DEC0557657803C0E3BEB7C7 7DAB0CEF45F71C647B885BA97BDB41F6E0D939D03984F7C2FBF3D853FBFAACA1 BB533D73026A9ECE26770F023C243BFB8556BBA8616BB051FB7A9B2EEBC1BDDC 4B608F5A7EFF651518039BD4F5F6D805EEFD5D4A28D09B9AED2261C0D719BBBB ED60EFE09E32FFEAF28A2CF3F03B13AF6C456A2D198EABB4CC188A92E642CF6F 99D20D93DE3FF766A9C140F4F6606B2050622D74AC5CBEA2BD96C865524B6CBD 2A5B9AF51470D871C99AFE624B2070777438607880711F09E3BB04C0B80369F6 1641C73363FF8162B4BC43F8F1D5BC164271C926302A017B7B98076F0AD8F93C D5FEDEB4F7073443936F401506CFC0B7361F68F243F794D6A3D10F984C037FE2 80E083E180B07F48A1A101ED322CB33FE2ED7BE381D3B682EBFAAA099DDC4A94 4C702BF96A3E45B612B9CD7D9DE4A63E327A6A001AD903B895785A602B996D59 E28DD9921E3C2E3A1681594337A299ED58052629E0B9CA52004932B0009364D8 3F24C9A6F927FC96A9FB18DEA9756707991E42E2B64BF051637A0A89494A5092 7C5721D2FDBC950823EEAA7FD84CB0FF48E4F71037B8BD99F496B90919DC55F4 A298BF062FBD05A952225648A646160BFC9403ECD55A5A2D7D11776098B69411 560814DBC037088ACA0101506CAD098062F5AD89F82C008A0C299D9DC7C2A0D5 C97F188A7A06404672F99D9D238A7676E6388A6E368451B42A15111495464814 25860DF56F5FF4176540BFBD8BBAC3375077A0EDC981508A3F5D3514F038D6C0 61D0D3E20596C785D471D861A63FD959E64AB27FC8C5E9DE8B0A0FC37FD21E23 7BEF357706E3E1A489F99C11F3625417FC00F523F3EFB8B7982373C27A6F81F3 DE8291D8E2E27925F97BCB168AAD02B75D00BDB50493ABC02405BC58B2252F82 9B8A34A0DF5CD97B578381942C0D86B6959F883BBF1144B641D43941E43722C2 D2C450ADFDB70F45919DC08BC0F307A2C88E3581B463308A14A9FCD8D15A5C16 04824295CD0F04859E028877C0027BF116D57F2888C4F17493968183B84EB285 22C822B25A9163B8B83697F11A6F7EFBBDBC3E8513ECD8FDE370EE347C1ACF94 74902416E828BEEBA046819D86541674DB7B163BAC14B37F3B3D96E7498E3FC3 93ECD031E152FE07488FC884B9D2DEF25B91248BEAFED334A124EFC7E138C181 F064DE4F4DF27EFE00CAA34F4C8129F73C9BF258D394474FC7C7288F354F79FC 09FE62692C8910C4CF673CFEA387F3422D7F023D5C849FAAFD357067FB718E24 5330F3508947BE9F6087FF855CC422B98881F6E3A9DCC59AE22E3A9D7F86BBA8 BFD63F2A22DE51492A625F409FCE4FE02E2A72649FBBA82CFE3877B1CD2446B8 8B3FC4432C4DEE4989D0D6F013D445972019BA8E3E89BAD8A41103D4455FC99F 495D2C82BA786FB60880CC53788E15AC7491F2249E23F3F278A72D7F116FB168 FFF4054674285A005F8C4A1DE4888E9EC59F202EB677E511E2E21F4542EC68F9 08DF264D9FA978EBEF5F1FFF4D24C4D290106F4D721F2F9A4F632DD6246BD1EB FF53AC459772128CF9CEA120B677A7BF0F9FB00D605B99F2A1DBE36F70103BF7 BA1FBA3DFE0607F1EF236667298545316964FBEB7F86A1DF2172571BB2E86057 6A92C80DFDE346539F0C22E4A6AA8027008975B5230589AE1A08F63C6B6CC65C A32582A2EEC0E06057F7B93BBE26ECE0FA78FB8EAB40DD05063C08D49D05363E A480E75D4B01ECCD60017161B97F9888E30B3D1EAF3B86F7F8BF8E9E4E16709C FB1E6EB344DD25CA2C640D699CFFFB3ACE12D756C21CD4367E53870552B31971 89CDF0E5AA5E59EED8318FEA710FEAA8ABE5D7E1B1DC774F41C3AFD7D7E16C1A 5B01734C7368558797C0BDABE1FDF9EA5C36E135E9FA439AB7AFE925F0F5076F 015E11B3867A6F35BC979DFDED8E02578A59E49CFDFA7B2970B3F149CED9A3D5 C6E94ACD5969F62261418D9CB3471DA6849881D20E90A87A060675EC3350FEC4 666C0ACA1FC4A43958D51C943FB7D95DDFF5BDDF6726E1C6E675266151933020 A067AD1C12CCDA0DF8CBE3D15ACDC8B9EC5F43D4B3DBF6F56A1BFE7A8B8E5A6C 1DC67166B5E3E55AE3E3E1367CBBCF02070DB8092F9E52F81FF254708F592290 D953069A773C65E830C80DEBD7084BBC2D9FA7ED71E3F37D6B68B01061B17B9C F15F9BED0591AF9537C5FC3ADBFCB260EAEFDCDB971BEF66FF18397E8DFCAA86 3FF80E7A3C9BFE07DB3FDB373BB4BFFA73758D31E72DBBCF439461E9BC69F769 88325E9EB7EDDEDD9456D297F08745513CD98EF7F78E0E0AC8DFE1F216AE04CE 3C4BFB31908014E1F21670F59D64744FA74273F4762C5E54EFDDE638188CDC6F CBCF34BF36AB727D1DA0E6DB419EAAAF6E6E42E4294478AADEC65DE4765522E0 53A1A41180238E30A41914388A35444EDBB7EB259080D4A7CDEBB37FDA6E56D0 F24D72A7ED460DD49050D6342236CBCE7140ECB47DD4626D46250F9E250F9E25 079ED55542B7573928F40DB1F9DBCBCA3A2C77E46FCBF6F740A272592551E8DC F024089D45751F415A1A0D20AD6D2CA6DFA8F72C74F2469485CE7A3E746A43D4 A0A8203A6AC05D260D9D1DE8309D555AE8FC6DE0B6FE08768E3270D1CC8F7EA2 32C654DC4397105391BAA72DE96E351F703B328D456E803D18A20694FBF33DC7 675B3B71D1EB6F1F6F8959433F2CBADF77895149C01EC42A606993151815B106 9B8AB7D890602A2E1A124CC5C5862853B16805AA3DF9E8DD3EC26C1406F7998D 957B07A4BC4B9C8855585C5464988DDB674B301B3B6A2002626BA84A84A3057F 1F41DAA2C87D43C8658ADD37E0DE226D898834E62B66235EEC38E3828DC5311E 80D0D1410E36611FBCABE6BC80DAA70F832D90530D0EEA1C8E85E6D09F2EFA1D FBA6B5BAC3F7B28456B07CDA8ED9A0292E313612A392F026DD26719712FD4D65 2917D81DD36EF70C81ABC08387646B78E088C084D8E6ABFC14DB7DD5C7E8EC2C B6927675AE951713129DCFC771A2A3030E8DCAF2BE4403B1CB5556725B9A012C B02DC90D63BECECA6D4B8D1AF2315A13DB96941644CDC71EB76C1773FE1C7EEC 81CB762FE71F771E7710000EA0683FDC9BF6A90101D882C5186C62FF00B80F1B 789CFCDBC3461E07151EFBFA9B9F32768FDB42C5FA6F3728AFCA8CE55EB11B95 3B3AC8556221B54F7B61737A3C58A438B66F22B78308CEC14D64E8C69DD55502 EB1B8DC7980875E0F9F0E16088BBC00144DCF9682222B2EC3D35E4B12422768C 817D47DBF22B20DAF1F10153205CDABEE3011331FAA4EEE1B0680FDF8E3F2BF7 9EC3438EDC000E1DEFD868E8BBC7002A761060E183AEC39486AE8033A447163A 1FFE2E63A00747C484827648EC00D483CE856C4512021FB834CD95035E2A6A72 8BF6777F73392C86BB8F9487B5767751D2E8DE434863F49E378DDE69371151FF 3CF87592DE234B79D1B04B78736E95984D784B581EBA7A2AA0DA605C60FDCDA5 9C8691FD344556BFD43099ABBF682FF505D4C410F9C029B03F897CE0E403F0D2 7C12CDFBBB93283F39B9E07B286F69FBB272EF491CEDF8C680A0EAEFDE068ED6 2C8ED66C2C59CD95EF84D1B6803B240F78CD60AD7310CA1CC6DDD0D33F0C250E E36E208D190F4F4B378519398CAB1C66E430BE251512876B5400E02A2DE8B667 8BFD9B9FE861BC6E2F74C287F1717BA193398C4FA9C378552ADA83328E8A4FE3 382CD642CCBB2748607DA10AA6772ECCE3EEDD786EC627EC3C80B254786F7ACC 0FE891014D0DDE95B74DB289300B2274A1E6FAFEC79993F611BC343AFA12DEA8 F0004E6CC53EA540F30F692DD95CCBC0CB27DD3D3D7C4A702D9DDE3F449E2C97 140368BD43F80DF99645D9FE6B2CA30F11345D8ECD075946CD428D30863A3CD0 C873C8731843AF3E9031C51CC2DF92A1591A2521903E9DD3E9F34601724FE568 6E54E97FA44BF250D1F8F99B406EBD24799A8E06DCD0869244D0D70C1ED208FA 54DCF310E5D2D3027442654C8CE1CEF67B0513930CF7E73B26099034370DB972 92619266E5EE6D00B407CF0599CCCEF1826898DE1356B10F792F1212419AE650 6D1D8E43F7A51DA06916AD420B0066F2984800CCE67AB2A881A0E00DE3415EE7 AC21CCEBACAB0D515EA75210E269EE0684789AD43BB947D69509F2346715199E 6659ADC8C88CAD4C88DBE90D0DF276EC014603D482C74F694B84DB59B5962051 53DA12236A3A4AC85F6C49C05D31A2E6BEA40244CD2227BD6247F6977888D7B9 AFC02EAFB362E71E0086799DD0379C2305DE07599A025D832C4D01E001966669 54DC93838AF13A85DD015E67450D78894D46C776EB10AFD3F97C1DF44BB134D1 12AE52CE3A02D017E55C2A848D5CF36C4117C80091508B846E86BC9105103348 4A622D8899257B3354B23743257933840AA8246FF2A607FB8758A7E46E7AB64C 8C79B1E02688527743257B37245444889ADAF02051D3D1019B4D81FBE59EAF72 ACCB02F7E41D6FA558976809AE56D481074465475FA2B13CCAD394E30AF1349B EF18E16976D404D28F41E6BAA72507891D87254897362222AB90BA4FE1210687 D47B0E0D21ACD2B813205D32B2F9EE09932EEB05710D3994A40139948405CC0E 5458A0254A0E0699754928880F91584512039175C91A8029682F1DF02BCE6E66 09DA8B075994D4BD875F711625F54EBB834991B19BEB7516245DCA7510205D36 4B6DE8922E5D1514A4A42891953520916FFF682186E3FED1420CC7FDA345188E 624644188E62BE75198E45F7DE6BEE0C26098AE04A077F8010E9401C12225905 9CCAC80AE437B2866CC856438E52418EE3290AD842AE6A94C01594B2A42FE1DB 1E706FA383B61013E2C1B988C29D39780079DBADB8855417EF8CD1A7A2BB6AAE D1A2C62ECFC658A73C7936CE9F74B7EF957992286FBC1BB6215E928B7BF5080B B23A5A9813F73B721AE1713AFC74C3EB2F539CC6A235F4059C21E54990B1CA74 E7149C1CD324C8EAD239B394C6CF948F444AA3E32793D2F891F291458DBECB80 44633FC280D494941003B201A773B8351A9B7E0B7662D1AB274A4EFC4D098DA5 55734AD534D701A16AB2C1AA693FC0676CE2E6DF849D585C1D8178F3043EA343 094478388FCF5869F43E2E9CC7676CE2AEDF849C582EC8078F90E7CF6033D6DF 173E3B28F59FF2C1C52FC5CC022A38328329AB7817CD5E15607CBEE46491DD7F BC42251A8B572F999293FA60714EC9C92FBDB99293AE0AEFDD61869A982B3939 5ECE2E39592EAAE4E4E76B54AA11F5B98CF592AA39E9F44EFECCD69CDC3E5A92 97F80335278B670D5692CD96A97407F6B13295456B39A9B265637E80FD585D25 81926BA794A9AC975C994AB54C3E5DA6B2A8CE656B024D7B28DDA7DD5DF263C5 BE3D704D911F93252AB70F15263F6A156794A8ACA801A98C3F50A2B25CBC428D EE2C4DB11F93352A9DEFC79168B24665BB590C01F663BB29058B5CFC40C5C9EA 5913DB6162BC9D5CC5C9AF9E659522C51CA4399C2B51F912C8701FABA3205560 8D43A354C9C97AC9969CDC34A4988CB99293E5D296346B566C675041EEE3E945 2A8B323C22B1B92AC796CCD6A8DC3E7A9C2DE92B49D615E2D364B246E578F999 1A95E5E2D6757C3A733E4797CC96B5ACBE030076B3652D1983C0C708721C799E 58A3B2D2F0912E796A8D4A0D6E8D404901AEE3CE0CBFB25E10D83E54D4D2814E 9B5F59193D980778768D4A07A0902D79728DCAD2D8F0F1A296B81A980F982952 E9744F0E4DD02B1187902F797A914A1D6FC5F8922797906CA2ADBE8033A48F94 90549FAD4FB054DBD3A74B48D64BAA84A4D37B32DC03DF144688EA6F1F298E65 AEE8A4038C1F2A3AE91A01B9B2740D493734EA9C6D12C7EBEAABF1700F9205E9 388F7F3603C3DCAB7BA5133E916FA7FEF0015B5D0D9C5076922D08FCDE55EC71 E1E965246BB68CE4F82365244BA32520E20FEC339CCBEDD63295C038B98E6465 2BFCABEF8F502839DDF83B52284B6389AEF1E85D6B5BB67FAA8E64BDE4EA488E 9753EB4822A7F3BF6051164585D1BFE29B250DFD97ACCBA295FCF06FD5FAF5E5 C23CCDD1E3D97C9035D4309D7F1F066569B49CF653B559D2E54B731E6F4F275D 56C7927F14CA0D17CC1F29674EE4798CCBEA8027C776FF5F94F50F1128BF0C93 E510834898AE20F9921992E899AF20595A2DA7149D74EDE7CA408E161B0E4EAD 20592FA90A924EF7BF5E41B252E77E05B4148732590FB25C543DC8332A48BA83 823C5CAE20A4AB0150395710B25E920521B76F972051660A42166940ACC263A2 7EA43318D8857EA47EE466458273597D355E39B41C81325B0BF27A49D7822C39 91F537A9B25A1A5BCEA93859B49246826A24E66A548EAEED04CFE7D6A8540BAB CFD2AC974CD149EEFCD78B4E56ECDB839B14EF325974B25C74D5C213CA54EA41 05989AF5922C3AC91A3E5674B2B267633BFC394527AB63091727FF5ED1C9F9CF C6EB3AB11FABBD8C4AD1F6A36A5FDBF6380197F68F6EFFD5EF1F97DD71FC038E C7EE7FA0F1CC098871769532A0F3B4747ACC12DA84979035A63901F178CE12D7 830466525EF733B61273587306FE0BCE5A4B605C6F2DF59AD1B25C187DFDD592 8810EE228959C9737C498C42C219D67C762CF525713F48704EE836CD0F66B70B FD8821733C71D702B06FAD39A19744ABA2385F64995A6F5AC22A7183E7C1FBD4 32CCB07281626A4524F4646C2DBF4226504C4643C94164FB84EB6454B60F1D2D CB64545A1C917D325EAF77B5DAFD8535CFC6EB6D388898AB779F8ED7DBADAFA5 998FEF5BC0CEC0DEF3F17DD3B80A50E6749F8FAD0A6F3E3EAE961D109D2FDE1A 6EADC8B3B3DA5789A19540702CD7B1FD88A0E3FD0DC76AEBC0AA7F659A6C3B30 03FCA22D983ACC297FDFBCAB409EC343E12A85BE8EAB9E6F5729880FB9CAD081 150A1657293B1E1157291D0FDB5565B3232CF1B67C7C79777A2801D7B9D3BC4F 1D3498F0BE5C91CFDBD4C16C5EE343353538A527A7A30D9663DF3BCEBC811C35 606CB81DD9EB142A94A18EF95FCDBB9736DB316593F9F296776BB3FE465E4624 30B2C0F1583B002FD3B496BE486760DD33F562FCE0A692746E6ED63084CE37AB C014B82142055EFEF26801DE6540FFFCCB56E27CA6B836BC3BC9C3532B025BA0 12B91D444C43C4A1EE3129112F3FB748DCF5BD0FA52D76DBEF5A433F377C3FDC 2C75B3990F79B702EE6DA7F9AC6B9571B21172FDCD9FE42D12C9656A259154A6 34E5195AAF5A87B55C4B6B4757C2439E4E7AC8821127774628EAA77B6C25590C B549FFED37943A90C46F8309EFE6369838BF7B62822167A0A0FB6E96518FDE5A AC45F5DE6DEE0C26899BE0CC267926311038FF0E0422E71FF009DE2154444067 48A4219064D4267CD04DF029226E6A5400735059210426172C0DB3A74842526B B09672DD0E55CBE2BFAA578F0E41F82E659A57A2E0DC392BF2967946EEC93C35 E02FB606A3414F8BBDBD4C5792209AFA2C3163C262FAD0F1F054F6F6FB9312F2 6EBD4CC3DE5E5D8EDA1317BBB70113464F8C40ECDD46C06BDDB32CCFF91A72EC 78E7BAE765AEC32024D03FD7BB90B82909DB434245B96A01DB47D28AAB1E93BD AD280D7D017748B0B514314D67ABFB0CC0418A0C420417F67397583E5FEF5C78 9D48875D1078FD7AA621B4A859079DF0E6EF07C001CE524A6228A82C0980E0E8 2AB137196D4904353DDB03FE0D60663D1901C71C023A18F5010474066F2DD422 B1E31A2BDBFD5B62E672C16000D415BCFA4C21606505790484453DE611B0E611 D0D301718D63081DEAB208F87C6E9356D2069DADE2BDE2C2BF9A5D729C47B37B 7B8BB007EFFDA6B8D9391C77CB7BDE45288F6AA2C6F88BFB4A08B217A97F60E6 156AEFAC9B14D731D37F9D6FD6520526AF375191324275BCDEF657927DAA6395 0A22BF7D2D0C887017B177D80FCA8B786E15A2610749114D1074648A9409D11D AF33112341772CABF1A6C895821E2D322A1188616E0F720041A4A305A3C49B48 E029FE1E6E284A8B22F0F1CE2B6D514C448C121D25E42FB624E0AE4687839B07 C477AEB2121BCAEC89C4F603FB8383AFF6DE63A13D6C6C0E56DA5B8F1F2235A4 B7FED61365D61521715712DDDDA77DBE6C8F6937423D5E1E3854B015F0EF7C82 05035F3DE52446F62B5A419F8EAF9D50831314DA4650D8831AEC445783F61A87 5F365810A9646297D87A278A5C62B73B5EE046BA346A1A11D8E8BD9101B2B203 105A3D2DB01395F78342759FDBF171F846BAAE76C46FA45901B9D6B6804E7FDC 3F04B158302254F9E25096C2DE8564E90BA3608499099712532BD119D65DBF8E 841D49987ED71A6053620D90B455AB4F5D48E3A948CF72792B1B8D37E58D742C 16D26A30C1A882C7877EBA081930D6120A1E5B60808D4AAB89C8B4430BA2A9F2 40004DDBF039068D9E07227E0E40633D1D1AC724347AD0F50968F40CA003E690 68BFD90B85743C9F26A074FB6E1960944A02C0A80D0930752A6B201E94038C43 2CFC515832D0BED300A396B1371E074B29B276470658EA3900D6B8A785C21F7B 05828F710922150A9620F174B07B7292397C624061EF5E6CB82EA479F09DC8A7 E8E5AA44CAB6C8DD153E8FAA7BD4543832DBEDAFF0EA2AF1B0D3B6C4434F5B07 D0F126B328632FB03C9465644F2D41E22A304901E24ABC15DCD5AF4A01056A37 E0AE7AF7C243A3772F7F79684ED596F2B1A40B199D03CDB9B1641B490562C936 923A2996FC4E5CD846C621DEF74FC4859DC0F843A1A4BE46088492EA1E21184A 8AAB90D0291B15D84741B2207055110A0D45962B72C6D669AE485CA8F35C81B0 B0CABB6E15B345AED39BE3327D35D08023BAA309FDFBFAA09B2427A089D1BB6E 6A55C032652B1C9A88AD0188DB13496001D81FE12FD63C7FB1A3E643FCC50E4B F2AF672316D5FBA7A93B79224E4D1371C6D3C98B354B5EFC7BB988A5E12246B8 3BE7B3176B9EBDE853F8BC8998A27067D98B3FC1452C0A41FE7BF67692BBA811 ED1FD9DB0DB67E0BE262D10A22F87A3ED3F167F035CB74ACAE21CEADF6DFC274 2C72F02D7FC480D3137991EBB78AF322D5B43E8117E9F12E210D06067C86E758 E4E15EFAD3A139FE5EBCC8A21574DB3B4CC70FF0281D966624B1781629B24D2C 867E77FBAF6638166D4B44A431FF145264758D0FE4143F4F8AAC3952E48934C7 0203770392534891924F182245EA70EA1452A4DA7A22A448B9B59D418AAC6CC1 90F6128E893E04975845017AAA7F2E27D2655D7A37CF67F31BDB7BF4D8CD8BA7 E64F262B1687D142DBC9A9EC4626217D86C233E6D98DF59266378E7F2B57B1B4 F7CBFA16F76377D2DFE037BAB7C51FBB93FE06BFB1FAB7B81FBB93FE0657B1F8 6A5A9F2D15CF7EE21ABB43A2FCC7FC963BCE5FC9FCAE80757666B2AA5F0A8CA1 2969F07FBE2B71975D958EE8C653E913465C15B9CEAEAE25901F7374C0696FB6 63C6F83A13A15E60BADB7B9853B38263F3C16A3E8AE643A4F1736DD8EDB9667B B68DFCF551BFE6ECBC79BF7C132CEF3DCEBBF06D968895F71E5FFF3D8EB344AC BCF7AC63AAA0C33A97CC663CA6831D05CBB2CE3ACA322D0C25D6EC990D49886C B697EB038C3745E6818DCFA896ED23CE0BC5349FB53C4BD696D7E6D2DAB2208D 39B065B21C670B886C5FF2C40959D31372D371E6842CAB8E53A7F037E6E3F60D 13F37133FEDCF9B87DC6C47CDCE74A663E56A8528F679B057FB14A3DEEAD2881 FB3756A9E72061C9C7184AAC395CA94A3D4FC94A55EAF933D6BD30B83285577C 1595C1A3FE12A5C10D530E5AAE9B96A53678C4612527B2FE5A5356CBF6ED572A 9FF1F19DC0EA1EFD2CE5EDB11215191B91E32F3A60ACB2142E4FCD97A57479F4 171A56F3C7AC2D4BF9F2D02F346C2B6C29601EFD85867764A72D59FEC40BED5A 0556FB2A62D2D6864FF49F1DBF8CBFCFB0775C4F80F3647A3F4D71A064CBD92D C1C3FB698A8F24F3E177091EDE4F6C7C749F752CC183A1C33A39CD662CA180B2 8317F872BE7EAFDC56C4F4D5F2C3120FB0C49A4E8B962514886A99316109050C 5B4C91C70691312D65B3C510E1A5378BACD183329F438175B21C670B88D4EC84 1C7F6042D6F4841C7F6242D6FC841CF313B2FEC884FCC6ECAAF9D9F5F537F777 6CFAAE6BE8CFAEFB3BD07C5F72FA47A5FB3BCE7C5FA3FA6077DFC34C438535B7 EE7B94A9ACE093D27D0F322312A396388ECA74ED3B2A5586F34E72DF83D2886F DF86CF31A961063B770E1623CEDDBEDF122B1A1F905D35878A5157ED615F6B87 15F5BD7D35663FC712F4197698127BCC17D151563B96904F49F01E2225A698C4 1E2346746C5F7058FD25F32183334786759EC863F4E0CCC2A57DE8070ABDFECD E56D8F7F6E8FF30FFA37FDF3DE61DB4C031C39EEFB0E1B4C67DCF71D369233D9 102A2EF14666CA30E1E433F245CE54127B729BFD70D79D912FBAF6408AF245E6 2E23F664235FC45A305F8433D1CA1795FD7F96C7AC7C51F1F7E413E763D90C39 7106E7E7634DCFC7F15BF3F121E6E3300A0085F9F8D5E743CCC7E17ED8092C4C 7C88F9586271CF43CC47438B952D7A88F9D88A147B0A2B91F12062E1E9434C61 438BF5251F22E519087E36254B0233EA6291C01CFB1E7E7FC7258119F1F0FB3B AE09CC58F8F310094C438BE92E91C06C4C8125FF1009CC8892B7296B02331001 95F7C4AF5191518B440726B391D27CDE871E221BA9B4E0BA5FAB8ECC31E697A7 6FFD29B9561D9963CCF7C5BBBB0BADD553E618F37DB7EF2EFAADB2C968EB3066 E4CA959A234665074CC89D0E38D93A4C5F0D97344F68D5B2CA847EE650F3BE82 DCA2723EEBB27D30A03C10AB91A4B43053D5A6D90C7444249ECDC0DE1A2E1651 C82F276529C89128E977F5B87F6206CEFF6DB04CC047A5A96B26449E9D857E24 8D3CFD49681053E857F8A84AD9335906EDE9FAD5EADFF2AB5703ACE3258B6FE8 B849AEA2FEAF1516570979CA956004356CA7DFDF631DF4FB7B8C1FF8137C8C1F F82B7C8C85F4437C9E922CFF3CE62DAD2385831D571D50E4CEFBCC60B7B75980 009AF42373389A1464DE738879CF02E6DDDF530CF403773AE8E77BE8884EEC22 1BFDA624FA4DE8244280294F3707110F99A63C604EEEC6622BC9C21FFD64A1A7 C35AD0C84FEEB8EA30C9AB3F030F6BA8E6AABB5617F20EA3AFAE7B8CDE2DDF14 35F66EF366B1C96A893514CEBCAF81D89D7ABDA9AA8FB6435D151EA1DCB4C25A D24E59C9EA02DFA1E263C74B87828F8E8FF6CF26EA3DFA1E6A2B2CB27BDE83BF CBBE2DDF14D577AF358F240B8DE0490F829CF54B38E7FBD356424738B6248B73 BC382938026FB51B49235292415B0720ADC8D0C7485B4936328C3958EBA08D04 80FE631B09407D7E23C1C5648C3E15EAD94B15A35A1F208DC830B691C8C8B003 92466418D94864E4E68CC90E0D9D2191061A119AF04137E1A708ECB75A8517E4 9956584BB3CD9A7405DC217D082B7D4CFA10F0F9A0944D0E7E0AF81CE8C86506 3F037C0E34D9952830C6FD799C7457DB8756B4BBDE7209413F42B4702F7724E6 CD44AC9B59C05F9CDF8814FD00CB85CA332345DF123BC53580064CF4D70A8831 90AF14C43C9580ED2969B5C43D4AF5B302AAFBC836D87B0AA124DDA0F0886CAF EE282040031CBA7CB303668037376B0FF8E839D3E81C9E00DBE3B61732F40C31 DE3C6A03EA5CAF1840877E8128C1F3CB11846CC71435FC7E7B6DEE5D8D867D69 F56EEF1B0A4626B9C8034B56A3823BC92C70A39A41AC02AAEDA00DFD25D807B6 A29689C8A20CC45BC065E5B834BE686161D9574D43BCB1B7BE11290D237933B1 5738609E9146731D6864D170175108225381FD15DE28807A51347E3BD585BDF7 16F8B139E2C7216718D842F45CEFCD46912FEC4E3091A3C34BF77DD877D97367 03513DDB0E49429E87471F823C0F92ACD557B40D2D84FD3844D61F88FDC664EC 571D059F89FDB2B11CC6441FD91652B19CDC183E1BF8E1FE64DF80F0B6F081C0 4F416520F0AB9F0AFCE86488911C0C87FA87D23334F88F38A734EE8FC4D1CE07 EBEEB35A0194CE218B79B99ABD4314227F05255462B1EA9F410992FDD46FBAC4 C87EAE1AF0155B8375863C2DE4B3972D564D2DB8295A74840546252030C373EF B40B047E25951500DE81C914AA50FF7842533F461460076E2AAC0251BCB92EAC 74A30A155651554AB404796A97687EC59404C40F5C457E27D5D100B1A05A7BB1 DF49D5CB22C0116C175F9F23E82B8153309A62FF9E670B565A4716129151C920 02DE2A8D255AC426B33184C6FCAB756401D4E6087A3A88230858021C41C42AE0 522216129112BB87941F8D3E05840F5CAA8083E09D16A1FA34410738912688B8 69D30419A26C9A2063205129B97FDA5E08363A5EB270C3711301A0EF275B4916 006DCE9FA7C3E6FCC91F3251B104BFF8DA7FCA2456F454FC6A4B130FC1124505 B693C000FC593FEC1E006C1EBE91FB7202BA598591D02227AD3F3E634BD8FB83 12E8FFE0B33F28003FB41C0341D441D18AF878F2F79E2152D15F4F24F39C2850 CC3EF97BCF78E4DC15C89F58A69CDE3EFEBBEADCF38FD139EC0FF3D833A15C59 55C00B91E2989C7A21329B1D0FFEAAAB03B00F8DA71F73F774508E2F791C1ED5 8FE2459FBE49480E1C86ABAB84327DD9A3B0A7032E8DD267E76BF2247C9D009A 616B99AD4E94D3A6EEE19AD21E3D9DD4A0774EFD65CFC0F8A3BF007ECEAF23E3 3B42F8F9651ED36E45739C858DEE8AE75F5A3D382430816D863D85FC8AE8479F 8E4E66AC00886A6002011FF70FCBF2FADA7AD6953CBDAA427460EFB5EC472152 8548A16DA5276239F62AEE2BA6871201A474940052A2F188948E0ED857AEEF9B 8BD98A2EEECD1A96F655B5273FDDDEEDAFB2BDE724A37BC03D7BF4F836D8EEDD C6BDB28EFD354F23ED47D1FE76B98E83F8C94E06A579449BC84D8B00525EAB10 9994082C6AA1A44C7A5CE4D7DD9257FD4C29015B8AA383BC2556D0624837FBA7 E6F7E2AF5EF64F2DA2E5AB74B2539E125AA8648A8D83A5D5D195F04795C44E48 173A10C5FB0BC160C8B95A05EC30640525FE5003BE0D364104D37E368860D6CF 06407C3D0D9D039B4D8CBCD79AEDCC60A59D1FDCBE92017DFCC29A908F1F0513 F051160B3189D27D087BF8749A35D09622690E9340234CF831B8382284158E73 09266DEF1E20AC2BE10F2B0BAC9455641D9455B417283F2436D705BCB7A6F8CA 7E6BCD9D7BF1E171E4DE96136BCD23F120745907D38628EC45BD34A7BA0BF0F3 07B134A7AB14E8C73C5A0130DEC0027CFD80FD7BB1E1ECCF65AD0C9BBDDD5D66 99C543CF3F756F3F89F6DD89B6A0D0E078A7C8D1F79B2B6317181D02BE347AA7 BD8640819F85202A74269C056FF8E0C6519285377CE6E5E8805498B6E3D67A2B 1338C6FC2B63AECE7C350247DBBBEDB1BE2BE08E2979DCA6373A8E864CA4D9F1 6A8BC1E0D27AB1B7830002A8CE33B123965680BE93C7E68E638CD8117CB3C55D 710927DA8CEC382A1674301EC24D6750A8830685560476E6A8A7F0FBF53DD5A8 B009D7CED7B319D78ED91EAE9286C35276CBF775CA3D266F64B2C5083B3FCE9C 2DB45030D5E869B17C76C5527E906C2C1981E5978A921A467AE8EB7D8F6117E8 5EE414AD600ADCE4E080520F9B394F07FD63962E5B1E71E4B7CD4E4E931E3777 CA4826E88CF4BCB9E3A9049DD1F98DE98EAF1217DAA57DAF1CB903CF5649F4C7 05793AA7DE630441220C4886294E69224C39DE22C88D792BC267CCD63CF4747C A6E6A186AA5FA891C899501B3AED542822156637C95A387352EF70E62418EC78 27C3664C163D2C8D0A25E06D2E71FA2361A69D0E65C8E4529284199CDA44D000 BF7A051EFC6A9219FA63B6E4A15F5611E87DF30F2464F88FF36F1784839BAF3F 9B7F1EC112789A3356B60FF1257140C0FA068BF1CD0CF64F1E15BFFE1D214CD6 CBF6933D61C2E4F6DD52044847091020D11224F8A10EE4F889AF11604016F539 0202FAFBC528936202F62993552AE8532695C521CE24F50EE4EFE5575872CF5F D6DF664A047FEB2FB16418908E126040A229F8FCC5D1018BF521ED889DB8D71F 16499CB8BF743FA42DB117819E1AF0185B8374704F0BF98C00DA755866CB7810 44B7AE2ACB6F8985DBF706044B162CA6F20FB2FFD00342180F82E643807FE4FC BC7DE7DC03C28780FFD0F9592A89F027ABB224C6877474D0A0D80CDA6394B314 03719DE5DEA862244AFC8608A0AC82D0000C4702396BB0F395E52951ED5EBEFA E8E72B071938DF4721C3F9B14186B5F7BB9281839EA706FCC5D660BED2D30257 67DA96BEC866FE020FB3F13DC05D86B50A8C4A00B6A7E70E70B3E11D00650570 E6030B304D06FD23203EC5546FA885AE8F6C6E219DF90671349E34AFD2F3D322 F1D0C3829D4618F218BB14C9A235F405DC21C1795A4DD849DCF53A9472B52E24 2389F150ADBEF91BF612648E124890A129984E747440748428C2E94444114E27 2222C6BCA595D817648D2542827E74856DC704248ECA4E406EDFF000259C32B3 A1841F54DB50880945EA3E05849850A4DE6D22A082C1FBF693749E7710383BFE 34D98959D8C44C1940143EA806D0C48C22F69F4540CE28226EA09B18007D3FD9 4A20A3889620C14FEBE84A78A3C21CA4BDE498E767AF0AFE791A7BD1215F92BA 877C228DDE738FD1BB17FB6D4BFABE2FE98E770C1040AE85868D2225FA0BB451 01543F654557C0311BE97E3C24489489CFA6E884817D44F10903936E925CCBEE 3EF290A3F1106F693DF6A990D037B0C925463C040C39AE2154E978D30289CE2C B5F011D97D4A495FC21F56165191E0E7E8C8869441FFCAB88A997E1852C6BCA5 956403C498B7B48ED46999B969362077E6E101EF7D2719DD03659C469F0A1089 1589E15EC73B3601D1033E23DC8BEC268FFE987498FB38301C1301A263030D89 D01B6DCE86D1B15DBA8606852A3C2C33ADF0621953839DFC2AD741D68210D8B7 260C2DF49332D7EBCBB2FE15CDABF55BE6360819BE51BD5EA5CC4DC9D81B4CA3 468BC0CEED8D0C40931D80B73A9E16D86466F397B71EB325C3DB5F9E8F578141 09C00167B66311B8DEA50024EE5101B9D6B6004B0B42FF98649CC76FDF55782E B2EF43E0E66BB6212E312A89F70FAB7B394939A8F67538F00084E1ED1374B8D0 72749073C5EA9BEDE82619D52497BFFDC23946B992EEEA42D9F395A9020E8364 06DEB9B0065AA78406905F6C612A20E2C194E35CC24FBCD1729464A1102B36A2 0E4A30028C700ACD86114E30DA306827188BEA5E35F7F617633429CCB4F39108 9958E01110B3E34B8BEB877B8A8D7E94324360C2DC22611F25171D0D49E4C3E4 226206B8A989BBB40490F008297DC79A1A9248498933D440A9B3C90E37B0D2F7 948A67E6D77C76C0647B08BBB7FD03A3A79B68EC1D7CB32F9B65F0DBFE0CE15E 59142424462D316809F0A8586BD7BB92B077104785BD9CD16E8A64500311F0F6 EFA6D97D9E930C765F77CECD4BE6DDDC71CFE1B9375E3E8B29275E93FBAEB17A B7F38A62B9F49BAF9626E2C1753CF17070FD5489689015D8D10A9940F445EE1F 325D758187CCC9F85A05A73C7432FEFA77BDB18CBD7F3422FDC3746764709FCF 0E40C68EA785DCBC5759089C8CEBAA23B1932C76C44FC6AC00928A60017244A0 7FA488CCE38F9F8CCBAA01797F6873E664BC581D3E1957A5E250378D96531122 0116D1E86AE9671795211D929DE12C9C8232BBA83E08FEA806F130AF013AA2B2 021F5E9006A2D6291BF490B2172B9FE42F7A572BBCC47F80BFD86149FE2323AE 5825FBEFB6E7F17C8CBCE8A4F61DD8399BBC582F49F2E2DFCC452CAD295D09CF F84FB1173D4637A60A7F80BDE85324FF2B2EE2F60D6F510187FE97C34EC82D22 746261C813C98B0E353209837F2E15B1E8FEBBEDBDF17C88BAE8E1253E323F9F BAE871B7FF111165F81B6CEE18FB01DE62B3D202BC4597C11738B304788B2E35 F2BFA121E24743DEC86F455BD4B171B73933117F9DE5C80CCA2C307E8EB3E871 BAFF3B066269757425FC517D88B3E853FDD281E4A7388B5E481CF3D69FCE592C 7AF47D12E29914C7AADFD5AAD374E741BF759AE674997C5BAB4ED3FE8354E3AC CBC3A2E334E79149071692BB3D92839212DA7047E49E75EFF536C147644BE8B3 63DAC81916202DDA8EF93547C77F79A7537FE482C6B5065D76FA058D777F627A ABA80B9A7F373ADDCB9353EE67FC9B13D8999CEB99BEE131AEA3372A7B8B526B 2F76B7AD564588EBA8965EFF76BB7A2A68718319988E640D708844F8E06C24C2 87E3298242DB55A555A224E020E90C2B0B9D76FED2434E4C47DA28C209371B45 301D092888E948EA9E7C0AA387F321F59E43C08E73C2DCC5A2F02F20C0808949 3642263B7B5919FC301DC91AC8AB80199C8E24D070DC04C8E7FB29C15D442B30 79461A3EC35D2C928BA5C30D98ACA7721D1D2A2510A56C6B3FC275AC69AEE30F 3017359DB21100721E8FE9BFA13A16657440603C951B5953DC4887BDF8016EA4 C3BCFC8FC88E45931D9580CDE03B971C5993E448AF7F074113A1A3A65FC62247 694320701C3D150E0B3CF3DE0535500C68233BD6F396D8AB9A97C43E836F63EC 8D806AEF50E70E1E06A3451EB843FA4EC48A026A43919FC0F27EE0A769F1CDAF 20C2780492EBB88F06841AECED4EBED3D187E42B3E2881778D9D47BF71D263E5 179DF824751C6D15487A1CAB6D05BEDC250DF86E77123F64FFF5ED0214C632DD 85C8ED12603096E92144A64B9FC0E829015FA125B6B34AA3A32FE18F8AFCFBD8 9060B6FB1D6CC22EB26858DADF2E3DB6E366F5D27EB874C98ED83D50F2ECD1E3 BB5DBB77642E4EFB2FAF37843FD83E1605B684BD832889FB41C234E2F19678EA 0C9E0D9752C5D7CCE8A515B5DDE511790FCD1AE0164BAEB7A7B86F751E9BCBA9 FD509C4577EA6D12638FE5583D15B4A4C10C7C0ECD1A80F3AD6CE80A38288329 45C40C70AC8396F8CE9C5524B1929283A881E2421B39F8E5AE891C4C5434518F 1283D439AD4E7BE436034FF6DD6BCD23C9E123FE0C38811D33EF00EBF0992E00 11650409E92821C8FD93870020301F8808E1F80860CE7792A9029877D20A2980 DC3B321B1F3FD390887F672F3024DFD9F31A898CF612B3798C1412B16FEC917B 8E39F64DBBC5BE5C965F0E18855F10055781A915E82C30A98129626285CDF6BE 05FA2B582BF0D0F06801D1E8B87F0FE38E24BDFE44532C3D77279D9B3F257BB1 BB4FCCE033743CF31EF90C6D83E317B54F745BF3489228880430C403A680110A FACE345500518EAD48821A920A29EA89F949863D8E9F20760BF949ABA0DD62CA 08B866274FB9F4C3B3369E4716B100DDCED46B119D48DAD47926D80B2C4BD5B7 7DBFA1A0596339F9C58EF73A8E3CC67B9DD9798CF7889F2D15F4DB73FC163259 06880EA293061A1159FC199F56E7ABF57DA41578C19E65817754B3FA2716C7FB 67D46FABFA57734C140CEFD655B5B6BCF3CAA8C65B8FA2F543B6B61D0903A13B 77B0D28640E81BF6157BD4766A867B36FCE18D3AEE916AEF23F1C69E89BFE63C F561CA787D5F95F4A7DF2B372E5A772654191FA2B5BD7540D744B08271777CA2 FB86FD343EA13C6FFFEA842AA2EFCFCEBED484F2D68C8F675379FF185A7F3E4D A36C0C58FF6E7C178D3BF0A43AEE4E2635E68E3B54CFBF8C4DA9A954D454FA4F A1CC5B2FBF0AEDB9CD1167EA9FB9DDBD523041FCE8359543D04DFDA93474FAAD D8AF8749CD685D87E9A6FE06F7F1F82A35850A756D1F8D12F3CD5FDDBF0AE867 4198BF4AFE2F36B832DCC5FCEB464C452E975EC0AE5BDB2C2FD1F8A61BC7C7D1 05306D642FBC2A436745FEFFC7EBEE845A7FD2363EFB4EDD1125E6FCA7E0871F F20378963CF1BC47FD7C5DE50567C8D7495EB5F527DF63ECF45CB9670FCBDA11 7BAE68FB3D78428590DDD6CABEE7EB2347A7D2F3261B7702FBE7241A77704C75 DC9D476ACC9D6D40F5DC01B1EBEDA91B7B437EBD8C558DFD5DF14575FC7EDF5E A47E18B537950E3DFF322EFD65917A7FA39340FD9F261DBC1DF75F62EA3F4D4C C9E0B0DBF85FDCEE7C983F32312520A4DB9646F1E704ECFFB2526EBCF7DB04E1 7F6D664A7F8EEEA1F9CC3416AE955F9E73FF3253BFB4C309483F13C402692C19 04F5D358FF32533FB7D1FD8E37C9FF724DEDA771734D4DCEF03FCC4B09C0E9B6 7546F14B392C2737E6C3D81F99952AD07367727E3683253E493F8335FE9F66B0 9ECF8D5C2861807F70AC0CC35B4040C1320E13C286F21678280160AAA1023BBC 1706E8E6F68A047BF1ED258E06227CB0F60AB3C0EDDFF0A6377CE36BED2FC255 EF5770CEFEDCBCF954B673A077FAA993F10A8329F63B86BDBD4C29F113E1AFFD E4DD7E4F14F1CC9C5F2D1FD26130318BEABEDBDC198D8D8E602C3DB9C6DE01F5 B2B332312967CA69784EFA9D5B5B28C187ED18AF77C3314BD1CE367DD4AB0BDA A690688E95B5FC66B4FDA8DADF657BA80245C38153846D2DFEEE18F50EBEDC6B E40666992A081CC23E51103834D1DCFEAD44118CFFE89E25748DB70F8CC7D84B AE6530EDE5C9590A28A0D956AE60817DC2600510F28105E821EC9F0E5FEF6A7A 7B8E0A514D14D3DB4FE738DB441DC0A1696D6C0EA2EF6E6B772466E06C59E9D7 A235FBF6F12F38C7764C88CCB12A112D14FFB102986360815FDE38B343D0F8E1 DB7AFD9B3BC49468DFB1373B1E738FB0EDA5D306F58F47D77DFC3293E514E9DD 15C86C9653A377B740E6E1B8442F2AE8EEA28D055D0F35FDE7661C252FE41710 ED9FB909F1CCCD37BB775C5E4FC236DB56ACC6EBF46EED0F34F61CB86131121C 3D6C9FD47D0AD9F0A7C0ECDEF177C0C4D8BBCD95A92297858568F7B1886C1656 B9DD0D15F9B76FF4ED4FB076DCFEE6D0F6ED4399C86885F64E91A9A2AD537D22 DDDEE6C5CAE653D33C339A2EEA4963036707DD3B2534455DE4A7F425C08C2C8C 3C35FDFBD19C4CCE4522B463FFE6FD8C3D7EFF279DA17FD33F347E60C02A0587 C996B298C00F4D06F44305942FB64DC66D16FAE79B1B7BFC94B075FB4F4C394A 36BBFDFBC782E3F87FD93F458FBFDB5EDBAB0BB1111C8A018977F058A14A1A3C 3E457BAF42B6D17D7FBA89E1D3EFDE63EF297CC318CDFE56768C5669AA7DA7F7 F844B3F7D006797ACD71305CFEDFFC4C589D0ABE13567385491629FFAFBAA76B 7C187DDF376DA1AFF824A302B0E0792A930593CCAE92E5F71E9F64F7DCACB99B 9EC105D2FB79A2FF83DDF03301C66296D11C7F85FEDDBCDCE694BE6CEF26FDCB D7BFF7F6DD2B85727DB4CDB3DDBB970A7AF8FD5B05A37FC33D387CB8EAE2FE4B B1EF19D1806752C13D6300323E864C7B1E0EB60773299672FBB7AE559DE127A6 1B5EDF7BC3376F9D73EE790F7F125787035FE1BF9BEF57875C70F53DF6E9215A D3E5BDD935DCDC87DBDA16623D567B10F6CE009F864227F832943CB3E715E5CE BCCEE32046C104F44EF9A127B40604B33E10175EB5BE108664E60CB403328944 DDC6388EF814C4CAB576C72970C302ADF677B4C336DA49B1B6A9D3797C0ADA51 9BDA26FACDFDC178535083B84365F2365D77221A9B6E2A2AB14F075ED093D825 2828D9F92EA1EBF99D6212BA9712EC9EC8B594D7BBB15788B1F79BA3A9E4496F 30C69EF18FF36B2C267BD4F6C7E79E7F95445E44DFFF978FF43EFEEA537C9AFE AB4FECFA03AF3EF14529EC8A274DA8F2D7D590EABFFBA4EA5E3D84FAE8BB4FF5 61DAF799BFF84A34F3F2F3B7C1B2DFF151FAEF534C4A35FE7F2926F5C1779FEA B3F4DE7D72BFBFF2EEB360AFCA0765CD74079A763EC507E65B11F3EDC3B3F3FF B306C76FF3A4EF8776C3C0B34F31AF3F5EEB2CF54814DF9FF6C3B1E1A38F44FF 823DF1FB21FBBF97E9ADB73FFA9653C5851F7EF99979CD59D93E6F717DFA3527 15ECEAA1CD475F73161C73EB8DF5A944E2EDE769EF3905AC7FB87C59F2F1A7F7 B0D403B10F3FFEACC9C79FDE6B459A7DA9C79FD5510039F9CC6B4EAF7B985CA7 BEE644FF53CEF4CCD79CF85614B3C9A7BECE2CF1D7990BC2A41E739EFB3A533F 15ED36770603B3323329ABB82688BD304E4D49AF73F7223C9497F77A371C937B CC59D4FBC6D23ECEF419D39F7FCC59B9FBEEF3808F3FE67C3DCE7C6F3B21E83B F73167E7B1A8E59D531F6716F5B4F100C6D6DC14EDCF78CC59938F393D059F78 CCE93D16A528F8ACC79C8AFFF79F3ECF2CB2EF6E6B77243EFEC58A79241F737A 8F213FF198131F6C4540ED84C79C9DC7A23FFE38B3D0A32D209E759E1226FC89 3703B9C79CDE5BC8FE8C0B3CE6F45E8B7677D1131E73163DFE8F3FFE4CBEE674 5E44E67BFFD5D79CFE5BD138BC7DE83527BE7CC6F72527BEE654B1E9C71F7FE6 5E73BAAF227D0CFCF06BCEEA8DDB77CAC75F732AAF045E739EFB3CB3A8D1779B A3B11F79CD298F7981C79CF298177ACBF9DC5B775F7256B77397D1187AC7E9F5 6EEC064F68DD23D596EB3C5AD5DE271CBE188452A0CF682C4AA0C7AE8DB4F706 D4E1D86A83E97682BA8F3C23286DFBC4F0E946DE1B7EB6FB0EDBF630FC0FB867 67388B7CC2D0A7CF8A7C42E419C15DB4EEF2B265D71DD6AC1875E069C0A81BC7 674B80BD2FBD1D781A507B9DE354B103B122872E9B539104B034F092E0D0FBC1 8FF6078A3C0D1865EBC4ACB2D9FE3061FB6C7F39E8C4AC226F78BE8E7F787AA4 69CF2A9BEDAFE0BCDFDC1F4B7C56D96C7F5C3F5DB67FA86E9FF989685FACF6BC 0AEC7291BCAD39F0FEC3C35005BEFBBBF5FC05DF5E81D8FBFD13F7D35534C74A 5535D17C14CDEBB36D9E1C8C7512B04DC500D6E9DD72248DDD0CD42A775F4AE6 43D1EB4DECDE7ABC5969F49872B07BC7E6F6D8B13AD59468EE0F263EC9B0C686 D3BB754A724C8D4F32A6D5BE01AF4EDD804B765FBE8CED465CFBE0CBD770FC90 4B7E26DDDA66D6D250887364198A5921E83B331B319F657E212EAB614DAE6FF4 1D9E5A5897CAEC9BEB4058FEC690CB7638C45C45CE2BD51C8A5299B310CB69C0 5088416BDBD95B9DBAEFCCBCC20C99F97DB8928635AF28EA72FA0EEF8B584683 FB8EEF8A7CBF3E99ED317DE1EEA2EEDC3AEEA271F0E78A1B1CBFFC6A84A18E01 625D44EA6788C98BB1D7D35A18107A55B7733FAE97430FD4CE38F46E4CB2E9D5 FC7A9DBFF892E07BB9DF0DEE67E6D25B641222F3B1C382F6991BF516796A119B FDE16A196C0616DA52D67DFB302E47C9C3F6175AF2397F95C692E9E02F630E7A C6838BE735646AB9DA2E5EF10E3EA4E5624F09B9F8B59AEA2B5BABEA9AF9EFCA D7F67BD12676D4BC9ED6F64FD9DE396D5ADD737AEC3878379F6D754E77268F05 1F4399FEB2DE231CDBFBF7E36BFB4899C7F95A636D1FB81C70FBC70B4E183FDE 9B40FFC6AEB0706CE6F63156E542B25905223F7AB1B0845681C0AF5EB08276BA AD4CEF70FB6D3CB6C57E8978AB7FFBC6A5DC9F667B2C6CB5B78FDD5DDDC58CE8 CED0AF3FBB8B19112844EAF66F6DCE307EDC9DBDFE2DFF3C5EE3CFEDCFE5F190 32A10DBA3C9E5226B443FB7AACFDC3B5C7DE404AABA62FD21999BDE95CAF7517 99B3901D3F7FA1C7751422A3100137BFB4DC8448D122B0497B5A6093465B7093 769480BF76208994F8AB12498225FE76E80C94F81B1D0570852F2D889404048B 03D019DC8CC85ED8ACBDFE4D7F3AE34F7D30D8AC61FC98BE83FE91DA05DF0B13 A762AB8B25FCC45E278F4E833D43D517534733FCE50354D0DFACB50590B6C2FE C943CE178BCF38CCE7D9130E137A4EEFF1E966A7398BEEBDD7DC1F0CCE356B8F 02BADCF6B1AC3DEA89BBC76CB2B5493F71F7F0B4C0EE81B63C68F740250FDC3D 84250BD1F42D11F1D7C2EDDC45C85FC292856EBA8B04FCD56AB1FC555A5BFA22 BEF90117374A2C17ABD5277881A1A38D60EF85B667C10D84DDB972F75DE893A3 0FECB5BA77D84AE600E9D01C1F93ECCDAFA56D8F21DBDABE1D3D46856BFBD2B4 B70E89B2FF6EFBCE782CE783BDF8F4C4EBDFF427D96BDEF77A0614EBC2B73A16 C08D2F2AB0EBF5920578F708FDE3CE0CE3C78B56AFFFC48CC39DDFEB1F4F2030 7E3C7F64FC23CE516518BFFE683BB00C36C05DF519A7CCDDF81B6EC989BC1232 DFD0D21C3D5FD82E450287C2560B6C53DA654AE40930404E7E468E918D0ED8A5 A4EDCB54F103A746C9325BFA1EBE4991A2442C0F575F0BECEA680BEEEAA8C4DE D5B7AF785828582758B45FBEA06CEF2FF4E5FBBDDB4314B02FF465E60EBBC1FE CED56FEE8C06820632B6BB6DE9DE53988C2F2D6C48B32FA92B2132DE523BBDC7 7774E2067ABDC72799136BDA9EA76053056C11019C97109E7A23022E04988C01 2AF6DFBDE991AF57F0F7B9F68B8FC38311FFDEE6F01CC5BF163AF48EAF860E63 0F5CDA441EBB2C635F31731EBDC8870208DE44D2F9D95C8D5E1DFF6F22C70B58 73608E9601B4902D0305AAA864A01D162D8148C957423BAC6389B9C396464B23 32E407069BB263BECD09C8BA582DA7722FFBE2EE387815D8D103B8856A45BD2E B4BA3FC545DD7B8FD30EC3F79F911ABD6790CC7F01DB82819D612C0AC77AAD09 F5BE319230E6F92F25DBBEFD979287EFC39932FB03710C67CF2E0CCAA87BAFC6 8031FAAE6B74EF99D965C76445F9BDF915ABF00C4096A139BBECBE69C3C6F0CD B4125986DC776F3F5DBED086771CBF49885C3E93DE517196BD65EE5A26B0451C F4B480BF32225232C6EEA57D40CC31578DBD4DBCBAB1AFD8FD7734B99BFC679A 06E62AB11DC6A690BF3C253D1AD8F17ED9F2EEB0B73F5C2F1FDA2F7F6CB6B703 2FD9BCBD8CCE8CC67E4262DBCA75F2A073686E0FDD2D6006BD03F715869E6098 D945F5D4BE7A02034C5F8A07D886455D0C6A861FAC2E2510E127CA8BCD3E41B1 3A0AFA3C86084791FB07AAF5A994AE65EFC8F018CEA57475C66F014FCD4DD1A5 FDB6D3CCA4BDFEBE51E5663B13F1BA1B475986B4C93CB40C6C1DAE1ED83BD81E DC3C3C35B0D9DE8535D1DDF6FE0DE2DCDD21B491D75C3DE035B60789735A4D84 ACED8E0C1CFDB09723F3B51FB45E0010176E22ECBDC84B84CDD7D863C8025CF0 D87FF78C229F370748DBFA357477473DBC59F68F298707D1FE39E5D0BB7F5039 8CDDDFAD434532739C4364F1C4F6DED0CF0AA382FF824358F4F843E1CF999C43 FE62DFEAFF973987FCBDF09E593188660E5E3F7B3AFFC95BE6A965EC5D441382 662E61277FDAD363EF22AE3DF62ED2A8E98B7446162084E9BD0A1CFD4D06DD20 45344F2FE0E628838E797A59069D7D718E48D2A11B1E663EA49C716561CA99BA 4F71AFF162D736167388F660A8448CA4F196BDE6255EECEEBDCB1293589F6F1F BBAC78894F9B9DDE7D003C8CDDF7CCA177733B19ECE674D166B2F6986CB08FE6 212FA5CD29A9BE93601CDEFB3352759EE11BE2FD38F4DDDF64DBCBF7CE528A10 07C4DA2801E280D37B678315639F4CC7E8EC48B7390E667277E319C1E722D05F 7FF758C246735597CB20FEC1A69B91AF7F3ABD8EF15E6B66B4897EDF5BE597B7 B76CCC57DBDEBB9BEBED32FF4EC2BB3DE7E9E761CFBFEF300E6D7B9C50AF8A00 46FF48977E4CB1F6A36A3FB5ED714E95E16E2AC0EF3417C1322CC66F55C6674C C366C21CCC1836E0DC7DFD7758C33CCFCAB5B1616ECA36BC3653AD01048A9C75 B776D6FDEA241D4F9EA41B2E9D35A9B393B46627E978FA24ADD9493A9E3E496B 76926EE987714E7E6DAFADFD79372720A6C72C5077019878654D9F8405B67CCB E3390B5C5B011C52996F610C1578473217FDD36633462E3AEAD5D6617A7636E3 DA9AC1DBCEA262B8253C359B711D6D33D855630DBA6AFB7C659AECCF8157C328 C1CE7DDC83CEDD3EE0EA5C6DB8476843E7E2F7DB9C7B30C31C94EB5C5C7D9BAB 841D034B80AB4062632BCC7F26AD98FF00150CAB2181E68F77F347AF7951BD77 9B7F63300953EBF74C9DA7DCC6F90920E5BC43BF7939CE72DEBED4BCE5BE793F 81D53CEFB986064C36CF9BAEB28177DD75D9DC6D15CEB279D856F0949EF7DD88 8EB22D9BB0C47BA1CD5BB561398F6ADEAB233ADEB4A0726D2D1F78F35D66C861 8A3812993958B373703C7D0ED6EC1C1C7F600E6EB874E6ACCDCFC19A9E83E30F CCC1252DB1448CDB85950B83735836877FDB85953B015FFE9C63BFEDAECD997D 2BF36689FC8EBD130B6B89FBE4E011FF96FEE7A8EFD8BFE1CD79F4D766F4BE6B 969824E09BD5F34B44721C3DF63FC72321EFCC73790E468ECE47E7CCA148C839 F3F017EFE8D13BF434F28EB1869FBB73A29F6A6D7E30164703BEA455B23A5358 3BF8FD1F9C89ED971F8CDBEE3FE6B35E87AD51D71F6B7BCB4C9796506A6D0855 3E049CD9558A12616D099E1A2A948AD6F8BF3C075A201BBAFF105EC31323EADA FEEB761181510B84A86BFBEFFE35D432B83E47055007194C1EE8EE05FA1FE8F2 651E7F79DC2E5F7FF97C3D1A9EC9BD8377DB3BAB58445E3F6AA944BC49B889DC 9488E7A7755C572D419E12965CF5B03C5FD93A80A822EC8848B4CB6F36BD7F9D AE56C6EC6175656B1D3DE4FA5BBEA3BC7F4D2AA172B5640ABE9B7174D00A271C E1C7D188238EB7081363DED24AB288883795A883CB709BE0C0CF646C70E06732 36B8E13319EADE5AB095479F4236BCB3266003EF140D0752E2BE6D186124840B 5D0708ED3B5D0707EF5918C4573CAC81B60CC2817B1ED11C4F11A2F9AEB29564 110DAF6F51877D835B1A1CE84BE0AA9B9231CBE4A3DF61DD4DB9553DA14F61F4 DE1661F4EE21DEBA7EE6C1AF93B5E39D4D62DA25AABF976E123729E179C854E1 05758615D55CA3A5D1D0157087E4C1E552447D5E6CC3E6A4FE56324FEAC173AA DEAAE68536045CBAFE56936C4E5BC93EFAAB1C4D772BD1BD6763B88E7BAC55EF 788800CF7792AD044868DA92AE846F7B1622ABB9A8BD5009FCEBC54A9D196805 7DB67FBDE3367B8B2DC9067DB6B78A86EF1D312BDE9CD970DF71ADD5BF079707 C00FAC6CDD7DEAFC6BAF6CDC4E7CD43342BE8E778C90CFF10F847C91ED440564 CEA020E6834135B1AE9678E6A244B602CD763133EE5AF7F305766AAD824E7168 85B79E4D0D14D1C8125A12320672D4008831909F14283DA580ED265640DB4A4D 49F856DB8EE531C19B4C0B36C0A54BEF07D4407F2EA33F401EE5B2A0731BF060 DC7620033D53F2AAEE5353C684E81529A1D697EB4763F2BB33D3585DB6278BEA BEDB5C8E464116671085B957357C7BB7C1FEE1D9AF98C2329272BD690552E0CE AA97958A21234B5DABB0172EDB60D3A3B9FFFE323FB4FF23E1B39E0E86082A8E 834E0243842C6B451639EE1EBE9D879CF577C34107783E026C0E7042BD010485 CF00DB980636053CBF011056A77F0FD88C65F5810806A3A3EC92C5C8CE1837BB C55E87006346122CB20A9B78874E451C2179F3D2C815F6439246819DD8428B7B EBB6E99D8EBFEF6F25937E818D41A4FC5C4C3B24FCBA734C26E4C82B72DC5739 920ED6EBBE3F12A43511CE6F017E1ED87C02CCB2519A1FE104BC744294A6BF9B 6E6F6FA23CA0CF1C71BDC0F4D7A3BAEC06715E54970AD4BC0DE23F38B01615A8 7D3CB073022FCC9961640703420DF68070FCCE1691F18FF3C5BA1BA85600956E 68FC0C6C66EFF60A1C5E41C38ACB83F8B11DA2F07DFD7B94759D944CC1348C92 29839601BF8E8394B92919B8EE50F51D1B355E1D5DB0C62B80035A60F79889D7 CB0E5EF617FF8EC3661DABC0A004C05BB31D8BC0709702F6DE2115E8F67000C3 01517BDB6264B241FF980A14F6F6DB6FFE5916C6FC8E715D170E876D7DE7344B DCB404EC380BBD7E9198940424F3858AF5DF6F0972EB2424062501F7498E0E72 9558AC8AD5DAF1D526A2396F705091EB4E4BC0F58D12181A81DC98A8E831D88D BF37C71AE0448C6003DC400FD2C0B5CDF753C0197255A3C4F2D5D5B1C4E60696 94C4FAAB3C491D9E1D7E29EA034C31C34EC2946A5F32B0E994F53661DCE62B56 EE3E05CAC857A4DE21C70810CBA5640061995107008B7C3AC23EA41E12BC22F5 9035D0BEF5C8083868CC544582252ED243D88A757A580585596005B2EA4803D7 9919AD95E33C8E1DEC080242ACAF210DE5620771E0A461000590C2783E4D0BEC 38B4A8FEFBEDBDF1804787FDE8B118BC450E10B6D655C526326811385ECE56AF 22B319BB88E7575B0964DBD0120C47510766DDF6AF378ADF2E8290497D3DF9EA E6ED5DE7EB1DDB9B16BC67AB7E4503502926C76CF5BB3D6440C4647D0CB2BDE7 50AB7FD84CE6E1E782D0411C180341E8664438A6AC9E0AC03D3203634AD66093 E9CAF4B0050AFD32AA92081DFA5F32EA301E38C0D7A63675E0003F3635A34307 785D993A7080AFBE16F059DDA77BE800BFE848EC2E8B1DD103BCA700162C5860 2FD8A2FB0F1CE0693C889755047F8103F9F6D9E207F2CDE6C4815CAA680FCB38 2A1901EA13390E8BB5D0B8D090A4B3180BE17BD0999115D80C3B6542B73D9B4C C0C9E30176DD4DA25310056FF2C7556369CC721B7328587D35E0ADDB95ACC18A E89E16D86B6E7B8CDD80DACD864D291082CDDB8D34907BF7871091BCA7541082 591C10C02C584CE939EA1F61F3B6B3736379CC4543268FB9D890814DA12296C7 946644F298A5D1D197F04745CE156B351274366B351674CAA51A49643A2AE0C6 88CC40EC640D100E21DC602293E1C6F1144167C855814466692CD129C32CD452 5A924745D5AD014530930628826946404D4A3362F7290CA43423F66E67D01A04 7C9FCC1DE7D890D9F166222F498069A7CF3496F5DB3B4846794C84573B8F593D 0D49A8C4B424820CA62511297D3F25D2926805A5255103A52561A5E1635F580C F0141A4332688F6B939E4EE37068E7016B3D60347A275FEECB4CA5F1C09BCDB4 96693C7C90A5568E4C47D2832C470530C295154AC05B6A86D9F438D81912B09F CBFBEC2E73977C0E12ED0F3FA7670D48B457158360BBD99BAB5C21C6DCB2FD20 DB837FAE77E81FDCA370A8A9599504BBE04151A25DE72C634BD0BEC0C30A443B 4D489C84C8822CC0F28D8464717278B49F14BA18E7E39FA7063CC6D66042F29A 64149D7FB2DEE2ACD38EE2D9A33506C59DF35FE2685D4406491EADB19A9D9290 47EB0E121A476B7F025A8758BC84D322831681615D8924C41FEF4A86C0851705 BDBD299B72AF0CC487AE7BABA7C2C3433337E2C53866FA05926C123FACB28A3D 040D95623CC8844A313632FD528CD5571340D04829C6064163A518059CC42A2B 0A3C89545654D170A0B2A2A7A07BCE0E5456ACD83F5FD1082051951579520911 5D5991F71947C4A6026A895B2B610DEB2E2C51550FAFB4D928093D2AD86E5007 FD70A2BA87D4951579CBD132E2E58AB36AD57DA77C7DC30EF3D4C0D98FADC12B 084F0B5DC4AA85DE44D6B0F354074FDC899C444779E11D44474F4DE0C2FB7A0C B0BB7E3E46F1073F6F97F716B6F42FBC1B70416FDD2F163A12438515742FBC43 7567B97FC843CAF187D054C458B13AB5088D9032AFEAD6544163E41A57A1D613 DD2ACCB8AA31C1AEC31AC8517219E92AADA1D51AA8375BF432EAD49B2D4BE096 90E80FCBBBF5B66C275E35C32E5E47E0A888250D4B15ABB4C252E2EB087BA952 9556EC9E362618BDE71EA3770A23A11222BFA06291B2ED48BE96E9206239752C 42449F6D00614728B9C811A8D2A12D01949D5F75D93A20FB36EB383CF176B6EE D12CECD8F3D4E1A1B7E3A7E13DA2AB6AEF79E9F0D89B77A2DD00D53FEF440FB3 BDFD63F5DF893B3BA19ABB199D1B77B6F15020EEEC04D1DE324F9EB0B54C2086 DC667B2286DCA64B2E86D45AFA27ECB24EFA84C8D88A840EE56229060EE5552D F6D0CF1D280D9143F9BED80387F28A160416FB3987F2CA6164EF28933A625398 E79DCBEE391127FAF44CE181F59382DAF8CE52CFB958EC9DFA4386F6E74689B7 CEEDCFE8AD595B07E42B1596B43B03E42B3DFC71B7F51F405307B4D2688A9764 6C0CDE92C9B854004B67CBCEE42B65181E814654E01D1D2D7007CA1F588CB125 8E872ED6C53D79104A7F6D9D07A154ACF316B1BC4D2795AD14EB3C98ADD4EBFC 7658E78858C96CA5D4138C1AD59A0D448D2E6A618921760026DED87E4EBC7DE3 2AE7FF3159194B0A07A2C6ED406D8AE0232879171242D3DCED4F36D02C3A100C 05A6B9DFE1E2D01AF27618F87AF860C733EE969E40538D74513465A4EB673522 BFC3552E8CD87ED88F12FFD9A9BDB429C8E00DD3F927FD9A3FE977B40490E1D6 45863A7FBE1C3214FA114070D5504101EC6DFBCBF6E3CAB5405AB6BF35ED2DA7 E278604B1B7656C621DF091377803A968E5787498884F29D8E124006B404D739 EAC06C1E6C34919D49254859404CD85882544CD87E82B4A809D26FAF26542CA1 2A4A375C9501B09561FF00B583A0628642DDCD8664827490156E62B0E9A98118 8CADC1E3296BC1E3E97712A4D76C82B4AC73314B5B4AFF82ACF640E81764D5D7 0CC6BA9E1622CBDA87E80E4931B53D25D300A8000EAB60011E55B17F5ABDA288 4FE4585F144A47994E12D8839900B97B046257BD434533A4D2FA6086D4D1628F EBFE0043D05DF767D65B8F013E09ED3A42452B606F23CE986C2445B3E9A2C9D1 60AFEE874864046B6BDE55958D1011FE9EE6C17B4A6C5FB125B4E9B00EDA73EE 54A2C27395450887BDE631407B9B97289A0FF7A6796634366CA2B1366A62EF36 684E508D03B79549147B0B71B3A71D6442CCF7499662D39474DB4193E4B06BDA BBED224783ED24B96E9A2C136C2C724EC75E0E2989D0C321B9D202EF86AAA7C2 C13DDB0A3BAE7134D847C47B21B4C01D659222B15A1C35897BF552D3B83721EE D126E1E9B0716FDA8F33120AD855C94A7753AE1411766F6FBB307A3ABC61EFF6 1A15614304C854141001B222A380639AC142E2E4931F19C784804F464A21E073 34805393C0F735A6348C3D7330367A2AEC031A5A4130E66880C3D9902A42F965 99DDBE6C1BC4C149588007F6067A2568C3DD83BA8718AFC2E8C19DD4BBBD273C E42BE640F9C95581F1EED9F18F38F90CFDE293D55361A31D5A41AF7450035E0C EC932EF47A7B9F4381C7DB724EF4DF6EAB6F1C79BA2D6650FFE576E5DE01B6E4 4BE450F4F5906FB003B055170B52B0C52A60959115F48B854A435FC019121DBC A4D1A170AD2A1DC1704D1A1E3BA63E3094BAC29E20779D58DD34D641BB822895 1A08D75E7DD8E74E278153008829B9490AEC92154FFB2C498B1AECC5FC9E5797 D8CC1F8A882D14E27DE79DB6380FF783B67A49BFD31E951DD177DA8E16B88A51 9580A4C435FBB23B447E8CB8F7F55953EFB45D15C977DAC809670D9488FF4601 C96F55AD50C5214EAB5A81D620233C5BE8A233B0EE7D47103D453598187AEEF7 1D31F44405DDFB8E181E62FF446384C5146231460B2BE072EA2FD8C829B62833 221263231139F87AA382CD46724E2247DF51734E82B57F640E2894C3F39404A8 78A1E3AFA703887898F8431EDEFD1B287ACFA2E84B2689A2A55513025E6F64F0 59D801B855795A883C9E42D15172A9A3F5CB93289AAE5F9E41D182F5CB03E4F1 18EA56884221DED3CF7082A85B5351E8A854C47287D28C60595DA77A39B8AA24 31F4AA03850886969CC8F20B53692D4D9C143AEF7B4A80BFA7FC75C05D337A4B 63BB332A60F16198E406BBA9408C96B877E68AA72BC90264EF43FF5CB949DC40 AAD49D53B8498ADC0E229DC36CF43776E4493390E62C5A4940C21F16956D24DB 91C7E7E8F062E3786E54702943C95151E229921D9554CD487A5496BC8BE447B9 7FDAC4CE8F6E4B13DD9E1210FBE30AD0C94F0988DB80309629FD56783BE57F6B C7BB40878DA9F3C339E6A9239F2450755602E1AD9EF7B1F036FD3B133B673A10 DE6E1FF1A8C0AE3736EAF6917075CA84AB75FD01A778B8DA04B8C1703575D35D 741E42A71AB3598550723294657DCD63CE4478E7BE54CE94590434AA090F1C84 88F801294380DF0F0EA2ACE18324F174158DAF3FBB3ABC6A5CE14A2644129748 DDBE3B844D478B8448E2F7818D013FCFAB3D5346038A9975D67A82248EAF5AA8 D82FBD91023CBC8E6000443EB25A6390248E228CA18A311C23638B651E24894F 7BBC177CE0A84A621C78C99D4C44E4B9786D966DF0B9A29609BCA1D936E6C41B 9A36B1A74470E351CB568DCC5EE90791505DA209B5F82B1DF0C4DDD933E8D8E4 9B83E8E8BDCAA65B3BDC1FB8F2EFC8C6784179E6EDB714E8A3635917B1256053 0455FB50E50DEA9FB27CD94A1AD43F1DB37FA492C6553EB9F97DEAFE0EA003BD A5D66CE47961F1DF3EE33A57323138CDD60A3E207D081B7973C02848ADF30036 16BD6C555D3CCAC6DDEDA0E653C0D02CF4EED3EF6D6F8F3EFDF6C2328AE029EE F30278EB0174E800167ACA5DD73D3DFE94BB09B49A139877E0B61FA543726D22 1DFE423FBECCEEECCCE197D91AD8432FAD45DE43978AA404A468AF0604B76E7B 181E683FEAF69197D91C54C5F269511854F9B460410BA76E06652093216247CB A70EDDC59329DBFCFDF583FA370EDD87137428ACFC814377CD1EBAC7B30FDDCD 21BA7BE86E0EE9911241671FBABF7182AEE913F4E89EA0DD6B90C433EBEA9EA1 FBE9CEB30A51EADD36F2D2DAFB28FE0A8C3F9D2E7AB78D95AE9C78AA1032AA2A 8C0164EC9C3769DD162513AB3FE1A8A1FA1395ACE1FA13136B019FC9E23FA1D4 E2402041DE921A2287612C77044443285F843F24011673C91FDB609B1EB3DD21 E75051DC50440FCF255F7C425C83C4F28AAA9044E8F0ACAA55F40FCF45CFF245 A47F10D6E56C8232CE799390548D2D58CF67623554CF07ADE17A3E680CD7F3C9 62637B460F26167F001B5B9FC50A9E7FA79C4F1E4E4B2A17F9D29B0D1A4B2668 7CB54FE616C102A6B73B29871EA844CBF98852703D785C7FDC2523721C5830CE 4C226AB978A579FE2B0CD6052482573BDF3883DF9347F0AA2A61C4B0942DC1D2 16C92B9A222AB1B4391D3B0B79A7BB0070ED5E76260608F74C0AB25CE0B204AB 1738C5C0E8031C8DA58D0C6CC50241E22418CB56621E113730A52392AB14E51A 625527D10A3A973B46D8182B6A6C842A48EE05422269CA22FA8F159C94ED0359 4D5151A45F3E52551489E428453594488A320D8EF527C0714C8363692C3940DD 7F02A7BA5C4E302ED577E4A123BBD612C94BE68BA3B325E42DCF90EEE6732C26 DBD97C2257E3D90B30DCDCECCD47E2BD6A0EE524682B7480359EEE445B6D20A8 E9637D4DE7EE848E58085ACB3EA858A6539A114B740A336279CE69022B784527 8B6F16AD2314DF4F544614CDB8A30A3B638776E3FA67B3ED004872BC158D1EF7 A22AAB8D84B8FA55240A1A4C72E66086A9AF340C019C748CB0FD54E119071C30 670BA2CD47D9BCFFA8440D66E841E4FAC18CCE6DC8B30DA554A63D704A648A5B 94C798C4BBC73DB22405163D87EE8A2C12ED9E8705E9A3E3D7E409B497C535BA 476D858C4DFFCE16B2CEE36713173A536D9578DCFB91A45E5CF367EB2EDF1BAA 803887ACA0531E1A41E7BC2CCCB908011B8802A15B0B737F2A2EBE23A4C04F11 AC317002E8F6DEBB40B706BF41A0AB30723AE3D1C09DE3721CE88A8C0C94002E 632910424631A4003256154944904ED5CA0D2415652CD4473A7DAA5318C12B58 9CB72248A7CF5B01A4ABEAB815433AB20217241B619FE7940D7D01B9C65E3F39 54C59A74CECA6BFBAADAC3F621FA7FC8F680710FE8DE71E871F4B471C0E069DB 10CF9796C1F72316C1FA983574CF1D4AC75549C0B6E10AD017B3C7E440A365B6 8B8EB6865E3EF1FADC5F21E3B6B167D86E57F968D9C3BAA57995CD7BC9C126F7 D84D0E6ACA662F39D8F4DE4F0ECE83EF32F164824C49946D111F744889EB41A2 934C9C3F58E6A2A551D1BF6769ACE8E7051B0D765A5095659CD74D770751B51F E779DDF594D6F25022E0AA072B817A9F680939CB33C4490B9A1254A8E96EE37C 203118DB47EEB44F39D96CD847DC4C5FB34BF5327D4DEFDD78705E3EFDF4D51E 1DCD93BB9B52131AE6E5D3DD139CFC180C89B35DB0B3C9DF5B8848B80932F8CA 4FDB6CDC491E8F94639506F5E96844CF8114D84734B200ABCBA201CEB2CCD497 28FA97597AE5251676444AC4185809FDC64CB2765A8362A16A6BD9626BBEE9F6 4E247F7925528B022A4504AE50429528E0476C02485902752870F0367BEF6157 12BE02B08AD513ABF42B9667ACAA82D410A9B026D6675B1A02AEA4B8C8AFBDF7 08135A0DB6939E54EE9BBD944C7E55AD23528EE7595185BD32D10AE2E7292322 D57B1CAB6D6C7D64B1B529271EAC729E06CA471228AB634928A48C5539B77F6A 825D95ACC0833F95E14CC028EC15FE610D7B5583B18492682B30C265BDF26085 F374B11EA92356E15CFEBE5604FA74B5F23EF6693322E0F78A6665F9874C49A0 14622A3674B08499D2D2C7CC972D5994D512A12AC0683B3E11764CEF729A23BF 82B37DF6301628CE71A052E4785195254395226D0B902B8E060051DC6B8F1E5D A7770994896C966BB44C64BEE8E31395786C71CB129F2F6EEB7002A2C3B5126F 44EF9D227469257A0F547C14C83F5B10DF8674F39EA581F2906A4FECF7DEFC86 570826D52F6CC57EBC305BF85CFD4C58E8E773F827189D23781CEF9A1F793C12 128DF5FC8DA2E73F70042FDFF961D874C1F37CBDF3EC115CFF2261E807122958 84FD47F41F89452767F7716F4F623F904883074E49F64C2D2B47867E20B16663 D19A3C843B55CE01E32B9FC2614CF256ADD10183CAFD6C4E9564A3A09BAEF697 73893AA602874E627E06B8BC460380B92DA13BC4D219398B003E1A398D60EF27 2367056CFC1A3948B7DDE41861FB698408839C9429593DCADEBBA49BB20CDE68 6D23D708A114B436EDA4DF45B4CDA4DF1CA8FBF28D7111C7FDC624C2B859BF52 9871B37EA604E346F41FE2168EC8E8B13D24E7718C5B3832F10F7602A923C6D1 51121136A25C5D018E4E65BBE96700D06CA4952471AE9E8F736316E7EAE938B7 FA294A2EFC9A4CC0E8A3D9BA370F7111F7C14448D7250374B6A1744AA3810371 6EDFB4FF91AE4D604C93AEC5F28D51114726E5C1E62175C448D72505738E1574 CA728CE82DDF18B3705F3311464851FDABF6C09B13CD0344C47D95058888958C A53D036C75778C041171FD5A092262A323C22B944FC502BCC22B5B41D5021302 CB0F3625358C9E9B9C171751E662118F6F64F3B2AD02137BE344C77D307DA2A3 DC93024447D97988E8282CED131D359F3B4274D454E8186D51EA08D116259F3B 445B442B08441D239C876739DAA27CC411A22DD6464B9FB6A8F79B186D912D41 673986F4C9EC111222B2CDC94F39122272E561C5654888450DBEDBDCB11598C8 3B9446388BF572DFB78318B54E6888711665D9C60067B14A0D4106A23022C640 2423F8A90F5A0D7B821408F955E4320394C5EA2870402F4159AC29CAA2DE1ADA 0B002F059DBBFCA8C9CB0F8DDDB1AB0CB684E24236847E5450DBD197503023AF 0F860048EA5F39EC83E4A07E45B10B92BAFB2E48EAD1C3E1CEF989C6C4E5073A 072E3F9EAE738E39F467F226E3E979C7B8C778C21EA26E31BAEDF9D6E3E9F9D3 48433DF1D2032E57C1A18D86410A38D3CD5400073BB0E0E1A19DD1FFC35B8D16 463CC84588118F34D63DBC6967ABB099D68842B6806B7612196DC756000AF02A A1DCDD75E901E4EEDE166B749E81B87B3FAE537DDB7C380910922C7347BFD888 88ED0110C1910888B62719105D5F1A0037D1653900DC9404B829728C95F830B9 0E32006E4A02DC145889DA029BCBA60CE8B6F70CCE3C48067FD293DE1A58B7E2 D05453AF912B70D7EC91576F2B35FA76E6D9387309B7713FC6B52D6DA3D3636E 5E65F32B7BE5F19C9B5F9BE6B8C65F1FCFE81E41E7CBD650FB51B77F04863F83 42BDC6FADF30E77E7B05405FFF8B99FB1C5FCDC7A639EEB6A52E4FE03ABD6F11 CF6D9A69A22B80F79DF33A9A6E1BCFD2DA9EEF2B1ABC9AEBCEADC36695D36CDB 7ADED3CCC28E7D9A1D866E41C13ECDF4D8AFE6D1661E7BB4B99E9587D110D0AC B34C1B6BB5AF6A96C5FB9F67D9F57A8FAEAA799A5D6F436FD65739CFAEB75B60 558989B6D13B63136DE38EF244AB72A2E9CE21D33D4F85EB71ECCEAE59865BCC 371BE244DB6FB65EC7DCB71AABD93F9D22CA3499DF8A732677B37F9A6B8FEB11 C09D4D73714F7C7F58DC730464FC5CB37B8EFDFBEE396E40741858DC73ECDF5A BA73FFE3CB3F5377F7DC863FCDFB43D83B8F797FE8EE9EDB4A19AAD53BC767D3 61ECCECCB9CE107EE8DDC0D862B75FC762CC34F59B54F3EED9BD9050BF4935EF A0DDEC9CD672572236AB40FD98612301CF8F94C4D84A58CF3ED0767C1CE3986E 87BFE2379CB6E8C14D7D8A1F89DA8213F70A43F65F647B78C1B107B5BA7BF2A9 397ACACEC1E0293BA77E46F46B4574D3ED2F1159525FA7C34D0F95464B40A419 5893E406BF8A1F753966DD0DD4503FDCA407659F2FA4E5C7BC3B7EBB2DC5A26E 27F915915C43A5B9648DACEDE533F66E1BD5326AD5D8793BC71A7C75E51903AB B524D1F0A5F60922BCC64B1E404B0E405F1E49C3211AEFBF6B8BC3E136ED0F80 D279881985C351F5DF85C3B22E2AA339C0A1681E414FDB5822AEA1AD59F4E489 97454F8D53A740A136440D0AB7198242DC68D250D8410FDA6A34141E382A7F3A 7A8AB29A8A548BBB4D8EB32BFB0FBCC514D1C881B58B3E3A8C9EAE7661F0F8FB 5AE2473A22EF85BE34DEEFB6042F6F2911AB0A2047D57F63F4659AF87192E323 23734C587700E21C36C2A69E891FE59EA9B5DD2D652F79F3D03FD2ECF9686EFF 544C38F2D05E22B0F46979A2F799DDECEE116AF0BA77FB7A48FE6079B7F93698 D42391C5DC14195A6909B1A18B7C441AA243B325F89B796888BFA4AD2713833F F7AC471343C85BEAE907313094258D9280B71A4BEC5B236D485FC237DDF3AFF1 608CB693BB85F7C83490DD0FA2B937058F9DC3E9CE1C3AB13068E0DE223D3E01 010EC6F6AD4C013B99AB04EEAD40671B916F406C676E5FEAF846034CD00AE423 10A4484813A4069B2151D1026F1BC9D6ECA60F17DA6C1B15DE3A36DFE2D0A244 236C7A9AB2A12FD0404B90FE57BC427F11988CD53250381963003AD6F0BE9266 F495875DEE86E7E2832A0E90B784862150D1A040213F8C6AC002E23E2B030205 B6D860C0CC07C4B99C097B60A04BCBFB81912E39355761AB2A15C10A5BAA1EE1 AD954057D94F4DD1571470749C152F04B359127FD15A1A1DA138086DC7A8064D B71777D53A5A08C1F5ED6048C4C31A10EDC0B1F98EAD9A80C7629C68D718D875 249C68CEF22D85A08E874D4041DE2F0028468F367E12ED17866FC78F95079F03 438EBE000B3BDE89D3A211097D071940F8C00D068883B680039C8F2C6E22F117 B183A35A424D22FE2268DA3CDEEA599104402248C3CA71BC642E1D64F2C2DA21 022AAC9DBBBBA7049BA3B177171A6DF22F6E2546713D64F3AA85D6F085FB518D 2A1248DC68B570B48AC05A9656D89C5EC7089BD48B1F0D39BDA2BDC80C38CDAD D400108075EF93680E3754FBFCECB6D6B35994FC9B02FB8C282848646A393D55 EF4944743C09608234354444A2002322D66C4C58E9C0C746788868C650CE892F 7B446EE2E1E0B33A278AF48F358963B51B1363E6C27340379F182B592DF272B1 9AD55243E8587DCF1CAB8BB62072EC058BFDBB9768FF5F7F36E58ED55F7F3BA5 8FD5931D4B82535F83E263358E8ACFD5382C3E5813A38DCA183A77D0B94BC371 BDF34CF9B7C237643BE051A57F5F4D7786C8CBA33B430B72D96AEFA63A47DAC9 B21E9B5BF7006967BC7C92C38809493404F391C4027427A14103A48D49F4DF6F AFC75364FB14E7D17E915CD95AC0CC93398F9AEEF28FC0E8F9AA34AC95B3983E EDD802B49D66DD45683BAE073E46DB79F5E1931E2D44C8F2245F22A7931E5F1D A559E3A7D324AB6B3A20EEA934494DC38CB0C6FF36DE63B978AC7160F2FD8798 8B9B539A29390C49FCFC3A683BB8462B5BA989B11E879283CFEA1983BF83E4D8 024B755612253D96D58E68FB51B50F9124C578BA24C9F5E3053992682C5EF5D8 63C7ABB161AF691C3CEE0CFBFC0E1E77A48E10E371984805A01F5981F8C746D0 227DD7DD8E311E87F72F0C04188F55F6DF673C6E1F21CE78DC7BEF331EAB1C7C 88C23888B2C4410AE3902C5B5DB496238511E75D8AF4381B1E273D56C7765EA0 643A9E05A58E08E9B16A4322A4C7564B88F4282D095CF657D712F2161BE2792B 4A612C722929DEE03A799D9517623C8AD1F4188F6AE175198F6429321E61E090 6614881A603C6E1F2A4360141A42044601D93102A3501023300A13FA04C6A214 F4DBB3C5B1BD36F69309F4DD3A9097213C921578146323027817E52F4A9C88F2 17959ED8458B84BC207F91AD41A6B7322620E2DA8F4009BFF0C74931FC893F5A 50F81B7FE05DFCCD3E389BE16F140204A20110D8247F24744B3BA482E3DC8F84 6E46C4298CE5A27F24B42F315ECEFF59D1EDE325488F9BE939D2A3D212F9F53B 95398AFDE0275A82AB150D413A9ED2D1047481846194F5581CA220C1A8D253FA ACC7C6FE20EBD1B3269003FC354C741C962431DA90882C3D1B113122B4874FA5 4BD5E07BCD1D5B73E809011B83278790809DECCD14E7B15E100791C248308814 46C20E26E71176705C4B1888812A4120D52E4574A2DAA58ED949C4A4DAA5B0D0 B07829AC3426E9D94B0D297AF6DA4112A33D7A2431D2E0BDCDC4A6247A7B498A F648BF29DCF16898F658F462EB0B34AB33C49324B391AE475623616FFFD021DE 63B172C758F854F61E60328A391A61328A39DA65321639F47E733DA523C44702 14AC7A8A8802C447074791F848386A131F9D98D8263E3AB088C4470CA3AAEDA8 AB134681A74A4E64F9DDA1B496D6161978F207A1B8D3FE22A5D5A1246A3250E5 8FC8A6F73737B1F9C027C4C8ADE3D9C3F663BB750BDC8CEE53512A55F9C5C15B 48E06C6E1E4F22CDA94C9EF37528193BE7DFE48FF0C5B88BF23A3CC2A96C884E 014EE5F80304C99A2548BEFE12BEC795022CB7468A7598746BA45848FB03551E 4BA3E594C290639A22D9D2304375CD1CDB531449C81E55620D76FC1427ECD894 474CCA1101D323E69DC390D42497B3AA4236F01460EBD4CBE7EA9A7D882159BF C1901C7F86ED585AB6A316017FFD0041B2E609924D147512DBB189B76350F817 72178BEAFFE32521B7451884CE4AD6F2123F97EBD80451BF3F5BFC73CCC5CFB2 C5F9DEE7AF668BD70B944974FC756291C7720917792C4BA09CA9093992B1FED3 9A20DFD189FB4345A782A7975C8547E7F4F2A10A8FBDD30B6A48F01D53151E8B EAFFDEF01DAD199A2908B97DB3203DB25ECE2C08B98D3D418FDC3E57821ED968 39A5C263752CE10A8464C8C72A3C968B571871F5B16B7B901F992C0AD97CC553 8A42FA86C066922AF1A8D6D2A74B3CD64BA6C4E30843FF44894705489F2F08A9 213E408FD49B489F1EA9B7A9183D3257DFB15E72F51D47B4E073F51D2B7E87D0 567B467DC7A28C38A320648312217EE4F6F19285287EA0BE63F5AC0981DE29F5 1DBF7AC6F288B4A5E40A42EA210D5D76E49759A71684F40C804C58B2C0E37839 BDC0E3F6D9625CC7F578922C09A907754E49C872D9CBB3C424C60B16CD2150D8 4C4FF029EB058BFF3024248B487A96E021305912B2D1715A49C8C65F4172E40F 94842C8D3131D8CD5691640C021F6F5F32CAA74410FD4851C84AC3C788F3D4A2 90F5922C0AC9F0F9A1A290E5A2A150F11D93D8F9A1A2902D42F519950E0C7EAA 2864BD248B423A18F8A1A29045CE6D71E0599CD459C943844F99AA21894BED23 352471F4369F12432D9B4FD94CEA724651481D6DC5C88E2717856C62ADBE8063 B55FCE30C88E549FEDD35521F58CEBB223F57C8ED01DCFADF358181F8091E720 0AD3C64EAE0C591A0D9F2F25E95A0DF9B41F2925D9C67881D3781316075F2BFE 405948956C53474D2E7E94AB23B9252232A7F1541DC92DE99C78DB98AA3BC916 FB373C89B78DA7D791ACD93A92E38FD491ACE93A92E30F701E8BD6714619C931 5B15B2B2DDFEE5F64758929CCACCB2245B2D67501ECB859998F38EF9813A92A3 633ADEF69C5A4772BC004912AFC46C92A45D1772E4D17F80F5581441666EDF5F D5BF254FB25C14573C48943C9759A9495127D59E1C7D320DC1FF0FFCFCAB6BCD FF194DB2345A4EA923F9924893CC4FFFF1EC6DDA4799951B63F91F53924EA10A 0DCF29249907D0EDB37D020E3F44AE7CCDC6210D873F5116F2ABA12E0B19E299 672B49B6030B01E8D99524373BA2CCCA7A4955861CCFAC0C5969EC7E1DB5D499 275919B2681D5A027880B95292E325594AB2B2D9089AE79692AC975C2949D5FF C74B49D64BAA94E47839BB9464B9A8925C27559F6C0616A0576E9F2D4EAFF48C FF542DC97A49D7921C2F3F504BB25EB2B5245B1D67D4922C8D8ECF579F54ABAF CFAE54AB2FF203DAA79593AC38706F5D67F892B972921AB7437CC95C3949ADE0 847292235AE0ED0CB9F290FC1D42FB67802FC9DF0182B6D133C25B62F39F8DD7 75763E565BED0D624AB41F55FBDAB6479F2EED1FDDFEB7AF06FDE3BC388E7FC0 F1D8E31F683CF3317A9C5DA50C705208AFA3FAF49825B409E5EAA4031ECF59E2 7A90304735E7AA5F13C054620E6BCE567F61526B8933AE395F5DAF512D5B32C4 12B9760676FFFAABE5941F9098AD7F8E2F8951488025EF6448A92F89FB418213 2EB769366ABB8D8F78F8B54887BB1600545E132E738197E120812A96D9F8E614 AC12377860BBCF46C30CEB242466636BC715F26C62361A4A4C11311B9525832D 52B6D918176926B01A9823B2CFC6EBF5AE10C25F8CF374BCDE868308AEF8653E 5E6FB7BE966642BEEFE53A037B4FC8F7DDDF2A4079C97D42B62ABC09F9B85A76 C0B6BC7C93E1D67AEBE93BAB5CC7F6933C3B0031565B0756328A4BBC47354DAD E94F7B61BD67E3E36EEB384CC62ABDAB36060E0C17C367E72AF80D39576D0BE0 DCF7079C5D65E8E8B84AD9F160573DDFAE523A1E8C0E8F3506384ADCBC953E4B 4C8F5600576099E68DEA3026DC75E6E570990E66F3EDC3504D0D4EF984E96803 81FB8C22F30E72D480F1E49636AC53E8124595DBFE6A1E2936A1F47C792B7027 A2CA8D376A02C7626D0DBE58D2C6F4453AF6774FC68BF143EF9E7F3F612E1A86 D0E1661598029729FBF1B851D04F7D490B30E50F06F00F41C913E6A0EE08DCDC A04565E11D5069999448FFA87CD7771DC00A172A02027A4C773D242FAD686AA0 DB14B92C1EF2CE029CDBAEBE59D72AC3847BAD669022813461A324B2C2A529CF 489AB0D111487CB5A6C36683C0D349F258281274B00451DBC14D7E3820E1A16E EC9348DB6DBA7EFBD9A50E9BAF8FF8C97BB98D3EFCBCD7464FCE5699E089EF3E 68F4D6FA2E3CF814D262D16D025A2EBA4D380B7C7D076691AF0F280B6F0874A6 ED3E85866483268F084D082424BFE3A6213228FC12C0CB531A84C0CCADC7C56C 983D053298470D87A55C679AEB765CBFCED9F36B37E014F98DEB9C9EBFBEE32D 72ADD2F25422B0174D132A01E0434B3072740CB1F7A2E9950E596E10E5950A72 C565FB67DBDE70ED3498FDA35F65FFEA96DEDE7FA66BA2F9A89AABD1D8B80AC6 12290F6DB581723E755DCB9C287BBE72F3F78E2FAFF7B7C0751876013C14090D D7E126056CF75CEB3EA2AB6A6FFB475A705503B21D240C68FAA7AD649FCDF3F8 BB2BF929040621002E2A5A4540420D6AF96CFEC25F3F9BA5C22E9FBB7E36CB6C 5AF6F377B38DB0C31DA9A10116D87CA4113184543AFA00A9AD08E063F5AC003F B111F65EF25BA15D3D15BE9CC1DB87BEB3E16B4CC2D7FCA756F32BF1C16C30BA 62909D03BB97511F013B589369B0AB79E82A0555D0592D055DD5B1810E6AEF59 2A69794E2EF1BD08029CC2A2FA6F57A4B919ECCD631444B373BAED376DE5B421 984A9E7CBB5E61211222F64FD56E19DD8D721E7E62B2350A2863681B40F886E3 87F0ECF67EEF1260127EFDFB661675C4D52BDB479887623C7DE6619D6FFAC2CC 43D57B84792806DF671E7E0D66FE93C5F9CF2112C85D1746C52CF1B847E232A9 63FE00FE7CDB3E9821403B8012B87703B9CDA986D918A0CC1FCDB4DA3EBE490D 01013DA46655BAF334BEF0ABD6310556BE34FBB8F43B8E6DACB0B719C708071D 0FB8EE9E3B329B4C6E8FB177010745ED2D8630D4D8BE1841EDFDC58F97E6D575 77E7998A971EF7407428FA7F0EBDE050467B3360F9A3B9AA68EFB1B71FDC4F1A 6ABFFE2253AAFF517A478E9F6F954CE70CB4793DA979E938537E2A1EBC3D1590 AE6CCF04E62AC3E06D8CA5B1DB2740B9AB2C99FBC0D67515224F2112DABB960C 7E2F9B28F7C7560960265A82A0E91802BBCBFC27C74BDCCE361FBE86AE4A43E4 1A7AB1217A0DCD16604A0B0D00549C16E6D6B2F05F29F9DEB17929A8B049DC76 093EE6291D939400B4982B432C02F3DD4527EF2715DC55FF70E1244CE8B7D726 EBF140A82EA7F66C70F730A3D6CFF6D030B148E74FD78F6B1EA004537F22B0D1 964442C6D6907E08D802817BB66148EBD91E444139B0180A4AE36328E8184F0E 6643BC3DE33C141C9328584F4641CF006BC196B5FFEBC2D28BC0E62ED0C0261F 5B669333B0A975046073B13A0E9B528184419B87539509B27FA238310C0E9163 B6468FC176537160F018CF2DB5CE32124608D50C2B10DD34B6DBC43C6D7A5FC2 77563F1E92EB14BE072ED4670408C44225F20DAC539B7983C11631A170F09E73 2CB88FEDDADF08AD1BC00F4CBEE3A682701697F0037E0F62711B3209076691C4 5EA4792893C8BE551A26290007BBE99D649CF1ACB30B89EEEFAA772F6A347AF7 F6A043F3EBA7624C0F2F3A7BD09931E6988E31EB4FC498DF08186B3A601C7F20 606C83E533424C9DAE0F8498EA3A2018620A0DA183F67E2310E27B93057CE340 0674D38F9173B6BEAF0DC48B8D8648B8B8B36B6434C7174A93D99E1790683F05 C62FEEE375FF708698C85C1A4F4D3A5469180223BA930258CA688143AB31FB07 5EB7E0EBB550FC1ABFB18E7F4FB26269C88A11F6CEF9F4C69AA6379E4D57AC39 02CF5FC63F2C9AC0F379C64F96B0589384C5F174C2A2C77FF1769D13E98745D3 0F0FB7D684AB27F2155DA69F3757CFE42BD62C5FD1655D7E84AFF8E7B2B9011E FF2634CDB3B99F3676FDB1FCC6F21364EED9EA3823B27A66F3FDF4798CC89A64 44FE4D14C7222982CD9ED19BA1675022AB9C6D014A241BFC114AA43AB3877EB7 FA548A63912901DD1C72AE273222EB25C588D4E9C47318913A991860449E4F70 D499C4DF84AF58B48E5BBB2C3B17D567101CAB67763F85F87982634D111CFF12 CAE2627DBCBD22F17D9EE2587314C7267FF9690A624D5210FF9F398515C7EE5D 7CE66AE2AC5C80544D1CAD27541367A534646AE238D6F8C4C254819BBF8D5958 94019FE7E06CB7AB56411C3E3A38BFED44CB5469D1BF494089E4FD578EEEFA17 096043102AEE5A8377516C6A70D947567D1BBEBD512BE9A1EBF8AFA0ECAF3E59 18861DDC8C6DB8F47E62600B554D357EA007D678C4443006D27C4A4B03256EB8 9701C6D69A0030D6C69A18307AD678515C02184B0BBF4FB599FCC3D26D3C2763 E398C7C6FA1D6CAC808D98D4AB296C2CEA57EC62605A9360AA7FBBA90546D878 D48F37C580B1D1D307C6CD165003092CCF1A486279C6C0616DD632CFE1790CAF F66E15ECD990B97D95EDE756E8ABB9FDE3D01EE721F46F9509DAFB0FB4677B97 0C087D38E8DFD868CA381F09E7A1CD454B37015EDEE3EBBF4555EEFD135065D4 5987A8CAAD25ACAF366EC4435B89E5A8719902E56049C1DAA8B325B2C4B61631 F69855CB5CD4D8B24589ACBF6F9C11D906369B3FD7410E0D6CFB8E4B1D64CB7C 53CB1C632D7590235ADEB6CCD5F3A525CB5C3487B59C6F6689DA97187F6042D6 F4841C7F64429666429E3387BF31216B7E428E3F32216B76428EDF9990752F1D 5DB69FC37626E4B647AFB5A3E7C44A1F22AB281E3DDC0F22B845AFD5A30D2DB8 F9487E527F162B91DB410477F5B5E4B4A1C5FA8CC2C7CA7A5EF4F5F94B3E364C E12F19F771E330E34BE29EFD0D87AD45BA5B5B6C86C36ACB441EC3A9BF94DDB6 6CB136C8D596B0C83BD61CC8C938B0EBF5382B07F6D85EAF5B6B0111197B2DC5 F2FBB1E0167B2D45E9FD58B3CAFEE7B2F7F158D3E8DF8D1D8DF11FE661F5C76F 62E9ABFDECD11731E41AD9AA5F239AB7EAEBFCF8BFB368CBAA232EB18D6ADEDC AFE3709030FDBA78640025D6616756B26CEEDA7667A7DE7FD0C5D2820E5E7F42 C3B0C59CE6CB7F8F592DEB4F6818B69822F3FA9B77EA9096ED43BE766A2DE0EC D4BBC01012A8CB548FAAA83F3081F3D3B1E6A7E3F823D3B1E6A7E3F823D3B134 D3F19C199C9E90353D2175ACF9CEA074E220116BBE3328FEE947C641EF6C503C D634B4F4E220650B4CC977B4B5C44186968EC34E0A1CDF61F3A9B1E6FB4BC663 CD7AF98958F36D4B3CD67C7FC95363CD6F048E7B92321C386EDFE5BB81E3FBD7 3C974969057645065E81F62AD07CFFEAE93B098AB37169FF6CDBE3B107FAF703 4D35FEB93D4E42E81FBFDABA4F6B03DCC3CEBA4F6B153E923CD7FDA02BF13EEA ACFB7447C99A0BCC88A875B16EEDD278987EEFD5B76EED535FE4AD65DDDAF51C F4F784756B3FDA823BCFB6B53F0F22888AFBD6DE8AF0CEB3EEBA4AA018D3713B F7ACFBF4749040779D39218B9E90A74CE16FCCC79A9F8FE3B7E6E324E6E3EDAE 2321089B27391F8F618D858B939C8FC780033919DB7C3C6AB1B26ED37B3E2A4B 8CF9B8A2445C601B9498C0C34102FDFBB81E0C87B8A9AC861B1285EF81C5EF13 663EC8FA0385ADEDEE675F7E6F30F241DE5AA6093EBBE961F18B8386166BA108 17B7A600464C4FD761BC4EAE2398628EEBEE3A8CB5ACBFD0286DE13D687A82C3 78CD3FF6385327C438987FEC71A6CE59F11EF4D8E34C9D16E335FFD8E34C4B8B 35C51E7B9CA96DE1D3CF638F332D2DE8B1F5FE7C37C6E7BA3EC4CDFEAEC77F4D A4F4BCCDF188E13D11FC983032E01CB003A87491633FB154172DCB8386D992C1 25F06E9F7215189480E560AD61B6E22D40AE7A82022006A2054065410380C9F2 00720DB8A8AC161C259EDBD4B54D3EB26B9EBE4FD71F7CBF4A01CBA7DB475BAB 152C95693701601409054B46E82D405E7D9206FB95919ADEB30DEB547DFA80B8 4ACC6EDA253C376D12EA57FE2C3F15BD80B48A7691AEE14C5CC0189234DBFE95 3BC76AFB47EE1A40EB0B7848CB3F8C8740C3BF8D87A0893F8F8798F98838B7B1 C4E6A87B86A400D37195093777DF4F07B8C4DF72B3D1F2EEAEEBC3E8EFC41394 83EF35776CCD21EB9DF71E1B27C1998C93EC4DC049DB9FF5823839657172729D 6400C6E4EFD006004C699C9CDC5967AAB0AB4D2028D902AED9499CC45F10B417 1AB815575A8DC43D62ED54778B36BAF7FC73187D752343A3776F0F5967E9FB47 E8EF5B88C4079C55E2D64AF4D65AA3C383C655E27A9712DE34355504C21E6D85 4D39778CF096735BEDD0719255EDB0E3A1E529F65534F7D0EE5D89E37A1902CE 599B0FA239ED1DCF78733D43D56092B008AE7460B1B3820D58F4E79BA92270C6 D3562451CE5EC95E48E4388A62A298A75470E7CF3D5B49600B0948F8B6670FD0 B67FF1F4D941BDEFED220AE76917019C4F8583BC4661F0D61AEDEE228988B083 8FC788B0E3CF6344683B748B80A3ED9D083264B30A211D9487189207454607F6 E6805BABF3E1FA3BB356E02D65CB026B217B9FCDC3556B3C36AC0E002C03822A E0CA4013556A90808AC5D46B4515F6E6C336808FB07FF6D1015AC041D775FC07 6C01FF9444FBE5A79872FDCBD10BD8C59CA5DDB505BA45FA4536B6E31C70A28D CF68A39D821BCC250B5F6831F2B8425C071E1720556E58866E609AED45D9BD02 4DCCFA52EFEC1A232C43DFA8D527E3B2C8FA96A1A5ED9F22175FBFB95AAB7A34 36BCA2B976D6CCB1F62370E9610D6C4067C3A56703A416B1FF5F874B67A9035C 02E8FC30F855B2F203782621218067F54C3C1BB3785644F7473CFBDBE1AF9E8A 67EEF0ED531FAC0F07CCBEB3F6D40AB1B705B5426E9DD5E72C2876A36126E39D BD5401EC8C345B678219474977433052851E8899DD77A30F3D7E3B17E60CBF5D 80EB8F29C5059A4F25B28AFD0929728AFD9DA3DF580C43A41F7D883C64FCFA3B 87C8267A7867F4CCBE8BA39D1BFE7C02ED92D19B83D61F41BB74F4A682D553C2 BDECE9B89E1EEE654FC718087D24DC4B0570452C16D5185286F6381826CF89F6 30A2FD4068983CEACABDE6174343188ED86D74B007E3C168CF1E100D3FB01707 DC23435BDDDC66D7D1A7EAEDDBBA6F464ACB520F28ADDEFF2505BF9B147C553B B7D87ACCCD7E3E4D81826BF769F3070B39550E491214B148DC606260C1326660 32D6DA4203ECC3DAD2BF59CC8B56F0602F9B9E8F8E4B079DB418618050C74D06 CC0193B32A33B40EDA06F0BEB547C336A225725673AB7BD7C5C29217C7057F56 092DC19F55720CC9DE1D3BAB2F4DC16EFC75129FDAB5C606B7D218731605FB5A DF65112390F80A66098068F50A0D7D847BB5BF2510AEA20558C4160DB097EDD2 7F1CE1CA6A812D511C9B5398284615C2C4C5EC14260A15114CD466443071DB3E 7298F864B872379038266EE89EC144B6048B343A86D8CCB8C16EDF4FEA7F3A51 8827C87EB2E53FCDFCA96D5EE6CE7AD3CD4886F196A2B4C8FC1F639E0C261A25 8180455982655795217D09DF74C0CA3DDAD43FA74C9BC91ECDEADF53EE47CB22 C7C71BF5D3A4F5F1562282E5FFB5776EC98DEB3010DD4A9620DAA26CEF7F6337 B1EC18A071F048A4DC4C929AAAF948F1011050B305B66851E763BC13645C8EBF 1903F489132CD2FE0CB00D73ECC1197DF2EBE9E1F6E68C239B4B70C6FE259CF1 0304B0DD7679B30B5EEE5DE38C1EE52204DD9533B20778B9F7CE9CB1CE007B95 01CE2E0344AB98029A66B58103EA2E76CDCD638DB45D42418061F4624BFEA2AD C60C61BC873FFFA88451ED72CA1A1E61A47BD08D0755F0C5A53D6EED9F1225C1 6556EDC38AE07292ED1305413D81BDCB4C95E68EBB61F5508F6E6F2E821C5C9D 8D404F908FEBF0056E73B5DE853C459DF4F0611D505A9F2803EAD1EDE31099CA D7F6892AE0A3473B940B87ED507E88DB310649CD92333DF4533974485077E946 A6D4A86648F1CCD58B5AA9715DDE5AED6C8D62896A8ED3247890F626556E1C67 49D41B257C24A9A384105AB1813767BA8C869D5EE25FD852DE0F93243E0552CE A798A69A83DEBDAF772165E153FC1A600A3CC5E021765EBB9B83DBE238317608 85E466F8DB81F1D0EBAAD620F3EA680931E51C09F8BBFDBA7C1EFCC4F809EC53 1E24A0EFBE13DDF232877CAA4B162D2F0E8CB99B51012DDB8B2A438E5D687769 6C59A274990458CFFFA01A299ED0292C468AE762A26DC862368952A41A3AA844 2A9B8342A41A37AE435E8D2E95214786052F620E278BD9D2D5E1CA2BCF308557 6033FCCE94208719C20AE4FABC4C2E442A1EBDE671B4D5C8198EB522A46E1ED7 2085398912A41C7D3B66D8063235C0C3666C72B42D818FFD4BD864E04CA212B9 139BAC53C32196430FFA4AB746263D268DD0B92F99449A05FBC97E64B2460F91 043BCC73577AD8F41CBA875DDC2BF2C999F924D5AC262294F4D020A38C8B8DDA 8554B5F123958A43B5DE384E12171CC760C415C7718E3FB976C2E96DE4DA45DD A2E21CBF4186D8F4F899039ADD658B6E7D3FAE24FEC916B73EB4EE8E275B1D41 0FAB953A821EE8CF5E47D08333DFE91AD8E27972D3C7B1C711DECCB77E822BC2 C3D20174DFF900BA2A5AEC5F7000FD4324886DC050D9E3E06E1EFB8A16076964 0A11F7172D76D7915FAB426CF4151BD3BFFD248BC3E70F19C9E230CB2E92C5EE 78F2274034686CDC5ED3EAED058B1E63DA8EFBCD65EED7CBDCCF63B15B71BFE6 8A22DFBC309EEE5FFE958BCB7D37A28BFFBCFCD0E3BBFFCF272E7D7FB6F801B9 62AFCB157FABF850B3DE4407F723CC4DD48AEAEBDFE5F0522A042EFDA554075C CEC532A09E20961F2AFB63F9617F096A80AFFF1F66BB03CBB4AF3DD6E3837306 260FEF28761D3FE44262FC4304926F0EF47CF35935EF0948B59D454137F90A00 791DDD02167E9F3EC0450BCEB6A3665954175AA4077AB565CABC518B39DE7E3E 2E7AA36ECA113D07B24CBF4754637CFCD0B08FAA8A9FBCFF0C70A16AF6FE63C3 E932E3384DA66AA6BC4991CD71968C6051000EEF8FFA9CB5BF54EB8C123673BC 719824F13191EA71CD97F088F930F688CA92CF7318DB9138A9CDA0E7E3A83683 9D62F0100B5787F250681B1E2B10431CD487AD3918BC9A5E40C159CF11836013 27C639D07CB4CF41A63CC24E2066973EE7E04FEDED29F8BB437F05FEFA384F06 FE562C2FC09FEB0D55155D672239E1E3019AC2AAA248F2C95EA526460E1B4B33 CEA271AC3D9443F36538CF0E06154535AE470B6F92BA73A69E2859C6D2458F80 1ADE7A1C32D54441198629A098485EE03B313BE13D94CFB535803A4570331D66 DD4155FB62C6BD3E57C1BE2158EE0A44C1CE21C65F916ECA10BDE7F153E5C424 CE7D09CD6B23CD9B469CDB8219BA3C37F529CB4ECCD0A347B992E22ECCB0CEF3 3C8A9B90126ECDF39A1C5C3577C472E937E40A2B243ABB012B9CCBAC5031A47D 58A1C7F2C8A609691ED9C43C8F76397AC167A9C3E1085D9C6D854A9AA9FD7A0C 216D2D5CDEF068A1ED89CD6A3C47C212629BE6D7210A35C476FD43A188D85E2D 101D1255C4618AB08C38F8C0DF9DD8E303FF3BBEFF8ED2EA41847887E3F2DEE1 6661F09A2166B87A1000D9E178860980A6800758EC430780F91D1FBFC7D30EB9 6ADFF12CBA249EB936CC721C9F39EB29553D52F5C1ABE76B8F1E0B6EBA9AA2A7 6A7DC2713543EE0B9443BDD4B7AE55F56B9272A96F9CC67A580F9E3736AAB55A 97F5E783CAB3CCFE922568A3821ECAFB81363FF56989659690958DA6045EDCA1 F40A0CD364BE0D52DEA4EA8A7A1654732F777295C4DFFEDE3E01BFB31C3F46DF 57734E303C80AF6D3D1F45C3E820C65B0ACD6FC6D480FA247AE44E65E41C29D0 EDEF1D1298AB9C48406E972EA41077C5F40AE2DE378E0AE2F6719E5475F178E6 698046B23784B8833319F874FD0F0A92F2A99B704B7B3118C9E4B1CEA7672E51 66D4830775466D775068D4237B4CF3F6E85C0D8F5F770461D15D703B515D5623 C3D71D69D8D5EBF07547F2BB61128FA4DA9E1095624740E52D88F0215571144C FB90AA38CA193215C707D5EE19FDE263F89E912F3ECC97A393B25BFCC0AC6C4E B2EE3A330D6816E0E4573053D79BE4AD39FB70C68FF0BF913407FC6FFD15A332 651CA3B90F657439F3662C13791A1FF2ECC932E71ACB448EBC09CBACD3C65EA6 8DF396B491F6CA857820A13F124DF2019926A13F152802A2595B59A73C93D8BD 0FA962A5536AF118A33D87ADE89BECF6DE6DDE370478A37285CAE651350FEB9A 8B6C0E5A3EA58D8CDACFBABD3227AC812A5FC30AE871686D01A3500ABE9C025C 54AAC8E3A339BF043D469F64F350E4A8068F358EB235E9F68EE9D6EC66420FF9 FAA81C1308AA0E0CA6940A5A9D181C333268A9877CBE13C1344BE821D5BD0B29 75E3F31D6611B15C1DA9AA1BA7F277346B588AEA463D4D42AD377649C8F5F402 2405914FB33C3DD803AF16B09164A247DD23B1C48BEA91A842EA291284527A91 E286C7B183B1EFBCAE7F7B7AD2D74434E0F2D13A8396F3C1181B57F331768895 AF66CFE9C6B3689CC055D3453A4C020FED27FF3A7201266F861750B2AB395220 79F5208F91CA8B0C4476E9440E2107C96002219F049009846CCF02C8CCB58DAA 4F0A5507D1648CAA4FD2CC0C44BA0B10D4281F8FD01456288FB26D509F5C44DB B03A2907E60BC09F9ADA7B8CE95A50C41C4635F61425337C33327C9F110CE428 3AA448CEA43AC4C20B3D41FCC1C7A2DAC73AC9E3D81E09D4ED5BC3D34BF4C9F5 A07A9C5E12DF5C4BD5E3F125F8E85A11DFA13DADD04325A96F808C5592F28A49 3CAF112AC9A72B1D37A18B015D828DE32BE8E207B85FC07D1375C85DB8DF407C F7608B73952D3A9C7723B658E37FC88E3ECFFF4A94AE57281D92D66D285D5394 6E1F1238574960F7482019C52C908C621A487B1BBDF0A7F6DB8F9415868064C4 8E7A928CD85107C4FB04C69E232C08B6BE843FEFA24A82EDB56DF4FB2E5A4EB9 1C8A3FF0324C118B1DB50FB1D8518F0FC5BEF64EF6560F7C007BEBF04E24D709 7C0C6B6A06DD01447CB2FD125F2F7B6807181F0A5AE031F23D74185ED5AE7FB9 3DD5E729468E7E73E1DEE5987A46D52CA91B10AE7ED08506B850C61D0B58F813 6E9CCA75BFD58B80C8B5E108F2AC2FC3491D429F35C5CA5093358E7129EBC2D3 644E47076F32C2C5F3135F7C7AC8C70375092349FAA7A024BB6612109D353BF1 34993553DEA43E7AD1B3248E8773B8F838614DC0A23AC04DA1DC09860F458831 C675363E3E1ECE209C561566004EAB0A73F8F6381E4EC09B7222816E4DBA9043 C3936D0F96F89ADCBB3360D86F985E03B6619E18D8EEC05E00B6EE7983E53ACF 994852289EA109B70E68DD900C3E3D1213ADEAC312F1BCF9DFBC188307172D6A BB2301A21A19AA7792455C0D8FDF27048D58A7A87195AB0BE1FB842444C324F0 34A3273EAFB3E700EDB5F223EEA1B9EC5997F268751F64F6AC4A730493720675 A1A3C702AFED4F9952DE63F853A692F730FF542DE4A520EF235C6EE43F29C8FB 0A2E1790D98DE89F4B98F095E44BE8DFE84D82FEB96436A70EDC81FE390C8A30 7147FAD7D4E85BB34587EAC201C8EE6C71AEB2C5EEB045B209E9229984FC0F4E 65C4EEA23A1C10CAA90490DBBC933C5CCD32854B3BBBD50C2806A227580C741C F10A5DFD0E04095DDBD58D5B8739A36C93339C12DAB6AB0FD604DE2A3D7B805F F54807C2F69EC389153D450703DDF197089AE36F2960D68138C78B7611B2DF2F ADAEEDE5C1EFE49701D70EF2E0972146CC200F72B1FC2C3CD013C01DA872FCB0 BDE7719C717A7CEF750522967FC22EB584BB603E9BF97601FD05187FA965DB05 346B6A74D9FCCD723F39E5E70997041ACA2F082E89D4941F285C70F39BF2CDD5 E2686BC2BC94CE9E7173317D3DD770F05C4BCAB399949D9292473793F25C4B4A 7B659A6BBB5A99F50BA37473F7F93B1777E8939D93F88C407B5C9C536D3F3FB9 15B2276F4F09AC54A3C76B395FDE73F894D89BE745378F371E7FF401E787D1A3 6DE7D17C49E4B070754900EB387AB4E73CC2B41493722926D982953133C9961A 67E4B501E34BFBF15243BE9E4832617BC7EA9C4977EDE6E86AAF016577DF4FEC D1FDA7555C6CD6133926AE1FEB89171371B5598F614C0D1E2698B23CDC59D5D8 A58D95235A482FDC0D36C9C6627AE19364AFA3EF6A7E6385FC42660B09E604AA B451DA298608CC6BC32B1FAC8DF8E910469929DF5CBB2A7E68249564A760741D A771F4E8F56CB03D48B271747F339025CD0C88C9326226C96495D24E32FD46A1 9AD341C7645B13BF512867E3370A357ABC1D5460EF18A0980AD254C1B0636583 5C2ADBE3317C42DBE9FC6C337F8FD54E97E7B15723AC176731BA6A7E896C5932 AD4FE6D8275BA563FA89873AE066B886A3DED73AFC01BB6DD072ECB64E7CD86E EBB0C7B47B32D38AD67B8AD764F84C81F4030FD3331D66DDE19228E849938E87 A8A0A702354C004794E8322D28390042330E97B93C46B8A83867661995E6CC24 A3C29C693495E5D8E62CB6D88D3136589183D84045AE536E51890D528B4A6C60 3D95D8C078AA0C9921A2129819222AAF9969C5231B696597D6E059B0D7C3B339 9F295027C3C5C6BA17640AD5BD2053A8EE05D653DD0B8D8FD7A63D96D2AE4C35 657BD85CBBDA26DD3C58C8E9148CAEE3348E1E3C72C276AAED80ED54DB596516 4FB63BBCEB6C5A4FCC6B5633B4907BF59B56C49AC0E253337AC032197200D05D DA9F616CE82F241BFA0B50E6F98B1227181FF54DCFF6DBE481E3857C4C8C7F9E 32F44A38703E86F44AAFD07989E8958E809EC05380591ED8C729CA81B0BDE770 2DE36C428611434A66279C4DCA30DF6C5AD6C97824668EEDF96403B6D569E9F1 FC1352CD665B9D320DD9966D3DB20BDB789B5FE0CA232BB257DE665C9835F6E8 9DB2860E343DDBF35963AF0C423E12350A530DD080A8219E2151B393CC266A68 BD4DD4F00941A266070A99971D289B79E15EC8A3D798976DBBCDBC9AB63D41D4 6C576DA2F626B47D3726236C7B1D64B93C3AC4C2B6618684B0AD2D279800DE08 C0039440A30389154A08D5D87E4034CF7E737D1CFBAD0BC5E4F8A3F0CC4A4FF0 176905F88B551E317E42D8A61D4E09DBE40CB1B04D472C2354630FE28CCB08D5 DC08E49F18245E76C2D9C4ABE97C8B9A637A62F9CCF6D5E669F870214F5B0490 27746AC2F8844E4D452A233C13D6678467603DC9AB94F15173F415D9881D2824 5E76A090D6D93989A4D14E322CA639B6E7112DB532A1F0EC40C6A3F02CDFFEF6 7336A5F131B2C803EDD5B179206E3F488EECC5C4FA1EF91A236BA86BD3AE2674 6DC3BE13A9E6D4B610E9DA66B21D79A06DBBCD0375985473AAD7D97142611B04 0A856D9094B6B0ADE9A48C9A630E930E0E9DA54D0A7C2D212BE9E0C0763AB307 DBE9D41E6CA7737BB09D4EEE3DDBFD95C908DB84EDB1B04DA57CDC5C1B13EBE0 84A7A10EAEA3A321E82574705E88F21B37698EF64C2FDCB879610AE9E53C1A35 0CCB644C2C6C7356BE044A89A4A9AE4D42A9266D4F28D58695896473CAF6A8B9 7635216CF35C0D302C14B669129F11B6495ADE43619B7E0509856DFA15A4C74A 35B43EDCF9324A35097B09E878B73C52AA296C8F1A2B3362599B703192B575C7 411FBD3696B5BD0E5191B5A9D17FAC504D1DDF87ADD94BC8A982AC8DC30380B5 9BAC4D898E2295DAED77A06A3A3815D13D646D5A95E1CBDAEE1E64DB3FDBB3BD 0C6E0841D8DE4D87CFC9E6E059C5CADF4EB2B9EED8EC2FC70E4A380CCF052EA4 DC5338D7C959168A99BE6E209C832061BDEFC70BE750F07B2A26E23642BB4E99 85E7B73B0AED74DEFE68E55C27DBB11AB4B372AE179573F3CECAB95E54CECD8E FD903CFFB4120E05008ECECBF617F9434D39D749ABE130B85D9573DDF1805688 1CA8659CCDB130622C6D3303B689700E1F2F24663B0AE730524CCE7E8D704ECB C3C2E618A84D747608823CBA99649BE8ECBA6B7B1ED07EA2700E55C0C8D376D4 D961A090A7EDA8B3439EB39170EED0C5D7D34204E4DCF1787CEF90FB61263143 FCC34C6FED1B4C00D73C76FBFE2CBCE7113CC61BD5D0613B79D85F1A9FFCA5F6 15FBBD80C5E3CF23AB28D84FAC82E23511AE91C34E07DBE3354B0B21E35F3021 976B29672F11878C43B049C8F08E37DB7CE281603D37378D271D9FB23D6A5E74 1523855F44A0AF66A639CE9612ED62E619060AAF49B38DE7E6A6ED544803DB33 A36F6D3B82CE26AE62987865C0D51A9E9D8A49461535B0FE540333623B687C69 F7E4D1C1F65292D187B1D2F6AD5DC530D982290C13DE3366BBCA57B6D9C62FC5 3D93A46A687D29C9786DC0F80D561E6DC7DB916CACC10B666C57B9B9E92ADE8E 64BBCAA3175C756CAF6D97BD886478A716595F7A73F855812A3D4F99D13F69BB 75F5999764D6254C5E9299ED39C9AC8B396D028A9764393919183306CA5C1B0E 54C5556ABE4DA068F4FD6CC7ED3233FAF649E660CD164959CCB21F1AA90D6CF7 61F8B34FC8FA23566B694E9C454F78F25E683DCBD617D9DAAECA3D2C1167EEFE 4F751983DBE40DBC846AA83DB2BD2F81D5B4CD80D576F382D5BD6235AE356DBD 5B585DCF91FC6A7BBFEABB478EECB7DAC51C69D2EA4D13EAFB3F0640E82B0955 029D624235B27B74B2DDBE68DB2734A5EC6BCAC51F0A6845AB3B59BD01A0FD9B 9BDE8741E7CB42F3B54FCD27764871AE9C482871AC3CD92C4AAEC87929019A1A DC2EE683DDD16AAB91C315898101AD2EADF6A7ADC6B58E33FBE35687BC5CB7B6 41C7C9A87C6C62880A33EA87C526DAC6B67D0E8A564BD0DE38FD6A09B52744FD 9BA1F926C0AAC9DFFF8B68189BCF63D4DFAEF729AB3F8E239B3F3587F9FC6ACE 5AE9CAFD74E87C7974C8DCB0A666086F587BB3E80413C09922788042287420B1 4209C13DDB5F8BC036F6F3FA7346D8F663C281FDB8D19103B8D7B107804DE841 2D8310E2A503617BCFE15D23866228DB5D6E6E5A8FAA32DB781E7D1BDB610744 E3610F44EB4B99660BB99A1E5D5EDD55CA4B942BD9BEA25CC9769547375DE5E6 05DB314EA9D137B6DD0913021AF85A0340167ED9DEDAC2AFA6BD4DFCB4A7BD38 A813B39D45E117F95A0A2C3707DB4B5B2D8FBE85EDB6FCA891EDCFCD6FBF379B 6DEE860974621827D08939CE9692CCD68961A0D859307E8340E1F68A3218DB76 6E6EDA8E2A341B9B52C6247E66B2E22A86A91781AF17938CAEA842EB4B48B649 A0707BDD64E58BB62363DDC4D56292F9CF93A5C5F092CC6CEF2499250D7192CC 1C9E93AC62BDE52CC2706A6D4E89E68595F7B1E6B3AEFA495609D306AE5693CC 899399643E927D36C91C1CDE60E58B4986F473EF407DFBE74914411FDF6F4EE1 69C051B60D445F8B680BEF068FEAA06C4C6AFD6E59111C1A48E782238363D014 5C0B0B9FD1B8108AA0AEBBA1B5BD622DAC6D3571BC2AF431489C428E95D2E647 04E293D6F6BCB5A524AFA48D38FCDE34C50A798391F824DC7CDF487C53700458 F84A6482407C1A6EFEAD40EC038E5F90E4F2B60CC8067936DDA6211F5C5D7B8B F72A7904AA06B772E240764707B76EE3F5B72E0A23CFB420D15AB7F87956EB11 C71197AF14F6E0A1DAD8C9A2D59DAC8EA0EB3959F376C762AF30594BAB5D4A29 99D9DF33345FFBD43881F93CFAD512AA93DD1BA05F29A1A444F20784E6D35663 60F6C4D5FA76FA4310EA7F59EDAFDDC5CA99BD5E22F6F6EFFD9727CEF39B5064 82E6977BF3FB6F43BC36BF4E8617C9ADAD8FBAB539F689C64E1B6EB7EE9EDD38 F6617AB69CC0F86AFABD839CE02683B357E6D641D96F76B82F7C7A06F6E16C77 68830F6107761A3BAC9FD03E3BFDA6DBB29769FD46B7E0B59A42478E3AB45AE4 C809E76627F4C1BBDBE216BF38FBEEDF49DF3BA457E9D621937DAB0FE919DAE0 433A379E9D763AD84E43877E8BC0B3D3947DAF534CD5759553C4D9F70A0397CB 276648651FFB0052C93551D72C4F61DFD5877B87B40FB70E71F6B59B0FE90EB3 EE503629CEBE8E4E3B6079367DE0ECBB217ED689AEA7C860DF0DC0F3CB444E60 32393EC03751B59DB75777DE61861D76DE8E3E6CB7919648DBC7C8CF1EA4ADA9 B1B7A5782E352D04692B8A574EB45E4DB432C52B271A931D67CFDC99B1B581B1 6D4FF198A7F29EB933C563B613D0D4FD285E99B1314D658AB737636B0363DB9E E2DDE95125723B533C663BBCC9EE4CF1CA8C8D692A635F8DB10D746A0FC636F0 A9D4FBC2CE8CCDF58128DE37DB48EF3F19F08D8A2B4C53B7A1787F75B96D72AD 0D33FC92D789BFBADC1EA4AD0D84677B96572EE4F5DD59DE5F5D2EFBCAB03369 2BD7E5064AF55766FBBFCA6CCC3CB7226D7F65B61D38D89D76E6984FAD5C552B CADDA3B50763FB2BB3ED41F6772FB3F5DD09D85FD56C173EC524722B02562FB3 B9E4E5AF6AF66555B37B1CF623607F55B37D08581B7CD89EB1FD04495279233D 4BE27305E6B5F9FA1788C1D8B899AD35039B645AC7842D2AC8B5B3D73C5C48B5 F25687B7BF608F8BD1E182EDCF66FBB1BEA3D6C7EA70C00EA641FF0106607F20 5B260700 }         pcm: clear #{}         Fa': Fb': Fc': -1         volA: volB: volC: 0         time: 1         delay: inter * 8         ;print "start"         view/new/title layout [below origin 0x0                 ;stats: vtext red 150                 ii: box (as-pair to integer! len / 2 100) effect []         ]                 "Demo synthétiseur PSG AY-3-8912... MSX PoWaaaa !!!!"         insert-event-func func [face event] [                 if event/type = 'close [quit] false         ]         refresh: 00:00:00.000         foreach [nb A0 A1 B0 B1 C0 C1 _noise mixer _volA _volB _volC Ev0 Ev1 Shape JoyA JoyB] song [                 chg?: false                 Fa: A1 and 15 * 256 + A0                   Fb: B1 and 15 * 256 + B0                 Fc: C1 and 15 * 256 + C0                 Fa: either Fa > 0 [to integer! clock / Fa ][0]                   Fb: either Fb > 0 [to integer! clock / Fb ][0]                   Fc: either Fc > 0 [to integer! clock / Fc ][0]                   if Fa' <> Fa [toneA: make-period Fa]                 if Fb' <> Fb [toneB: make-period Fb]                 if Fc' <> Fc [toneC: make-period Fc]                 Fa': Fa Fb': Fb Fc': Fc                 volA: _volA and 15                 volB: _volB and 15                 volC: _volC and 15                 nb: to integer! nb / 2                 loop nb [insert tail pcm mix time: time + 1                         if time = delay [                                 ;sample:                                 insert sound-port make sample [data: head pcm]                                 refresh: now/time/precise                                 clear pcm                                 time: 0                         ]                 ]         ]         sample/data: pcm         insert sound-port sample If you want to learn more, you can see also this script: http://www.rebol.org/download-a-script.r?script-name=psg-ay-3-8910-study.r