Forum Rule: Always post complete source code & details to reproduce any issue!
Page 1 of 19 1 2 3 11 ... LastLast
Results 1 to 25 of 472

Thread: Artnet to OctoWS2811?

  1. #1
    Junior Member
    Join Date
    Dec 2013
    Posts
    3

    Artnet to OctoWS2811?

    Are there any Artnet to OctoWS2811 solutions yet?

    I arrived at the Teensy3 after ordering a bunch of rigid pixel strips from Ray Wu in China. They are WS2812B based, and as most know timing is critical and support is pretty limited for these. Hooray for OctoWS2811.

    The next puzzle piece is getting the various software I've found to communicate. I've been eyeballing the PixelInvaders PixelController app. It supports artnet, various UDP protocols and some other bits.

    Just curious if anything already exists to go from artnet (OLA?) to the OctoWS2811 library. No issues hanging the teensys from a computer (beaglebone, pi, laptop, etc.)

    My array is going to be 32 pixels high x 40 wide, physically some 13' wide and 43" high. The strips are vertical and mounted to frames so it can be torn down and moved. Will post pics. Poor mans NIN setup :-)

    TIA

  2. #2
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,973
    I'm not really familiar with Artnet. Is it similar to E1.31?

  3. #3
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    Telmnstr, I have been playing around with PixelController and have it running in a very basic way with Octows2811. Is this what you were looking for?

    You can replace the arduino sketch that resides in the > Integration > ArduinoFw folder with another one that you can write for OctoWS2811 to upload to the Teensy 3. I changed the FastSpi sketch within the folder by replacing #include for OctoWS2811 and changing the calls to fastspi to the appropriate ones for the Octo lib.

    You will also need to change the config.properties file to change the RGB setting to the correct order. After some messing around I found that this srips I am using are BGR. You can find this file in the >data > folder.

    You will need to make some changes to the sketch to the panel number and in the properties file to the orientation and panel flow settings, but I still have not completed a fully working model for long strips.
    The PixelInvader software seems to have some sort of access limits on it (save settings?), but I have only used the free download. Is there a paid for version with bells and whistles?

    So, to recap, change the fastspi sketch for an Octo compatible one, upload. Change the config.properties file RGB setting (I used the Pixelinvaders example config file as a basis).
    The config file also describes the E1.31 settings for multiple universe configurations, but I have not had time to get into that yet.
    Hopefully this is what you were asking about.

  4. #4
    Senior Member
    Join Date
    Jun 2013
    Location
    Montréal
    Posts
    473
    @paul Artnet is a way to send dmx data over a network connection using tcp/ip
    most pro lighting desks support now. The main advantage is that ir supports much more dmx channels than the standard 512. I'd be very glad for a way to get artnet into the teensy as i work alot with lighting designers that are only comfortable with their pro desks that are dmx/artnet only. When controlling several ws2811 leds the 512 channel limit over a single dmx channel is quickly filled.
    The protocol is open also. I've seen some libraries for arduino but something optimized for teensy would rock !

  5. #5
    Senior Member
    Join Date
    Nov 2012
    Location
    Los Angeles
    Posts
    126
    artnet is basically a specialized form of UDP. There is an artnet library for arduino:
    http://vvvv.org/contribution/artnet-arduino-set-v3.1-0

    No idea what would need to altered to make it work with the t3 (if anything). I haven't looked at it at all, but seems like you first need to add ethernet capability to the t3 (like the WIZ820io), then look to see what needs to be done to the UDP packets to make them artnet-compliant.

    It's something on my to do list for the next month or two (t3 artnet support) for exactly the reasons @telmnstr mentions (most lighting designers can only speak DMX (and can only count to 255 as a result

    I'll certainly post anything I come up with here.

    Cheers,
    David

  6. #6
    Junior Member
    Join Date
    Jan 2013
    Posts
    15
    Hey guys
    I'm the author of PixelController just found this thread (thanks Marius). About the Teensy 3 firmware, as the octows2811 is (more or less) a drop in replacement for a led driver (for example faststpi) the adaptation should be pretty simple.

    however there are some constraints which firmware you take. the PixelInvaders firmware for example is for my PixelInvaders panels, those always use a 8x8 resolution - but you can have multiple panels. so this might not the best solution for a custom resolution.

    thats why I recommend that you use the tpm2serial firmware which supports custom resolutions. let me know if that works and if so, send me the firmware so I can include it in the PixelController distribution.

    @Mortonkopf:
    you wrote
    The PixelInvader software seems to have some sort of access limits on it (save settings?), but I have only used the free download. Is there a paid for version with bells and whistles?
    What do you mean with access limits? there is no paid version, but you can of course send me donations

    Cheers
    Michu

  7. #7
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,973
    If any is willing to contribute a confirmed-working sketch that receives PixelController data, I'd be happy to include it in the OctoWS2811 library examples.

  8. #8
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,973
    Regarding Artnet, the ARTNET_receiver_V3.1.ino sketch compiles for Teensy 3.1. The code looks pretty straightforward and depends only on the Ethernet library, so odds are very good it will "just work".

    Pretty soon PJRC will be releasing an adaptor board for Teensy 3.X to the Wiz820io ethernet module. It uses a different SPI protocol that's faster for UDP. The Ethernet library with Teensyduino supports both the Wiz820io and normal Ethernet (eg, the WIX812MJ and Arduino's Ethernet Shield).

    Of course, that Artnet example only receives 3 channels and uses analogWrite to 3 pins. Again, if someone can test it with OctoWS2811, I'd love to include a confirmed-working sketch in OctoWS2811's examples. But I do need your help on this, since I don't have any systems or software that sends Artnet, and with so much other development work to do, I just don't have time to come up to speed on using that software and testing this stuff (which very likely already works).

    But if you do hit any trouble on the Teensy side, please do post with details and I'll do whatever I can to resolve any technical issues on the Teensy stuff.

  9. #9
    Senior Member
    Join Date
    Jan 2013
    Posts
    966
    Quote Originally Posted by PaulStoffregen View Post
    Pretty soon PJRC will be releasing an adaptor board for Teensy 3.X to the Wiz820io ethernet module. It uses a different SPI protocol that's faster for UDP.
    This will also be very interesting for Applications that utilize the OSC protocol which also uses UDP. I already have my own adapter . Any reasons this new SPI protocol would not work with my adapter ?

  10. #10
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,973
    It should work now, with 1.18-rc1 or even 1.17. You'll just need to connect the WIZ820io signals. The 4 SPI signals go to pin 10-13 in the normal way. You also *must* wire the WIZ820io reset pin to pin 9 on Teensy3.

  11. #11
    Senior Member
    Join Date
    Jan 2013
    Posts
    966
    Quote Originally Posted by PaulStoffregen View Post
    You also *must* wire the WIZ820io reset pin to pin 9 on Teensy3.
    Hi Paul, thanks for the info. You had told me about pin 9 in my adapter thread a good while ago and I have already incorporated it in the layout. Thanks again for that! Saved me a layout revision.

  12. #12
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    I will have a look at the pixelcontroller code for variable array size over the weekend, but not the ART-net as have no idea about this. I have the simple multiples of 8*8 matrix working, but its very limited at the moment. Will post if I get something functioning.

  13. #13
    Senior Member
    Join Date
    Nov 2012
    Location
    Los Angeles
    Posts
    126
    This seems easier than I thought. I already have a Wiz820io breadboarded for a different test as well as a small string of ws2811 leds. Let me see if I can get this running later today.

  14. #14
    Senior Member
    Join Date
    Nov 2012
    Location
    Los Angeles
    Posts
    126
    OK, got it to work! Sending artnet packets via Max (via david Butler's artnet externals for Max), controlling a small strip of 8 ws2811 LEDs. However I am getting flicker in the LEDs which I don't get with the exact same connection via direct serial control.

    I'll clean up the sketch and patch and will pass along very shortly!

    David

  15. #15
    Senior Member
    Join Date
    Nov 2012
    Location
    Los Angeles
    Posts
    126
    Here's the sketch. My set-up is 8 strips of 8 (so 192 channels, hence the 192 in the sketch and patch).

    Code:
    /*  artnet to OctoWS2811 test
     
     OctoWS2811 Notes:
     
     Required Connections
     --------------------
     pin 2:  LED Strip #1    OctoWS2811 drives 8 LED Strips.
     pin 14: LED strip #2    All 8 are the same length.
     pin 7:  LED strip #3
     pin 8:  LED strip #4    A 100 ohm resistor should used
     pin 6:  LED strip #5    between each Teensy pin and the
     pin 20: LED strip #6    wire to the LED strip, to minimize
     pin 21: LED strip #7    high frequency ringining & noise.
     pin 5:  LED strip #8
     pin 15 & 16 - Connect together, but do not use
     pin 4 - Do not use
     pin 3 - Do not use as PWM.  Normal use is ok.
     
     Ethernet Notes:
     this was tested using a Wiz820io ethernet module. Standard SPI pin connections, as well as reset on Wiz820io to T3 pin 9
     
     Artnet Notes:
     ARTNET RECEIVER v3.1
     
     This SCRIPT allows you to use arduino with ethernet shield or wifi shield and recieve artnet data. Up to you to use channels as you want.
     
     Tested with Arduino 1.0.5, so this code should work with the new EthernetUdp library (instead of the depricated Udp library)
     
     If you have implemented improvements to this sketch, please contribute by sending back the modified sketch. It will be a pleasure to let them accessible to community
     
     Original code by (c)Christoph Guillermet, designed to be used with the free open source lighting software WhiteCat: http://www.le-chat-noir-numerique.fr
     karistouf@yahoo.fr
     
     v3, modifications by David van Schoorisse <d.schoorisse@gmail.com>
     Ported code to make use of the new EthernetUdp library used by Arduino 1.0 and higher.
     
     V3.1 by MSBERGER 130801
     - performance gain by shrinking buffer sizes from "UDP_TX_PACKET_MAX_SIZE" to 768
     - implementation of selction / filtering SubnetID and UniverseID (was already prepared by karistouf)
     - channel count starts at 0 instead of 1 (the digital and vvvv way)
     - artnet start_address+n is now mapped to "arduino-channel" 0+n (was also start_address+n bevore), now it is similar to lighting fixtures
     */
    
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // libraries
    #include <stdlib.h>
    #include <SPI.h>        
    #include <Ethernet.h>
    #include <EthernetUdp.h>
    #include <OctoWS2811.h>
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    // from Artnet Receiver Sketch
    #define short_get_high_byte(x) ((HIGH_BYTE & x) >> 8)
    #define short_get_low_byte(x)  (LOW_BYTE & x)
    #define bytes_to_short(h,l) ( ((h << 8) & 0xff00) | (l & 0x00FF) );
    
    byte mac[] = {
      0x90, 0xA2, 0xDA, 0x0D, 0x4C, 0x8C} 
    ; //the mac adress in HEX of ethernet shield or uno shield board
    byte ip[] = {
      192, 168, 1, 10}; // the IP adress of your device, that should be in same universe of the network you are using
    
    // the next two variables are set when a packet is received
    byte remoteIp[4];        // holds received packet's originating IP
    unsigned int remotePort; // holds received packet's originating port
    
    //customisation: Artnet SubnetID + UniverseID
    //edit this with SubnetID + UniverseID you want to receive 
    byte SubnetID = {
      0};
    byte UniverseID = {
      0};
    short select_universe = ((SubnetID*16)+UniverseID);
    
    //customisation: edit this if you want for example read and copy only 4 or 6 channels from channel 12 or 48 or whatever.
    const int number_of_channels = 192; //up to 512 channels; using 192 right now = 8 strips * 8 rgb LEDs per strip * 3 colors
    const int start_address = 0; // 0 if you want to read from channel 1
    
    //buffers
    const int MAX_BUFFER_UDP = 768;
    char packetBuffer[MAX_BUFFER_UDP]; //buffer to store incoming data
    //byte buffer_channel_arduino[number_of_channels]; //buffer to store filetered DMX data
    
    // art net parameters
    unsigned int localPort = 6454;      // artnet UDP port is by default 6454
    const int art_net_header_size = 17;
    const int max_packet_size = 576;
    char ArtNetHead[8] = "Art-Net";
    char OpHbyteReceive = 0;
    char OpLbyteReceive = 0;
    //short is_artnet_version_1=0;
    //short is_artnet_version_2=0;
    //short seq_artnet=0;
    //short artnet_physical=0;
    short incoming_universe = 0;
    boolean is_opcode_is_dmx = 0;
    boolean is_opcode_is_artpoll = 0;
    boolean match_artnet = 1;
    short Opcode = 0;
    
    EthernetUDP Udp;
    
    
    // for OctoWS8211 RGB control
    const int ledsPerStrip = 8; 
    int SerialIn;
    byte rgb[number_of_channels]; // buffer to hold values for all leds
    int rgbSerialIdx = 0; // index to keep track of serial inputs
    
    int displayMemory[ledsPerStrip*6];
    int drawingMemory[ledsPerStrip*6];
    
    int bytecounter;
    
    const int config = WS2811_GRB | WS2811_800kHz;
    
    OctoWS2811 leds(ledsPerStrip, displayMemory, drawingMemory, config);
    
    void setup() {
    
      leds.begin();
    
      Serial.begin(921600); // also allows direct serial control for testing
    
    
      //setup ethernet and udp socket
      Ethernet.begin(mac,ip);
      Udp.begin(localPort);
    
      // set up default colors
      initLEDs();
      leds.show();
    
    }
    
    
    void loop() {
    
      // control via serial
      while (Serial.available() > 0) { 
        // mail call
        SerialIn = Serial.parseInt(); 
        rgb[rgbSerialIdx] = SerialIn;
        rgbSerialIdx++;
        if (Serial.read() == '\n') { // end of message
          setLEDs();
          leds.show();
          rgbSerialIdx = 0;
        }
      }// end of direct serial control  
    
      // control via artnet
      int packetSize = Udp.parsePacket();
     
      //FIXME: test/debug check
      if(packetSize>art_net_header_size && packetSize<=max_packet_size) {//check size to avoid unneeded checks
        //if(packetSize) {
    
        IPAddress remote = Udp.remoteIP();    
        remotePort = Udp.remotePort();
        Udp.read(packetBuffer,MAX_BUFFER_UDP);
      
        //read header
        match_artnet=1;
        for (int i=0;i<7;i++) {
          //if not corresponding, this is not an artnet packet, so we stop reading
          if(char(packetBuffer[i])!=ArtNetHead[i]) {
            match_artnet=0;
            break;
          } 
        } 
    
        //if its an artnet header
        if(match_artnet==1) { 
          //artnet protocole revision, not really needed
          //is_artnet_version_1=packetBuffer[10]; 
          //is_artnet_version_2=packetBuffer[11];*/
    
          //sequence of data, to avoid lost packets on routeurs
          //seq_artnet=packetBuffer[12];*/
    
          //physical port of  dmx N°
          //artnet_physical=packetBuffer[13];*/
    
          //operator code enables to know wich type of message Art-Net it is
          Opcode=bytes_to_short(packetBuffer[9],packetBuffer[8]);
    
          //if opcode is DMX type
          if(Opcode==0x5000) {
            is_opcode_is_dmx=1;
            is_opcode_is_artpoll=0;
          }   
    
          //if opcode is artpoll 
          else if(Opcode==0x2000) {
            is_opcode_is_artpoll=1;
            is_opcode_is_dmx=0;
            //( we should normally reply to it, giving ip adress of the device)
          } 
    
          //if its DMX data we will read it now
          if(is_opcode_is_dmx=1) {
    
            //read incoming universe
            incoming_universe= bytes_to_short(packetBuffer[15],packetBuffer[14])
              //if it is selected universe DMX will be read
              if(incoming_universe==select_universe) {
    
                //getting data from a channel position, on a precise amount of channels, this to avoid to much operation if you need only 4 channels for example
                //channel position
                for(int i = start_address; i < number_of_channels; i++) {
                  //buffer_channel_arduino[i-start_address]= byte(packetBuffer[i+art_net_header_size+1]);
                  rgb[i-start_address]= byte(packetBuffer[i+art_net_header_size+1]);
                }
              }
          }
        }  //end of artnet sniffing
        setLEDs();
        leds.show();
      }
    }
    
    void setLEDs() 
    {
      // set LED colors
      for (int w = 0; w < ledsPerStrip*8; w++) {
        leds.setPixel(w, rgb[w*3], rgb[w*3+1], rgb[w*3+2]);
      }
    }
    
    
    void initLEDs() 
    {
      // set LED colors
      for (int w = 0; w < ledsPerStrip*8; w++) {
        leds.setPixel(w, 0, 0, 0);
      }
    }
    And for those of you working in Max, here's a patch which allows both direct USB/serial control and control via artnet. Requires David Butler's excellent artnet externals for Max, found here:
    http://www.theimpersonalstereo.com/software/imp-dmx/


    Code:
    ----------begin_max5_patcher----------
    23141.3oc68t0aijjrmmOW0mBBU4hopt6jc3283ruz6AyrKFfYOC1cl8gE8N
    n.kTTYxJoH4PRoJOmAy28MBOBRw3tEzcI4r4+DnU0J3EYtYlat61uvB6+wO9
    C2c+lums+tY+Sy96y9ge3+wO9C+f6REW3Gp98e3tmV78GVsXu6sc2Cad5or0
    Gt6uT9ZGx99A20ede19Y+6W7xxGm8O+7gUY692seV12eHa0p728rE6NrN6P9
    ENjsa8hU+S++s9qGNr8e5u9W+i+3Ole3qYKeZa1t8axeo84uirMyy+y7W2u4
    2N7GK1k8Wye0O+3Se+ud7O5pkqydXyyqc+kkUWb6hCO70kq+xutK6gCkiHCm
    MO4uLSqSmq9KyXoIteSNOY1+spOz5meZ45UYGbiMV0EW9naDs49e+yb4w+l+
    1l0GVu3oL2K8+1tkKVc2qeGaJFwkeIIGe+69x8tee9wqb+y2e+pry+CU7c9a
    Kdn001u7eq7Z7Se3s6x1mqHWbX4l0cLBMt+SR0Ol8eq3C8+7G+whe7WHZXWm
    8G4i3V10Cyte1ogZG5XlhUnb0BawebAu3W3ISPEmNUMLu5pkW5v+51rRI4t6
    Wr9K28Wlc2cm9a2TYFN0xtJW5OWXlGU6nroEZGiy.0u1IoCGvjopdX8odBpZ
    49mObXy5wG4Ft53Xdh9Eb9DGeNyeHc8yC6LuzJmGNZ8gcaxiksa1eawyG1LK
    Y1eKWr90G95h0qyVsOO3Be1e640KeXw9CyXm9+9qK2V7RyYZ6b1bVh6EdIOT
    W1rDBSprNkmReAZOQvlV8dMkZOsoTBdUjFWHOCexpF6EGR2+gdeqdtOeww+u
    ++3ed1KKV8b95n+1lcyxV7vWms+vtbOnuluj37Y+K+m+u9eX1gut3P9OVtel
    S0LK+K94mx+DV2G++z+g+84uPtSp6yM0kKUJoacxxIqrRmuosbo8id4xfZSV
    kqZl8ut44cy9uJbFgY+7l0q9WmsNK6QmM5+m+K+y+08YEitYUQHls42bVgeo
    SkunekuU3VhPjpOauJ4gAlfxmcEp7y8c2u3KYsT9q1r3wx0y6OHYhzojLrx8
    .U401mFi2Viohy0V6amX4y5cpgrcTzJxxouoSN9H6cZkipKuewKGe++z+Rwm
    n13b1c+uV7ie5+qhels9wxqDxU4Wrca92atda.kJWXbSN0k5Tyj0oJ1UkqVw
    ruhYlyXC4oU5gIXW5BwrqKkxhCaVRvGQ5TGR8vpCQa0gHXZiUK2e3cIhzrM4
    ycF73gZk6DgRkS4HcQiXoSYUsfEMpPVGHhT9NtSC3tGdX0xG9V4lFxOtvyae
    bwgrYEFlhcHTsmgGydY4C4ad6+7+x+o+em8e7+8hsZL6OVt+qEehi6mvsktG
    WVnQy24wKKWb1lN5bOF7A1fG2crBQ4ozql3V31R1ZXtB2hQeG2X6tk4+8lsc
    ytCy9eYOAeXgKdmc5Q+0WUw41tKyshX4BiCoWRc4USYb5kT6zW.PbUoX92VM
    a4g7CWwHnSj1Wi20uNoi8jJXw6A2yOo45mGXvqXR2nlUtWfT8j8HDDN.41E6
    xudtg3WyVunJDRRmZliKxtX2tM+wusq5aKoO80xhv3D20ZtivSU4M+t+47yr
    eXylCe8y+WbgkK1A8r69KE+n0Kw63k9+byiYOc552me8Ou7KqWt+rumm2e+S
    EuKCWxtrc+NZB6jkaYoZ+KWPB6TpO5D1Ujq5GVksXGggo9RClqrAOg0kx76Q
    VqyEgL2JdDBgwcSl07IGBSkFugv5KeCtMCPvswVl7QgaerlInTzu4IxmMWmj
    +Oc.0JkaYt+i7TtxuTxKmRMckh5JTo7vpM6yFJA0LWZTqzJk+bZZEcDqUNr4
    KeYUFgzBnDW35HZyzWomMzZ5gbIl+64xytMTxKhTwJg2L7Qd6x9aCl8uZI1.
    6Cz2IpJOU6e69EO+3rTNK+6ujVlKKA4++yOC7h6WdnfVwe6gu975uUPJK2Hu
    7v+ZwK+8Mq+9le62J9+t+vlst24vJZ2DMURoh1HmbxEzgakpiad78RYusjwy
    m+I6PqZoJO.hz3vIxlL9YVRnfkctPlsqZ7VMfye2KWkUfEcY9VTe0T8CEIm8
    rK+Cm8QJzR+9F2Wj9ub5RKWWdI1oKsK6kkG+7u9FWrKWUcHWO87txQz2s56J
    ewbKyOd7idZgNUYPb2tESSKCvkdlhL2H9kUad3aYOdlN3Gbqetb8426F0d4G
    y9sEOu5vu1stp9qeLwHc9hcZX9g69xtkOtYsaQ7y+jEW93etBVytwl57Ai6c
    rdw1N9v6yGG4mFYwtB0ZULY9wWLep9p5uzIKYtS9h0KeZwgrCKKEVdxouzkO
    Ut+qy+CUFx+q6enf6dsupxW4kNdkxDp8GKe7vWqkrohWI+sub6QSvcmzQOt7
    KY6OT+ZGV7k80uRsaSpy8BOe1asqOzr3AQc02b4zxzOk9JqqymI2a3td2bwv
    yp6eQFBKzz6l0+gig+plncgJy56Lqt1TmLKkM6zdH58VCKOjXZZp0XKzihx7
    X0DfXuqV26YBCqR8cSgNf24yq2t3gukulbxo6XER5TgawFlvLWq0Fo8BcWOc
    VxIqYECoYqVs9r+yUjuqJeeOgy2Um.e2F5z.46pYv2s0gikrP56xguaCcZn7
    cEv2s04ME1P56JguaCcZn7cUv2s0dyx8QEBAWwKxLoua2UCW25pzx69I+2sq
    AdtsgJqBnmKB51PkFJOWDysCPP7.54hs51PkFJOWrS2NtIxSCmmq.6VngJMT
    dt+iV9EFPSuc19xJC6ykkH0HZas0Vna0b8oJEK0bw4LWdwaKKY.EWyQvqTwp
    qi5kNVeDxZ7w6hTVOzx5mX1XTypQNqA8rjS0lrtr1Tj1FVgtwmQ.gFELZihR
    iHNsAPpQCq1Hn0FEu1HH1FEyVen1FF21vH2FF61fn25C+V2H35FCWSW8lQZZ
    85iEwoYIotuV8nN3lpKYxY0k2LBcErYv.NsB5vZ9GcXWyAC9LXj6ZQuqGA+M
    V+l88s6l8yeZI6yre4OIl8mmwIon4yME4LxVrgjxJJIQ5s9VH7Ue27Ke3srb
    sXRXDLIbidtLIIgKCqIQBSRwdeNsGyV6zbjfQLmoPYUzLE5ALEJXJZM6frgn
    ZNgU3+TBMrCMN30DlPvRRJu2Ts9aHL9ZHjiYHZePrNNO1GkApcVFZ8Dsn3g+
    zrOwJdnVL6S4G68zkDkWRd1kTkWJ+3ZMtUnFIBmRTVJi5tROwfonn2RO5evm
    Y4TFjUvxJ07weNr5MYfsyxCtx6Xo25Nlv.Zt5G.qnXYG4LDNsQw6aX059MOu
    6gSUWb0XbVaUT9AfNrb8oyt92eM.RGu4ut7wGaetvxiJsu3PXkGQ9hbTtzwU
    wTCxiqhysbsLtLSwdoutFWLpiKUmu49GWOs7wsaxWFpZRDy3pNZV4SZjheSm
    e3rTS0kZKEerpE9TTKhKWsvy2z8qpEQZ5blqB.hT0hXJpE0kqVDoVmZorXwz
    b0oeK1zHjiKHmXbgFZDU4CmRS4YCx8ZROdP5hKc0pUDAQqHcdKp7sFwOlwmh
    KESZE8TzJpqm0PTSYbYudFWxoZu3WGiKwTGWx2fwUYoV1hFj6g70i+Z9e57i
    W7qKNbX2x6e9P41v6B3Unn0PiLzEfmnWAaDAZHA4Kq1b+hUUn.O8czCUjers
    AHp.vJyWHKf.Xs..K.vB.r..K.vB.r..K.vB.rX1A.vB.r..K.vB.r..K.vB
    .r..K.vB.r..K.vB.r..K.vB.r..6MK.VtkGR.ro..K.vB.r..K.vB.r..K.
    vB.rX1A.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..6MK.VS
    Z.4upR.+UveE7WA+UveE7WA+UveE7WwrCveE7WA+UveE7WA+UveE7WA+UveE
    7WA+UveE7WA+UveE7WA+0aV9qZU41A0Beq8UMXuB1qf8JXuB1qf8JXuB1qf8
    Jlc.1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXud618WU5.w
    dUA1qf8JXuB1qf8JXuB1qf8JXuhYGf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1
    qf8JXuB1qf8JXuB1q2tM9UkHPrWkf8JXuB1qf8JXuB1qf8JXuB1qX1AXuB1q
    f8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf85MK60p7s3O5UAPu5A5
    UVUJGkZfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3W
    A9UfeE3WA9UfeE3WA902Y7qO+z8Y6NGoY9g6V9zyO0jmYGmWzp0y04+imuEG
    t1crwpyneIXWYS.6Z9P3nLxUpZR4t7Ozgrc+ZI+plih5m.8rbCzatXbImn1f
    ouSv+QaMRLyE4+yHCh0PBqgOVCizLuX+KFaPrFJXMF5FEYw2loksxLbmMlZq
    80XVokD6obuhH6wvbwsmZ1P52qBWbsVDxv+F3h6k0HQFxv+VXM7wZnjxPF9O
    EViwB+KHE9WZUgL7OO41M7uL2sNbg+4L3h6k0HgEvv+bNrF9XMDRV.C+ywIi
    GM7OmT3etkGzv+xa2v+bkIjg+wAb8xZvRsgL7O1uoeVCgMfg+EIvZLV3eFov
    +lzPF8Wvuci9aElyt6J8v4FQZ7KMyF2pvFoMDFCFhz3m0f4VElq3AwZfiDOZ
    b+DZI8WUdmpI7Oe+2vw70BYXh4i856WtkMx.FyWCigWFClJfg7ACrwh3qRok
    m+pdfs+Q7s2vY3WvBS.erQF+xlrgEv.9H099YLxkkvEvGY1ez.9VZY1upwa3
    e.+a4b5ysgIfOG6pzuDHqsgLhO1VoeVijz.FxmiaspQi4aHEyupB+8OjufEG
    w7O89aWxxupg6pbQNSO2pLQRaVkH8TgHEo1pdQA1c0gzckgLnSwTEYKQQV1p
    hk9vDYCQQ11rza+vjXslnHqkD0xMJnuTornT934QL4UU1m7HTT20p+2NhFv7
    fLfEJ10x.NIHCXkRdkLfU1fLfMJy0x.V60.VnmaJFubyba0FgbWJZGtxPLbU
    b4UxvkGhgqfytNFthf3LyX1O1gqh5vMIZ1kit0SNjdjYdZbIybJxb7raxN1x
    UOqbGQxrfnLyEwkLSxelGWxLI+YV7Hybp9yQjuAi5AmSiKYlh+LyFWxLE+Yl
    Idj4Dp9yQzbvIjgBdTHwJxotJdVEzIyjlAJiKYlzLv3I5rhZNBUwSzYkgndN
    xDYRSAYwkLSZJX7bvJE4i5GOKBpnd.1HSjo3ZniKQlRPiHZMPpmdUEQxL0Su
    JhKQlzgWiKQlzNMhGQl5QWUQjmA0itxswkLSxa1DWxLoTwDQqmLgiAFG2M.T
    WMQFOmnRPd6bwSfNA4.cwy1lETCzIimfyBp4NxYPhi6UDpaNRFMRLOcJZ43H
    eWbp4zPvhG8rYJxbjnm0SQliiEA4po3OGIxL4UtimDdwISwLhh0wmhLGIyAY
    SQliD+YpqbKimiUwmvJ2wgmAi5J2NyQbLCjYmhLGI5YyTj43XFHi5J2x3IIA
    Lpqb6FbQh+rbJxbj3OKlhLGI9yjCOGOIPhwlRAkDI9yISQliD+4IrxcH7lqZ
    jKGahKi0.WpD8AabKDZZKi0vV5sYszUiZoylzx.0yUeMmkQZLKMaJKkJQ2OK
    M7NcyYkBWotZfRf6rxea19bM81O+SGqYyte5V3ddFw4IE2OyZVyBeqyVzYmO
    Fi5W4zcmkuGM1cUpplNG+1xUYujsaekw6X0xc2hsaO6x0lJjqk98M6p0apKJ
    UyxKcpb6taW1KKO94e8MtXWtp5Ptd54ckinua0UMNmSMmn6NunwKafgtJGLs
    7IBnH87JH7t6ycEd3aUyZNdwMayVub81cY6yVe3z7wD5tz9Mk4K6V93l0EBQ
    sOYwkO9m6uOiUN1NuAtV9NVuXaGe384iim2e+hcEp0pBJkexeeylU0eoSVxb
    m7EqW9zhCYGVVJr7jSeoKeZ6tkksq0SWqrdU+Z9j5MqVU6qp7UdoiW4wbi8C
    Y+wxGO7U220EFc30osmI88UlkdWHqq1r3wFc13tlKmVV9ptIzZOdLN81zHRd
    WqJ31MX5W0l5jYorYZycSns6j35TzJSWMJ5daRz0dPkcs+v+oeuyyam5SQmV
    8HAR75icxK6Q.W5kpYEDpk8dZb5QtuasdFh29t5D361PmFHeWMC9tC1vC722
    kCe2F5zP46Jfu6fOs1822UBe2F5zP46pfu6POwoKqtYe1tqFtt0UoFdX1sqA
    dtC8fy0eOWDzsgJMTdtHl6fOAP82yEa0sgJMTdtXmtC9fLzaOWA1sPCUZn7b
    +Gs7KLzS6wY6yN74ce49O+xhUOmseBcu6hGWQEIN2bw4LWdwaKKY.EWyQvqT
    wpqi5kNVeDxZ7w6hTVOzx5mX1XTypQNqA8LGrB2OzR2+QZaXE5FeFADZTvnM
    JJMh3zF.oFMrZifVaT7ZifXaTLa8gZaXbaCibaXraChdqO7acifqaLbMc0aF
    oo0qOVDm5Qc1eLpSy2QuOjY4VW+jP0YvlAC3zJnCq4ezgcMGL3yfQtqE8tdD
    72X8a122ta1O+okrOy9k+jX1edFmjhlO2Tjynhm401xF1Thza8sP3q9t4W9v
    aY4ZwjvHXR3F8bYRRBWFVShDlD2S55i6wr0NMGIXDyYJTVEMSgd.SgBlhVyN
    HaHplSXE9OkPC6PiCdMgIDUOT9EJq+FBiuFB4XFh1GDqiyi8QYfZmkgFacJ6
    vCYqVM6SrY4mXa1mxO16oKIJuj7rKoJuT9w0ZbqPMRDNkCCmfo6J8DClhhVF
    T6swLKmxfrBVVolO9ygUuICrcVdvUdOr4omxVe3rav1t0b0O.VqNlPaEZW2A
    1cnVa+.Hn0co+P0eooy2bm2S18eeYOIGkKcbIrSXbIYWOiKyTrW5qqwEi53R
    04at+wUiGV1LCuHDLSWts+7eSme3rTS0kZKEerpE9TTKhKWsvy2z8qpEQZ57
    7MejjniT0hXJpE0kqVDoVmZQ3VvVyUm9sXSiPNtfbhwEZnQToNUfo7rA4dMo
    GOHcwktZ0JhfnUjNuEU9Vi3Gy3SwkhIshdJZE00yZHpoLtrWOiK4TsW7qiwk
    XpiK4av3pp1.aRCZrZDrIvqPQqgFYnK.OQuB1HBzPBxv0RXW0SXcCPTAfUlu
    PV.AvZA.V.fE.XA.V.fE.XA.V.fE.XwrC.fE.XA.V.fE.XA.V.fE.XA.V.fE
    .XA.V.fE.XA.V.fE.XA.1aV.rbKOj.XSA.V.fE.XA.V.fE.XA.V.fE.XwrC.
    fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.1aV.rlz.xeUk.9
    qf+J3uB9qf+J3uB9qf+J3uhYGf+J3uB9qf+J3uB9qf+J3uB9qf+J3uB9qf+J
    3uB9qf+J3uB9q2r7W0pxsCpE9V6qZvdErWA6UvdErWA6UvdErWA6UL6.rWA6
    UvdErWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA6Uvd81s6upzAh8pBrWA6U
    vdErWA6UvdErWA6UvdEyN.6UvdErWA6UvdErWA6UvdErWA6UvdErWA6UvdEr
    WA6UvdErWuca7qJQfXuJA6UvdErWA6UvdErWA6UvdErWwrCvdErWA6UvdErW
    A6UvdErWA6UvdErWA6UvdErWA6UvdErWA60aV1qU4awezqBfd0CzqrpTNJ0.
    +JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+Jvu
    B7q.+JvuB7quy3We9o6y1cNRy7C2s7omepIOyNNunUqmqy+GOeKNbs6XiUmQ
    +Rvtxl.107gvQYjqT0jxc4enCY690R9UMGE0OA5Y4Fn2bw3RNQsASemf+i1Z
    jXlKx+mQFDqgDVCerFFoYdw9WL1fXMTvZLzMJxhuMSoakY3NaL0V6qwrRKI1
    S4dEQ1ig4haO0rgzuWEt3ZsHjg+MvE2KqQhLjg+svZ3i0PIkgL7eJrFiE9WQ
    J7uzpBY3edxsa3eYtac3B+yYvE2KqQBKfg+4bXM7wZHjr.F9miSFOZ3eIov+
    bKOng+k2tg+4JSHC+iC35k0fkZCY3ereS+rFBa.C+KRf0Xrv+BRg+MogL5uf
    e6F82JLmc2U5gyMhz3WZlMtUgMRaHLFLDowOqAysJLWwCh0.GIdz39bZI8WU
    dmpI7Oe+2vw70BYXh4i856WtkMx.FyWCigWFClJfg7ACrQi3ynkm+pdfs+Q7
    s2vY3WvBS.erQF+xlrgEv.9H099YLxkkvEvGY1ez.9IzxreUi2v+.92x4zma
    CS.eN1UoeIPVaCYDersR+rFIoALjOG2ZUiEyWlRJleUE96eHeAKNh4e582tj
    keUC2U4hbldtUYhj1rJQ5oBQJRsU8hBr6pCo6JCYPmhoJxVhhrrUEK8gIxFh
    hrsYo29gIwZMQQVKIpkaTPeoRYQo7wyiXxqprO4QnntqU+ucDMf4AY.KTrqk
    AbRPFvJk7JY.qrAY.aTlqkAr1qArPO2TLd4l41pMB4tTzNbkgX3p3xqjgKOD
    CWAmccLbEAwYlwrerCWE0gaRzrKGcqmbH8Hy7z3Rl4Tj43Y2jcrkqdV4NhjY
    AQYlKhKYlj+LOtjYR9yr3Ql4T8miHeCF0CNmFWxLE+YlMtjYJ9yLS7HyIT8m
    in4fSHCE7nPhUjScU7rJnSlIMCTFWxLoYfwSzYE0bDphmnyJCQ8bjIxjlBxh
    KYlzTv34fUJxG0OdVDTQ8.rQlHSw0PGWhLkfFQzZfTO8pJhjYpmdUDWhLoCu
    FWhLocZDOhL0itphHOCpGckaiKYlj2rItjYRohIhVOYBGCLNta.ntZhLdNQk
    f714hm.cBxA5hmsMKnFnSFOAmETycjyfDG2qHT2bjLZjXd5TzxwQ9t3Tyogf
    EO5YyTj4HQOqmhLGGKBxUSweNRjYxqbGOI7hSlhYDEqiOEYNRlCxlhLGI9yT
    W4VFOGqhOgUtiCOCF0Utcli3XFHyNEYNRzyloHywwLPF0UtkwSRBXTW41M3h
    D+Y4Tj4HweVLEYNR7mIGdNdRfDiMkBJIR7mSlhLGI9ySXk6P3MW0HWN1DWFq
    AtTI5C13VHzzVFqgszayZoqF0RmMokApmq9ZNKizXVZ1TVJUhteVZ3c5lyJE
    tRc0.k.2Yk+1r84Z5se9mNVAsc+zsn74YTpqWpoYMK7sNaQmc1cO5W4zcmku
    GM1cUpplNG+1xUYujsaekw6X0xc2hsaO6x0lJjqk98M6p0apKJUyxKcpb6ta
    W1KKO94e8MtXWtp5Ptd54ckinua0UMNmSMmn6NunwKafgtJGLs7IBnH87JH7
    t6ycEd3aUyZNdwMayVub81cY6yVe3z7wD5tz9Mk4K6V93l0EBQsOYwkO9m6u
    OiUN1NuAtV9NVuXaGe384iim2e+hcEp0pBJkexeeylU0eoSVxbm7EqW9zhCY
    GVVJr7jSeoKeZ6tkksq0SWqrdU+Z9j5MqVU6qp7UdoiW4wbi8CY+wxGO7U22
    0EFc30osmI88UlkdWHqq1r3wFc13tlKmVV9ptIzZOdLN81zHRdWqJ31MX5W0
    l5jYorYZycSns6j35TzJSWMJ5daRz0dPkcs+v+oeuyyam5SQmV8HAR75icxK
    6Q.W5kpYEDpk8dZb5QtuasdFh29t5D361PmFHeWMC9tC1vC722kCe2F5zP46
    Jfu6fOs1822UBe2F5zP46pfu6POwoKqtYe1tqFtt0UoFdX1sqAdtC8fy0eOW
    DzsgJMTdtHl6fOAP82yEa0sgJMTdtXmtC9fLzaOWA1sPCUZn7b+Gs7KLzS6w
    Y6yN74ce49O+xhUOmseBcu6hGWQEIN2bw4LWdwaKKY.EWyQvqTwpqi5kNVeD
    xZ7w6hTVOzx5mX1XTypQNqA8LGrB2OzR2+QZaXE5FeFADZTvnMJJMh3zF.oF
    MrZifVaT7ZifXaTLa8gZaXbaCibaXraChdqO7acifqaLbMc0aFoo0qOVDm5Q
    c1eLpSy2QuOjY4VW+jP0YvlAC3zJnCq4ezgcMGL3yfQtqE8tdD72X8a122ta
    1O+okrOy9k+jX1edFmjhlO2Tjynhm401xavgDo25agvW8cyu7g2xx0hIgQvj
    vM54xjjDtLrlDILItmz0G2iYqcZNRvHlyTnrJZlB8.lBELEslcP1PTMmvJ7e
    JgF1gFG7ZBSHpdn7KTV+MDFeMDxwLDsOHVGmG6ix.0NKCM15T1gGxVsZ1mXy
    xOw1rOker2SWRTdI4YWRUdo7iq03VgZjHbJGFNAS2U5IFLEEsLn1aiYVNkAY
    ErrRMe7mCqdSFX6r7fq7dXySOks9vY2fscq4pe.rVcLg1JzttCr6Ps19APPq
    6R+gp+RSmu4Numr6+9xdRNJW53RXmv3RxtdFWloXuzWWiKF0wkpy2b+iqFOr
    rYFdQHXltba+4+lN+vYolpK0VJ9XUK7onVDWtZgaUmoVDooyy27QRhNRUKho
    nVTWtZQjZcpEgaAaMWc52hMMB43BxIFWngFQk5TAlxyFj60jd7fzEW5pUqHB
    hVQ57VT4aMheLiOEWJlzJ5onUTWOqgnlx3xd8LtjS0dwuNFWhoNtjuAiqpZC
    rIMnwpQvl.uBEsFZjgt.7D8JXiHPCIHCWKgcUOg0M.QE.VY9BYAD.qE.XA.V
    .fE.XA.V.fE.XA.V.fEyN..V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.
    XA.V.fE.XuYAvxs7PBfME.XA.V.fE.XA.V.fE.XA.V.fEyN..V.fE.XA.V.f
    E.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XuYAvZRCH+UUB3uB9qf+J3uB9q
    f+J3uB9qf+Jlc.9qf+J3uB9qf+J3uB9qf+J3uB9qf+J3uB9qf+J3uB9qf+J3
    udyxeUqJ2NnV3asupA6UvdErWA6UvdErWA6UvdErWwrCvdErWA6UvdErWA6U
    vdErWA6UvdErWA6UvdErWA6UvdErWA60a2t+pRGH1qJvdErWA6UvdErWA6Uv
    dErWA6UL6.rWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA6Uvd81s
    wupDAh8pDrWA6UvdErWA6UvdErWA6UvdEyN.6UvdErWA6UvdErWA6UvdErWA
    6UvdErWA6UvdErWA6UvdErWuYYuVkuE+QuJ.5UOPuxpR4nTC7q.+JvuB7q.+
    JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+Jvu9
    Nie84mtOa24HMyOb2xmd9ol7L637hVsdtN+e77s3v0tiMVcF8KA6JaBXWyGB
    GkQtRUSJ2k+gNjs6WK4W0bTT+DnmkafdyEiK4D0FL8cB9OZqQhYtH+eFYPrF
    RXM7wZXjl4E6ewXCh0PAqwP2nHK91LosUlg6rwTasuFyJsjXOk6UDYOFlKt8
    TyFR+dU3hq0hPF92.WburFIxPF92BqgOVCkTFxv+ovZLV3eCov+RqJjg+4I2
    tg+k4t0gK7OmAWburFIr.F9myg0vGqgPxBX3eNNY7ng+0jB+ys7fF9Wd6F9m
    qLgL7ONfqWVCVpMjg+w9M8yZHrAL7uHAViwB+qHE92jFxn+B9sazeqvb1cWo
    GN2HRieoY13VE1HsgvXvPjF+rFL2pvbEOHVCbj3Qi6KokzeU4cplv+78eCGy
    WKjgIlO1que4V1HCXLeMLFdYLXp.FxGLvFMhufVd9q5A19Gw2dCmgeAKLA7w
    FY7KaxFV.C3iT66mwHWVBW.ejY+QC3yokY+pFug+A7ukyoO2Fl.9brqR+Rfr
    1FxH9Xak9YMRRCXHeNt0pFMlOiTL+pJ72+P9BVbDy+z6ucIK+pFtqxE4L8bq
    xDIsYUhzSEhTjZq5EEX2UGR2UFxfNESUjsDEYYqJV5CSjMDEYayRu8CSh0Zh
    hrVRTK2nf9RkxhR4imGwjWUYexiPQcWq9e6HZ.yCx.VnXWKC3jfLfUJ4Ux.V
    YCx.1nLWKCXsWCXgdtoX7xMysUaDxconc3JCwvUwkWICWdHFtBN65X3JBhyL
    iY+XGtJpC2jnYWN5VO4P5Ql4owkLyoHywytI6XKW8rxcDIyBhxLWDWxLI+Yd
    bIyj7mYwiLyo5OGQ9FLpGbNMtjYJ9yLabIyT7mYl3QlSn5OGQyAmPFJ3QgDq
    Hm5p3YUPmLSZFnLtjYRy.imnyJp4HTEOQmUFh54HSjIMEjEWxLoofwyAqTjO
    pe7rHnh5AXiLQlhqgNtDYJAMhn0.od5UUDIyTO8pHtDYRGdMtDYR6zHdDYpG
    cUEQdFTO5J2FWxLIuYSbIyjRESDsdxDNFXbb2.Pc0DY7bhJA4syEOA5DjCzE
    OaaVPMPmLdBNKnl6HmAINtWQnt4HYzHw7zonkii7cwolSCAKdzyloHyQhdVO
    EYNNVDjqlh+bjHyjW4NdR3EmLEyHJVGeJxbjLGjMEYNR7motxsLdNVEeBqbG
    GdFLpqb6LGwwLPlcJxbjnmMSQliiYfLpqbKimjDvntxsavEI9yxoHyQh+rXJ
    xbj3OSN7b7j.IFaJETRj3OmLEYNR7mmvJ2gvatpQtbrItLVCboRzGrwsPnos
    LVCao2l0RWMpkNaRKCTOW80bVFowrzrorTpDc+rzv6zMmUJbk5pAJAtyJ+sY
    6y0za+7Oc7gjS2OcKN048JZoZrlE9Vmsnytpw490Mc2X46QgcWklpouwusbU
    1KY61WY6NVrb2sX61ytbsYB4JoeeytZsl5hJ0r7Rmp1t61k8xxie9WeiK1kq
    oNjqlddW4H56VcUey4TuI5tyqY7RsnqvASKef.JROu.Bu69bOgG9V0jliWby
    1r0KWucW19r0GNMcLgtGseyX9xtkOtYcgPT6SVb4i+496yXkisy6eqkui0K1
    1wGde933482uXWgZspdR4mb22rYU8W5jkL2Gew5kOs3P1gkkBKO4zW5xm1ta
    YY2Z8z0JKW0ulOmdypU09pJekW53UdL2X+P1er7wCe08ccgAGdcV6YReeUYo
    20w5pMKdrQiMtqoxokUupa9r1imhSuM8gj20hBtc+k9UsoNYVJal1b2D55NI
    tFEsxzUeht2dDcsmSYW6O6e52677to9TzoUOQfDu9Tm7xdBvkdoZVAgRYum9
    ldj66Vqkg3suqNA9tMzoAx2Uyfu6f86.+8c4v2sgNMT9tB36N3Cqc+8ckv2s
    gNMT9tJ36NzCb5xha1ms6pgqacUZY9U7e2tF34NzyMW+8bQP2FpzP44hXtC9
    ..0eOWrU2FpzP44hc5N3ywPu8bEX2BMTogxy8ezxuvPOrGmsO6vm28k6+7KK
    V8b19Iz7tKdZEUj3byEmyb4EusrjATbMGAuREqtNpW5X8QHqwGuKRY8PKqeh
    YiQMqF4rFzybvJb+PKc+GosgUna7YDPnQAi1nnzHhSa.jZzvpMBZsQwqMBhs
    Qwr0GpsgwsMLxsgwtMH5s9vu0MBttwv0zUuYjlVu9XQbpG0Y+wnNMeG89Llk
    acsSBUmAaFLfSqfNrl+QG10bvfOCF4tVz65Qvei0uYee6tY+7mVx9L6W9ShY
    +4YbRJZ9bSQNiJdjWaKu+FRjdquEBe02M+xGdKKWKlDFASB2nmKSRR3xvZRj
    vj3dPWebOls1o4HAiXNSgxpnYJzCXJTvTzZ1AYCQ0bBqv+oDZXGZbvqILgn5
    YxuPY82PX70PHGyPz9fXcbdrOJCT6rLzXqSYGdHa0pYehMK+Day9T9wdOcIQ
    4kjmcIU4kxOtViaEpQhvobX3DLcWomXvTTzxfZuMlY4TFjUvxJ07weNr5MYf
    syxCtx6gMO8T15Cmc+01slq9AvZ0vDZqP65FvtC0Z6m+.stI8Gp7KMc9l67V
    xt+aK6I4nboiKgcBiKI65YbYlh8RecMtXTGWpNey8OtZ7rxt3dKu3gjs9zcZ
    tN+vYolpK0VJ9XUK7onVDWtZgmuo6WUKhzz44a9HIQGopEwTTKpKWsHRsN0h
    vsfslqN8awlFgbbA4DiKzPinRcp.S4YCx8ZROdP5hKc0pUDAQqHcdKp7sFwO
    lwmhKESZE8TzJpqm0PTSYbYudFWxoZu3WGiKwTGWx2fwUUoA1jFzXkHXSfWg
    hVCMxPW.dhdErQDngDjgKkvtJmv5FfnB.qLegr.Bf0B.r..K.vB.r..K.vB.
    r..K.vhYG..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r2r.
    X4VdHAvlB.r..K.vB.r..K.vB.r..K.vhYG..K.vB.r..K.vB.r..K.vB.r.
    .K.vB.r..K.vB.r..K.vB.r2r.XMoAj+pJA7WA+UveE7WA+UveE7WA+UveEy
    N.+UveE7WA+UveE7WA+UveE7WA+UveE7WA+UveE7WA+UveE7WuY4upUkaGTK
    7s1W0f8JXuB1qf8JXuB1qf8JXuB1qX1AXuB1qf8JXuB1qf8JXuB1qf8JXuB1
    qf8JXuB1qf8JXuB1qf85sa2eUoCD6UEXuB1qf8JXuB1qf8JXuB1qf8Jlc.1q
    f8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXud613WUh.wdUB1qf
    8JXuB1qf8JXuB1qf8JXuhYGf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXu
    B1qf8JXuB1q2rrWqx2h+nWE.8pGnWYUobTpA9UfeE3WA9UfeE3WA9UfeE3WA
    9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3Wemwu97S2ms6bj
    l4Gta4SO+TSdlcbdQqVOWm+Od9Vb3Z2wFqNi9kfckMArq4CgixHWopIk6x+P
    Gx18qk7qZNJpeBzyxMPu4hwkbhZCl9NA+Gs0HwLWj+OiLHVCIrF9XMLRy7h8
    uXrAwZnf0XnaTjEealrclg6rwTasuFyJsjXOk6UDYOFlKt8TyFR+dU3hq0hP
    F92.WburFIxPF92BqgOVCkTFxv+ovZLR3eQJov+RqJjg+4I2tg+k4t0gK7Om
    AWburFIr.F9myg0vGqgPxBX3eNNY7ng+sjB+ys7fF9Wd6F9mqLgL7ONfqWVC
    VpMjg+w9M8yZHrAL7uHAViwB+aHE92jFxn+B9sazeqvb1cWoGN2HRieoY13V
    E1HsgvXvPjF+rFL2pvbEOHVCbj3Qi6qokzeU4cplv+78eCGyWKjgIlO1que4
    V1HCXLeMLFdYLXp.FxGLvFMhuhVd9q5A19Gw2dCmgeAKLA7wFY7KaxFV.C3i
    T66mwHWVBW.ejY+QC3KokY+pFug+A7ukyoO2Fl.9brqR+Rfr1FxH9Xak9YMR
    RCXHeNt0pFMlufTL+pJ72+P9BVbDy+z6ucIK+pFtqxE4L8bqxDIsYUhzSEhT
    jZq5EEX2UGR2UFxfNESUjsDEYYqJV5CSjMDEYayRu8CSh0ZhhrVRTK2nf9Rk
    xhR4imGwjWUYexiPQcWq9e6HZ.yCx.VnXWKC3jfLfUJ4Ux.VYCx.1nLWKCXs
    WCXgdtoX7xMysUaDxconc3JCwvUwkWICWdHFtBN65X3JBhyLiY+XGtJpC2jn
    YWN5VO4P5Ql4owkLyoHywytI6XKW8rxcDIyBhxLWDWxLI+YdbIyj7mYwiLyo
    5OGQ9FLpGbNMtjYJ9yLabIyT7mYl3QlSn5OGQyAmPFJ3QgDqHm5p3YUPmLSZ
    FnLtjYRy.imnyJp4HTEOQmUFh54HSjIMEjEWxLoofwyAqTjOpe7rHnh5AXiL
    QlhqgNtDYJAMhn0.od5UUDIyTO8pHtDYRGdMtDYR6zHdDYpGcUEQdFTO5J2F
    WxLIuYSbIyjRESDsdxDNFXbb2.Pc0DY7bhJA4syEOA5DjCzEOaaVPMPmLdBN
    Knl6HmAINtWQnt4HYzHw7zonkii7cwolSCAKdzyloHyQhdVOEYNNVDjqlh+b
    jHyjW4NdR3EmLEyHJVGeJxbjLGjMEYNR7motxsLdNVEeBqbGGdFLpqb6LGww
    LPlcJxbjnmMSQliiYfLpqbKimjDvntxsavEI9yxoHyQh+rXJxbj3OSN7b7j.
    IFaJETRj3OmLEYNR7mmvJ2gvatpQtbrItLVCboRzGrwsPnosLVCao2l0RWMp
    kNaRKCTOW80bVFowrzrorTpDc+rzv6zMmUJbk5pAJAtyJ+sY6y0za+7OcrLj
    69oaQ4yyHoqx2zrlE9VmsnyN6mD8qb5tyx2iF6tJUUSmiea4prWx1sux3crZ
    4taw1smc4ZSEx0R+9lc05M0EkpY4kNUtc2sK6kkG+7u9FWrKWUcHWO87txQz
    2s5pFmyolSzcmWz3kMvPWkClV9DATjddEDd284tBO7spYMGu3lsYqWtd6tr8
    YqObZ9XBcWZ+lx7kcKeby5Bgn1mr3xG+y82mwJGam2.WKeGqWrsiO797wwy6
    uewtB0ZUAkxO4uuYyp5uzIKYtS9h0KeZwgrCKKEVdxouzkOsc2xx105oqUVu
    peMeR8lUqp8UU9Juzwq7Xtw9gr+X4iG9p665BiN75z1yj99JyRuKj0UaV7Xi
    NabWykSKKeU2DZsGOFmdaZDIuqUEb6FL8qZScxrT1Ls4tIz1cRbcJZkoqFEc
    uMI5ZOnxt1e3+zu244sS8onSqdj.Id8wN4k8HfK8R0rBB0xdOMN8H22sVOCw
    aeWcB7canSCjuqlAe2Aa3A966xguaCcZn7cEv2cvmV6966JguaCcZn7cUv2c
    nm3zkU2rOa2UCW25pTCOL610.O2gdv45umKB51PkFJOWDycvm.n964hs51Pk
    FJOWrS2AePF5smq.6VngJMTdt+iV9EF5o83r8YG97tub+meYwpmy1Ogt2cwi
    qnhDmat3blKu3skkLfhq4H3UpX00Q8RGqOBYM93cQJqGZY8SLaLpY0Hm0fdl
    CVg6GZo6+HsMrBciOi.BMJXzFEkFQbZCfTiFVsQPqMJdsQPrMJls9PsMLtsg
    QtML1sAQu0G9stQv0MFtlt5Mizz50GKhS8nN6OF0o46n2GxrbqqeRn5LXyfA
    bZEzg07O5vtlCF7YvH20hdWOB9ar9M66a2M6m+zR1mY+xeRL6OOiSRQymaJx
    YTwy7Za4M3Phza8sP3q9t4W9vaY4ZwjvHXR3F8bYRRBWFVShDlD2S55i6wr0
    NMGIXDyYJTVEMSgd.SgBlhVyNHaHplSXE9OkPC6PiCdMgIDUOT9EJq+FBiuF
    B4XFh1GDqiyi8QYfZmkgFacJ6vCYqVM6SrY4mXa1mxO16oKIJuj7rKoJuT9w
    0ZbqPMRDNkCCmfo6J8DClhhVFT6swLKmxfrBVVolO9ygUuICrcVdvUdOr4om
    xVe3rav1t0b0O.VqNlPaEZW2A1cnVa+.Hn0co+P0eooy2bm2S18eeYOIGkKc
    bIrSXbIYWOiKyTrW5qqwEi53R04at+wUiGV1LCuHDLSWts+7eSme3rTS0kZK
    EerpE9TTKhKWsvy2z8qpEQZ577MejjniT0hXJpE0kqVDoVmZQ3VvVyUm9sXS
    iPNtfbhwEZnQToNUfo7rA4dMoGOHcwktZ0JhfnUjNuEU9Vi3Gy3SwkhIshdJ
    ZE00yZHpoLtrWOiK4TsW7qiwkXpiK4av3pp1.aRCZrZDrIvqPQqgFYnK.OQu
    B1HBzPBxv0RXW0SXcCPTAfUluPV.AvZA.V.fE.XA.V.fE.XA.V.fE.XwrC.f
    E.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.1aV.rbKOj.XSA.V
    .fE.XA.V.fE.XA.V.fE.XwrC.fE.XA.V.fE.XA.V.fE.XA.V.fE.XA.V.fE.
    XA.V.fE.XA.1aV.rlz.xeUk.9qf+J3uB9qf+J3uB9qf+J3uhYGf+J3uB9qf+
    J3uB9qf+J3uB9qf+J3uB9qf+J3uB9qf+J3uB9q2r7W0pxsCpE9V6qZvdErWA
    6UvdErWA6UvdErWA6UL6.rWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA6Uvd
    ErWA6Uvd81s6upzAh8pBrWA6UvdErWA6UvdErWA6UvdEyN.6UvdErWA6UvdE
    rWA6UvdErWA6UvdErWA6UvdErWA6UvdErWuca7qJQfXuJA6UvdErWA6UvdEr
    WA6UvdErWwrCvdErWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA6UvdErWA60
    aV1qU4awezqBfd0CzqrpTNJ0.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7q.+Jv
    uB7q.+JvuB7q.+JvuB7q.+JvuB7q.+JvuB7quy3We9o6y1cNRy7C2s7omepI
    OyNNunUqmqy+GOeKNbs6XiUmQ+Rvtxl.107gvQYjqT0jxc4enCY690R9UMGE
    0OA5Y4Fn2bw3RNQsASemf+i1ZjXlKx+mQFDqgDVCerFFoYdw9WL1fXMTvZLz
    MJxhuMSvakY3NaL0V6qwrRKI1S4dEQ1ig4haO0rgzuWEt3ZsHjg+MvE2KqQh
    Ljg+svZ3i0PIkgL7eJrFiE9mQJ7uzpBY3edxsa3eYtac3B+yYvE2KqQBKfg+
    4bXM7wZHjr.F9miSFOZ3+DRg+4VdPC+KucC+yUlPF9GGv0KqAK0Fxv+X+l9Y
    MD1.F9Wj.qwHg+4ojB+aRCYzeA+1M5uUXN6tqzCmaDowuzLabqBaj1PXLXHR
    ieVClaUXthGDqANR7nw8szR5up7NUS3e99ugi4qExvDyG602ubKajALluFFC
    uLFLU.C4CFXiFw2PKO+U8.a+i3augyvufEl.9XiL9kMYCKfA7Qp88yXjKKgK
    fOxr+nA70zxreUi2v+.92x4zmaCS.eN1UoeIPVaCYDersR+rFIoALjOG2ZUi
    FyWQJleUE96eHeAKNh4e582tjkeUC2U4hbldtUYhj1rJQ5oBQJRsU8hBr6pC
    o6JCYPmhoJxVhhrrUEK8gIxFhhrsYo29gIwZMQQVKIpkaTPeoRYQo7wyiXxq
    prO4QnntqU+ucDMf4AY.KTrqkAbRPFvJk7JY.qrAY.aTlqkAr1qArPO2TLd4
    l41pMB4tTzNbkgX3p3xqjgKODCWAmccLbEAwYlwrerCWE0gaRzrKGcqmbH8H
    y7z3Rl4Tj43Y2jcrkqdV4NhjYAQYlKhKYlj+LOtjYR9yr3Ql4T8miHeCF0CN
    mFWxLE+YlMtjYJ9yLS7HyIT8min4fSHCE7nPhUjScU7rJnSlIMCTFWxLoYfw
    SzYE0bDphmnyJCQ8bjIxjlBxhKYlzTv34fUJxG0OdVDTQ8.rQlHSw0PGWhLk
    fFQzZfTO8pJhjYpmdUDWhLoCuFWhLocZDOhL0itphHOCpGckaiKYlj2rItjY
    RohIhVOYBGCLNta.ntZhLdNQkf714hm.cBxA5hmsMKnFnSFOAmETycjyfDG2
    qHT2bjLZjXd5TzxwQ9t3TyogfEO5YyTj4HQOqmhLGGKBxUSweNRjYxqbGOI7
    hSlhYDEqiOEYNRlCxlhLGI9yTW4VFOGqhOgUtiCOCF0Utcli3XFHyNEYNRzy
    loHywwLPF0UtkwSRBXTW41M3hD+Y4Tj4HweVLEYNR7mIGdNdRfDiMkBJIR7m
    SlhLGI9ySXk6P3MW0HWN1DWFqAtTI5C13VHzzVFqgszayZoqF0RmMokApmq9
    ZNKizXVZ1TVJUhteVZ3c5lyJEtRc0.k.2Yk+1r84Z5se9mNVY3c+zsn74YD2
    U.bZVyBeqyVzYmssf9UNc2Y46QicWkppoywusbU1KY61WY7NVsb2sX61ytbs
    oB4ZoeeytZ8l5hR0r7RmJ2t61k8xxie9WeiK1kqpNjqmddW4H56VcUiy4TyI
    5tyKZ7xFXnqxASKeh.JROuBBu69bWgG9V0rliWby1r0KWucW19r0GNMeLgtK
    seSY9xtkOtYcgPT6SVb4i+496yXkisyafqkui0K11wGde933482uXWgZspfR
    4m722rYU8W5jkL2Iew5kOs3P1gkkBKO4zW5xm1taYY6Z8z0JqW0ulOodypU0
    9pJekW53UdL2X+P1er7wCe08ccgQGdcZ6YReekYo2Ex5pMKdrQmMtq4xokku
    paBs1iGiSuMMhj20pBtcCl9UsoNYVJal1b2DZ6NItNEsxzUiht2lDcsGTYW6
    O7e526771o9TzoUORfDu9Xm7xdDvkdoZVAgZYumFmdj66Vqmg3suqNA9tMzo
    Ax2Uyfu6fM7.+8c4v2sgNMT9tB36N3Sqc+8ckv2sgNMT9tJ36NzSb5xpa1ms
    6pgqacUpgGlc6Zfm6PO3b82yEAcanRCkmKh4N3S.T+8bwVcanRCkmK1o6fOH
    C81yUfcKzPkFJO2+QK+BC8zdb19rCed2Wt+yurX0yY6mP26t3wUTQhyMWbNy
    kW71xRFPw0bD7JUr55ndoi0GgrFe7tHk0Csr9IlMF0rZjyZPOyAqnj.oz8ej
    1FVgtwmQ.gFELZihRiHNsAPpQCq1Hn0FEu1HH1FEyVen1FF21vH2FF61fn25
    C+V2H35FCWSW8lQZZ85iEwodTm8Gi5z7cz6CYVt00OITcFrYv.NsB5vZ9GcX
    WyAC9LXj6ZQuqGA+MV+l88s6l8yeZI6yre4OIl8mmwIon4yME4Lp3Ydss7Fb
    HQ5s9VH7Ue27Ke3srbsXRXDLIbidtLIIgKCqIQBSh6Ic8w8X1ZmliDLh4LEJ
    qhloPOfoPASQqYGjMDUyIrB+mRngcnwAulvDhpGJ+Bk0eCgwWCgbLCQ6Ch0w
    4w9nLPsyxPisNkc3grUql8I1r7SrM6S4G68zkDkWRd1kTkWJ+3ZMtUnFIBmx
    ggSvzckdhASQQKCp81XlkSYPVAKqTyG+4vp2jA1NKO3JuG17zSYqOb1MXa2Z
    t5G.qUGSnsBsq6.6NTqse.Dz5tzen5uzz4aty6I69uurmjixkNtD1ILtjrqm
    wkYJ1K8003hQcbo57M2+3pwCKalgWDBloK21e9uoyObVpo5RskhOV0BeJpEw
    kqV34a59U0hHMcd9lORRzQpZQLE0h5xUKhTqSsHbKXq4pS+VroQHGWPNw3BM
    zHpTmJvTd1fbulziGjt3RWsZEQPzJRm2hJeqQ7iY7o3RwjVQOEsh55YMD0TF
    W1qmwkbp1K90w3RL0wk7MXbUUafMoAMVMB1D3Unn0PiLzEfmnWAaDAZHAY3Z
    Irq5IrtAHp.vJyWHKf.Xs..K.vB.r..K.vB.r..K.vB.rX1A.vB.r..K.vB.
    r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..6MK.VtkGR.ro..K.vB.r..K.v
    B.r..K.vB.rX1A.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r.
    .6MK.VSZ.4upR.+UveE7WA+UveE7WA+UveE7WwrCveE7WA+UveE7WA+UveE7
    WA+UveE7WA+UveE7WA+UveE7WA+0aV9qZU41A0Beq8UMXuB1qf8JXuB1qf8J
    XuB1qf8Jlc.1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXud6
    18WU5.wdUA1qf8JXuB1qf8JXuB1qf8JXuhYGf8JXuB1qf8JXuB1qf8JXuB1q
    f8JXuB1qf8JXuB1qf8JXuB1q2tM9UkHPrWkf8JXuB1qf8JXuB1qf8JXuB1qX
    1AXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf85MK60p7s3O5
    UAPu5A5UVUJGkZfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA
    9UfeE3WA9UfeE3WA9UfeE3WA902Y7qO+z8Y6NGoY9g6V9zyO0jmYGmWzp0y0
    4+imuEGt1crwpyneIXWYS.6Z9P3nLxUpZR4t7Ozgrc+ZI+plih5m.8rbCzat
    XbImn1fouSv+QaMRLyE4+yHCh0PBqgOVCizLuX+KFaPrFJXMF5FEYw2lwksx
    LbmMlZq80XVokD6obuhH6wvbwsmZ1P52qBWbsVDxv+F3h6k0HQFxv+VXM7wZ
    njxPF9OEViwB+KHE9WZUgL7OO41M7uL2sNbg+4L3h6k0HgEvv+bNrF9XMDRV
    .C+ywIiGM7OmT3etkGzv+xa2v+bkIjg+wAb8xZvRsgL7O1uoeVCgMfg+EIvZ
    LV3eFov+lzPF8Wvuci9aElyt6J8v4FQZ7KMyF2pvFoMDFCFhz3m0f4VElq3A
    wZfiDOZb+DZI8WUdmpI7Oe+2vw70BYXh4i856WtkMx.FyWCigWFClJfg7ACr
    wh3yRokm+pdfs+Q7s2vY3WvBS.erQF+xlrgEv.9H099YLxkkvEvGY1ez.9VZ
    Y1upwa3e.+a4b5ysgIfOG6pzuDHqsgLhO1VoeVijz.FxmiaspQi4aHEyupB+
    8OjufEGw7O89aWxxupg6pbQNSO2pLQRaVkH8TgHEo1pdQA1c0gzckgLnSwTE
    YKQQV1phk9vDYCQQ11rza+vjXslnHqkD0xMJnuTornT934QL4UU1m7HTT20p
    +2NhFv7fLfEJ10x.NIHCXkRdkLfU1fLfMJy0x.V60.VnmaJFubyba0FgbWJZ
    GtxPLbUb4UxvkGhgqfytNFthf3LyX1O1gqh5vMIZ1kit0SNjdjYdZbIybJxb
    7raxN1xUOqbGQxrfnLyEwkLSxelGWxLI+YV7Hybp9yQjuAi5AmSiKYlh+LyF
    WxLE+YlIdj4Dp9yQzbvIjgBdTHwJxotJdVEzIyjlAJiKYlzLv3I5rhZNBUwS
    zYkgndNxDYRSAYwkLSZJX7bvJE4i5GOKBpnd.1HSjo3ZniKQlRPiHZMPpmdU
    EQxL0SuJhKQlzgWiKQlzNMhGQl5QWUQjmA0itxswkLSxa1DWxLoTwDQqmLgi
    AFG2M.TWMQFOmnRPd6bwSfNA4.cwy1lETCzIimfyBp4NxYPhi6UDpaNRFMRL
    OcJZ43HeWbp4zPvhG8rYJxbjnm0SQliiEA4po3OGIxL4UtimDdwISwLhh0wm
    hLGIyAYSQliD+YpqbKimiUwmvJ2wgmAi5J2NyQbLCjYmhLGI5YyTj43XFHi5
    J2x3IIALpqb6FbQh+rbJxbj3OKlhLGI9yjCOGOIPhwlRAkDI9yISQliD+4Ir
    xcH7lqZjKGahKi0.WpD8AabKDZZKi0vV5sYszUiZoylzx.0yUeMmkQZLKMaJ
    KkJQ2OKM7NcyYkBWotZfRf6rxea19bM81O+SGKS+te5V3ddFU9HrSyZV2ac1
    gN6rS11uto6FKeOJr6pzTM8M9skqxdIa29Ja2whk6tEa2d1kqMSHWI86a1Uq
    0TWTolkW5T01c2trWVd7y+5abwtbM0gb0zy6JGQe2pq5aNm5MQ2cdMiW1+Bc
    ENXZo1TjddADd284dBO7spIMGu3lsYqWtd6tr8YqObZ5XBcOZ+lw7kcKeby5
    Bgn1mr3xG+y82mwJGam2+VKeGqWrsiO797wwy6uewtB0ZU8jxO4tuYyp5uzI
    KYtO9h0KeZwgrCKKEVdxouzkOsc2xxt05oqUVtpeMeN8lUqp8UU9Juzwq7Xt
    w9gr+X4iG9p665BCN75r1yj99pxRuqi0UaV7XiFabWSkSKqdU27YsGOEmda5
    CIuqEEb69K8qZScxrT1Ls4tIz0cRbMJZkoq9Dcu8H5ZOmxt1e1+zu244cS8o
    nSqdh.Id8oN4k8DfK8R0rBBkxdO8M8H22sVKCwaeWcB7canSCjuqlAe2A62A
    966xguaCcZn7cEv2cvGV6966JguaCcZn7cUv2cnG3zkE2rOa2UCW25pTCOL6
    10.O2gdt45umKB51PkFJOWDycvG.n964hs51PkFJOWrS2AeNF5smq.6VngJM
    Tdt+iV9EF5g83r8YG97tub+meYwpmy1Ogl2cwSqnhDmat3blKu3skkLfhq4H
    3UpX00Q8RGqOBYM93cQJqGZY8SLaLpY0Hm0fdlCVg6GZo6+HsMrBciOi.BMJ
    XzFEkFQbZCfTiFVsQPqMJdsQPrMJls9PsMLtsgQtML1sAQu0G9stQv0MFtlt
    5Mizz50GKhS8nN6OF0o46n2mwrbqqcRn5LXyfAbZEzg07O5vtlCF7YvH20hd
    WOB9ar9M66a2M6m+zR1mY+xeRL6OOiSRQymaJxYTwi7ZaY+ZJQ5s9VH7Ue27
    Ke3srbsXRXDLIbidtLIIgKCqIQBSh6Ac8w8X1ZmliDLh4LEJqhloPOfoPASQ
    qYGjMDUyIrB+mRngcnwAulvDhpmI+Bk0eCgwWCgbLCQ6Ch0w4w9nLPsyxPis
    Nkc3grUql8I1r7SrM6S4G68zkDkWRd1kTkWJ+3ZMtUnFIBmxggSvzckdhASQ
    QKCp81XlkSYPVAKqTyG+4vp2jA1NKO3JuG17zSYqOb18Wa2Zt5G.qUCSnsBs
    qa.6NTqse9Cz5lzenxuzz4atyaI69usrmjixkNtD1ILtjrqmwkYJ1K8003hQ
    cbo57M2+3pwyJalgWDBloK21e9uoyObVpo5RskhOV0BeJpEwkqV34a59U0hH
    Mcd9lORRzQpZQLE0h5xUKhTqSsHbKXq4pS+VroQHGWPNw3BMzHpTmJvTd1fb
    ulziGjt3RWsZEQPzJRm2hJeqQ7iY7o3RwjVQOEsh55YMD0TFW1qmwkbp1K90
    w3RL0wk7MXbUUZfMoAMVIB1D3Unn0PiLzEfmnWAaDAZHAY3RIrqxIrtAHp.v
    JyWHKf.Xs..K.vB.r..K.vB.r..K.vB.rX1A.vB.r..K.vB.r..K.vB.r..K
    .vB.r..K.vB.r..K.vB.r..6MK.VtkGR.ro..K.vB.r..K.vB.r..K.vB.rX
    1A.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..6MK.VSZ.4up
    R.+UveE7WA+UveE7WA+UveE7WwrCveE7WA+UveE7WA+UveE7WA+UveE7WA+U
    veE7WA+UveE7WA+0aV9qZU41A0Beq8UMXuB1qf8JXuB1qf8JXuB1qf8Jlc.1
    qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXud618WU5.wdUA1q
    f8JXuB1qf8JXuB1qf8JXuhYGf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JX
    uB1qf8JXuB1q2tM9UkHPrWkf8JXuB1qf8JXuB1qf8JXuB1qX1AXuB1qf8JXu
    B1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf85MK60p7s3O5UAPu5A5UVUJG
    kZfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9UfeE3WA9Ufe
    E3WA9UfeE3WA902Y7qO+z8Y6NGoY9g6V9zyO0jmYGmWzp0y04+imuEGt1crw
    pyneIXWYS.6Z9P3nLxUpZR4t7Ozgrc+ZI+plih5m.8rbCzatXbImn1fouSv+
    QaMRLyE4+yHCh0PBqgOVCizLuX+KFaPrFJXMF5FEYw2xOiUqLC2Yio1ZeMlU
    ZIwdJ2qHxdLLWb6olMj98pvEWqEgL7uAt3dYMRjgL7uEVCerFJoLjg+Sg0Xr
    v+JRg+kVUHC+yStcC+KycqCW3eNCt3dYMRXAL7OmCqgOVCgjEvv+bbx3QC+K
    IE9ma4AM7u71M7OWYBY3eb.WurFrTaHC+i8a5m0PXCX3eQBrFiE9WPJ7uIMj
    Q+E7a2n+Vg4r6tRObtQjF+RyrwsJrQZCgwfgHM9YMXtUg4JdPrF3HwiF2mSK
    o+px6TMg+46+FNluVHCSLerWe+xsrQFvX9ZXL7xXvTALjOXfMZDeFs77W0Cr
    8Ohu8FNC+BVXB3iMx3W1jMr.FvGo12OiQtrDt.9Hy9iFvOgVl8qZ7F9Gv+VN
    m9baXB3ywtJ8KAxZaHi3isU5m0HIMfg743VqZrX9ojB4WUf+9GwWvhiP9md+
    sqX4WUvcUsHmolaUkHoMKRjdJPjhLaUul.6t3P5tvPFzmXphrknHKaUvReXh
    rgnHaaV4seXRrVSTj0RhZ4F0yWpTVTIe77.l7pB6SdjIp6Z0+aGQCXdPFvBE
    6ZY.mDjArRIuRFvJaPFvFk4ZY.q8Z.KzyMEiWtYtsZePtKEsCWYHFtJt7JY3
    xCwvUvYWGCWQPblYL6G6vUQc3lDM6xQ25AGROxLOMtjYNEYNd1MYGa4pmUti
    HYVPTl4h3RlI4OyiKYlj+LKdjYNU+4Hx2fQ8fyowkLSwelYiKYlh+LyDOxbB
    U+4HZN3DxPAOJjXE4TWEOqB5jYRy.kwkLSZFX7DcVQMGgp3I5rxPTOGYhLoo
    fr3RlIMELdNXkh7Q8imEAUTO.ajIxTbMzwkHSInQDsFH0SuphHYl5oWEwkHS
    5vqwkHSZmFwiHS8nqpHxyf5QW413RlI4MahKYlTpXhn0Slvw.ii6F.pqlHim
    STIHuct3IPmfbft3YayBpA5jwSvYA0bG4LHww8JB0MGIiFIlmNEsbbjuKN0b
    ZHXwid1LEYNRzy5oHywwhfb0T7miDYl7J2wSBu3joXFQw53SQlij4froHyQh
    +L0Utkwywp3SXk63vyfQckam4HNlAxrSQliD8rYJxbbLCjQckaY7jj.F0Utc
    CtHweVNEYNR7mESQliD+YxgmimDHwXSofRhD+4joHyQh+7DV4NDdyU8wki8v
    kw5eKUh9f8sEB8rkw5WK81qV5pOszYOZYf54pudyxH8kkl8jkRkn6mkFdmt4
    rJgqTWMPEv8Z0usqQ6muypzs7YuVpqfmUsZzyc1eN6rMy2upo6xbafRbqyxa
    KLpjsy1m67s8y+Da.chr7I7jw8.qPylrN4TeGmrNIomA94xX1tlSW9skqxdI
    a29J24i0O3cK1t8rKWK3PtR522rqVy5tn1UKuzoBP7tcYur73m+023hc4ZpC
    4pom2UNh9tUW0IgN0slt6rJcUV9fxhWVZkLt6WkB9YUU4c2mO83guUEI43E2
    rMa8x0a2ksOa8gSwnRnOM2uvHeY2xG2rtPHp8IKt7w+b4itxJE87dZa46X8h
    sc7g2mONdd+8K1UnXqpwV9oX.a1rp9KcxVl6kuX8xmVbH6vxRgkmb5Kc4Sa2
    srrC1d5Zkkv6WyCzsY0pZeUkuxKc7JOlateH6OV93gu59ttvHluFJ6LouuRO
    06Z6c0lEO1nYO20j4zxR5046o83Ia0aSuY4csPoa2yseUaljGna7G4om2GhR
    bsN6TVWcN6d6Z10dxscs+zPpeeyy6u7SQmV8LRR75ygyK6YhW5kpYEDJt+d5
    j7ebdtbkZ756+7dnRoqq5xcc0Iv0sgNMPttZ1MjqKOwLyZFUOWqAP3cXWMG9
    tMzogx2U.e2Ae506uuqD9tMzogx2UAe2gdBbWVt29raWMbcqqRM7vrYWC7bG
    5AIr+dtHnaCUZn7buoh4pTT1V1YOPTKcb83TZJrS2FpzP43Jfi6.OVG81wUf
    8JzPkFJG2+QK6BC8ru7H8uO+xhUOmseB8x7hmdSE4L2bwoKWdwaJKY.EWyQv
    qHwpqi5EMVe3wZ7w6BSVOnx5GW1XHypgMqA5LtiYgtDZgzQsPZaXG5lcFA9Y
    TXnMJGMhrzFfmFMlZivUaT1ZivWaTFa8wYaXVaCyaaXlaCxcqO1acyeqaFbM
    c1aFqo0qOVLm5wc123tNXvMUWBjy55uFpNC2LXHmduaDnE5Y3vOCF6tV765w
    vei0uYee6tY+7mVx9L6W9ShY+4YbRJZ9bSQNiJdFfaK4xmH8VeKD9pua9kO7
    lVtVLILBlDtQOWljjvkg0jHgIw8j+93tLasWyQBFwblBkUQyTnGvTnfon0rC
    xFhp4DVg+SIzvNz3nWSXBQUSJPnr9aHL9ZHjiYHZeTrNNQ1GkApcZFZr0orC
    OjsZ0rOwlkelsYeJ+fumtjn7Rxytjp7R4GXqw8A0HQ3TNLbBltqDTLXRJZYP
    s2FyrbJCxJXYkZ93OGV8lLv1Y4AW48vlmdJa8gytii6VyU+.XsZgDsUnccKo
    2gZs8SjgVksvPEjpoy2bm2j58eipOIGkKcbIrSXbIYWOiKyTrW5qqwEi53R0
    4at+wUimd3LCuHDLqLCOE+lN+vYolpK0VJ9XUK7onVDWtZgmuo6WUKhzz44a
    9HIQGopEwTTKpKWsHRsN0hvsfslqN8awlFgbbA4DiKzPinRcp.S4YCx8ZROd
    P5hKc0pUDAQqHsk3m3y4Gy3SwkhIshdJZE00yZHpoLtrWOiK4TsW7qiwkXpi
    K4av3ppXIaxCZrhlrIxqPQqgFYnK.OQuB1HBzPBxvEWYWEXYcCPTgfUluPV.
    QvZABVOPv5NCeB.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r.
    .K.vB.r..K.vB.r..K.vB.r..60J.VtkGR.ro..K.vB.r..K.vB.r..K.vB.
    rX1A.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..K.vB.r..6MK.VSZ.4
    upR.+UveE7WA+UveE7WA+UveE7WwrCveE7WA+UveE7WA+UveE7WA+UveE7WA
    +UveE7WA+UveE7WA+0aV9qZU41A0Beq8UMXuB1qf8JXuB1qf8JXuB1qf8Jlc
    .1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXud618WU5.wdUA
    1qf8JXuB1qf8JXuB1qf8JXuhYGf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8
    JXuB1qf8JXuB1q2tM9UkHPrWkf8JXuB1qf8JXuB1qf8JXuB1qX1AXuB1qf8J
    XuB1qf8JXuB1qf8JXuB1qf8JXuB1qf8JXuB1qf85MK60p7s3O5UAPu5A50xC
    tWtGT.eEvWA7U.eEvWA7U.eEvWA7U.eEvWA7U.eEvWA7U.eEvWA7U.eEvWA7
    U.eEvWA7U.eEvWA702Q3qO+z8Y6NGnY9g6V9zyO0jlYGmWzp0y04+imuEGt1
    crwpyneIPWYS.5Z9P3nLxUpZR4t7Ozgrc+ZI+plih5m.8rbCzatXbImn1fou
    Sv+QaMRLyE4+yHCh0PBqgOVCizLuX+KFaPrFJXMF51DYw2lYakX3N6J0V6qg
    rRKA1S4FEQ1ic4h6M0rgTuWEd3ZsHjQ+MvC2KqQhLjQ+svZ3i0PIkgL5eJrF
    iD82PJ5uzpBYzedxsazeYtWc3h9yYvC2KqQBKfQ+4bXM7wZHjr.F8miyEOVz
    eMon+bKOnQ+k2tQ+4JSHi9iS25k0fkZCYzeraS+rFBa.i9KRf0Xjn+JRQ+Mo
    gL3ufe6F72JLmcmU5guMBz3WJlMtEgMRaHLFLDnwOqAysHLWwCh0.GHdrv9R
    ZI7WUdSpI7OW+2vg70BYXB4ic56WdkMx.FxWCigWFClJfQ7A+qwB3Knki+pd
    es+A7s2vY2WvBS7drMF+xjrgEv38Hs99YLxkkvEuGY0er38bZY0upea3e79a
    474ysgIdOG6ozujGqsgLfO1ToeVijz.FwmiappwB4yHExupx98OhufEGg7O8
    9aWpxupf6pLQNSM2p7PRaVcH8TYHE40pdw.1cUgzcEgLnOwTEYKQQV1pRk9v
    DYCQQ11rja+vjXslnHqkD0xMJjuTornD934AL4UUzm7HOT20p+2NhFv7fLfE
    J10x.NIHCXkRdkLfU1fLfMJy0x.V60.VnmaJFubyba09fbWJZGtxPLbUb4Ux
    vkGhgqfytNFthf3LyX1O1gqh5vMIZ1kit0SLjdjYdZbIybJxb7raxN1xUOqb
    GQxrfnLyEwkLSxelGWxLI+YV7Hybp9yQjuAi5AmSiKYlh+LyFWxLE+YlIdj4
    Dp9yQzbvIjgBdTHwJxotJdVEzIyjlAJiKYlzLv3I5rhZNBUwSzYkgndNxDYR
    SAYwkLSZJX7bvJE4i5GOKBpnd.1HSjo3ZniKQlRPiHZMPpmdUEQxL0SuJhKQ
    lzgWiKQlzNMhGQl5QWUQjmA0itxswkLSxa1DWxLoTwDQqmLgiAFG2M.TWMQF
    OmnRPd6bwSfNA4.cwy1lETCzIimfyBp4NxYPhi6UDpaNRFMRLOcJZ43HeWbp
    4zPvhG8rYJxbjnm0SQliiEA4po3OGIxL4UtimDdwISwLhh0wmhLGIyAYSQli
    D+YpqbKimiUwmvJ2wgmAi5J2NyQbLCjYmhLGI5YyTj43XFHi5J2x3IIALpqb
    6FbQh+rbJxbj3OKlhLGI9yjCOGOIPhwlRAkDI9yISQliD+4IrxcH7lqZfKGa
    dKi03VpD8AaXKDZVKi0nV5sIszUCZoylyx.0yUeMkkQZHKMaFKkJQ2OKM7Nc
    yYUBWotZfJf60pe62WdX9xCY6lcrtv6rLcqdxqU9TET2p2B2YYH14SY+9UNM
    JzMQ0UaWja+kp+2o+3cUnagS47zhbOwuOa6tBo3gMq1raedPlG95hcyXobBJ
    spGoEV1j0ZJ8T0Z79zZ4ijesbj7do6VsYwiEct2YmdRR1oRJszYh65rilzIq
    iRmrNh0qmUP0JmW9uCMxULWemKY5ib03i7ApZWpdNcUstugtM+aql8kcaddK
    wIWoN8lwLr1i2QDIavla8dMiZ+1rrGWs7oQlQUpY3FWaMznltlI88cFk68Tu
    .jKURM2.SkpZjzjP4Vbq8NVZuakV1Lxhiff3TOEZuoxSsaPTRkHQGhSqNwqq
    xlzlx01zt+i62d8OTPG.I9N.Bm3vnHO1ooO4RsqRwRRKqLt74vm902.MJogv
    6nF0RPbXueyfSUTkG16i7noDfS8toezTBond+rWZJ9O52Q4wPQdruexiND5m
    lsWat6Qypr7bML0q+1aP.Ks5MXDvstEwdmFAIuAi.oR8NNBnrL76lOshzRXr
    2O4gTLnj2W4YrXzhItMEEW31WRp6o114+1af+lhhCWcnRusZTJwfTueQ0qeq
    7EpXhkaDUZjmGQo32dKrvTLvua5SIE8YCmx2R4QPYF76n3PQ8vd+Nz.kSYqd
    +7d3uASF0Zd4B5t4jmVdO+2dClLxo3sM0APZ4.Hkc9.n32dKNTKkccyd+hOy
    n3gN0UfMItTjWz0cy+OVA28bgpwuJS3ms9r62dKz2jV+4RWetLqfK1t8krc6
    q9NchxcOs322rq3W0+ker7opY4u5xB4c6xdY4w2e4aXwtG95xCYOb34ckYx7
    6V8c+Xwem+m+3++bfo9uB
    -----------end_max5_patcher-----------
    Hope this works for others besides me!

    Cheers,
    David

  16. #16
    Junior Member
    Join Date
    Dec 2013
    Posts
    3
    Wow, I got busy with work then managed to get back to the thread and wow!

    I'll be honest I'm new to the Teensy and didn't realize it was so drop-in replacement for Arduino. Beautiful implementation and installer. I have the tpm2serial sketch already, so tonight and tomorrow I'm going to try to look into it and tying it to OctoWS2811.

    I'll try to get a picture of the array part I've built so far.

    Also, I thought Artnet was just dmx512 shoved across ethernet in UDP packets, and still had the 512 limit. I thought people were just creating a bunch of universes and running them across the wire to stack up the channels?

  17. #17
    Junior Member
    Join Date
    Dec 2013
    Posts
    3
    Quote Originally Posted by mortonkopf View Post
    Telmnstr, I have been playing around with PixelController and have it running in a very basic way with Octows2811. Is this what you were looking for?

    You can replace the arduino sketch that resides in the > Integration > ArduinoFw folder with another one that you can write for OctoWS2811 to upload to the Teensy 3. I changed the FastSpi sketch within the folder by replacing #include for OctoWS2811 and changing the calls to fastspi to the appropriate ones for the Octo lib.

    You will also need to change the config.properties file to change the RGB setting to the correct order. After some messing around I found that this srips I am using are BGR. You can find this file in the >data > folder.

    You will need to make some changes to the sketch to the panel number and in the properties file to the orientation and panel flow settings, but I still have not completed a fully working model for long strips.
    The PixelInvader software seems to have some sort of access limits on it (save settings?), but I have only used the free download. Is there a paid for version with bells and whistles?

    So, to recap, change the fastspi sketch for an Octo compatible one, upload. Change the config.properties file RGB setting (I used the Pixelinvaders example config file as a basis).
    The config file also describes the E1.31 settings for multiple universe configurations, but I have not had time to get into that yet.
    Hopefully this is what you were asking about.
    Cool! Going to try tonight. I've tried using the Ada library moved into tpm2net, tpm2serial, and at least one other without success (this is before I started looking at teensy.) So I'll try using Octows2811 with tpm2serial and see what happens :-)

  18. #18
    Senior Member
    Join Date
    Nov 2012
    Location
    Los Angeles
    Posts
    126
    Quote Originally Posted by telmnstr View Post
    Wow, I got busy with work then managed to get back to the thread and wow!

    Also, I thought Artnet was just dmx512 shoved across ethernet in UDP packets, and still had the 512 limit. I thought people were just creating a bunch of universes and running them across the wire to stack up the channels?
    It is. One universe can only control ~170 rgb leds. So you need many many universes to control what even a single T3 is capable of controlling. I think with only minor modification you can have it so it reads the universe from the incoming packet:

    Code:
    incoming_universe= bytes_to_short(packetBuffer[15],packetBuffer[14])
    then map the incoming universe to the pixel you want to control via the octoWS2811 library, rather than using it as a filter. e.g.:

    if universe == 0, set start pixel to 0
    if universe == 1, set start pixel to 170
    if universe == 2, set start pixel to 340

    set colors
    display colors

    rinse, repeat.

    David

  19. #19
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    I have managed to get the PixelController software to work with Octows2811 lib. Having spent some time discussing setup with michu who put the software together, we have managed to get it running for a 32x8 array as a starter. Two videos of simple mix is here:

    http://youtu.be/u_jYIPlWgLc

    http://www.youtube.com/watch?v=r8n-B_sGqOs

    This is a great little controller that can control the array output through a simple interface. I will post some working config values and sketch after some testing.
    Last edited by mortonkopf; 12-27-2013 at 04:59 PM.

  20. #20
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    Paul, as requested, here is the sketch and the config file for the pixel controller software so that it works with Teensy 3.0 and Octows2811 lib. I have tested it with a 32x8 array, but would appreciate it if someone else could test this also. There are a number of config parameters that had to be changed. The pixel controller does not auto detect the port in the tpm2serial mode, so this must be done manually in the config file.

    Main pixel controller web site: http://pixelinvaders.ch/?page_id=160
    Download Pixel controller software from: https://code.google.com/p/pixelcontr...downloads/list

    The set up is as follows. In the pixel controller folder go to >Data> folder. replace config.properties file with the one attached here.
    open the config file and set the port to the correct name, and set the resolution x and y values to your array size. Save the config file as config.properties in the data folder and delete the original config file. (it is posted below as a txt file to get around the .properties constraint in uploading.)
    Open the sketch below. Set the led strip length values and the define NUM LEDS value to what you have.
    Load the sketch and then run the PixelController jar file.

    octotpm2serial.ino
    config.txt

  21. #21
    Senior Member
    Join Date
    Jun 2013
    Location
    Montréal
    Posts
    473
    Do you guys think it would be feasible to record the sequence to sd and play it back stand alone on the teensywithout a computer ?
    Last edited by nlecaude; 12-27-2013 at 09:21 PM. Reason: typo

  22. #22
    Junior Member
    Join Date
    Jan 2013
    Posts
    15
    Quote Originally Posted by mortonkopf View Post
    Paul, as requested, here is the sketch and the config file for the pixel controller software so that it works with Teensy 3.0 and Octows2811 lib. I have tested it with a 32x8 array, but would appreciate it if someone else could test this also. There are a number of config parameters that had to be changed. The pixel controller does not auto detect the port in the tpm2serial mode, so this must be done manually in the config file.
    ...
    currently only one panel is supported - however if someone can test this firmware on multiple panels I'll add support for multipanels. Just let me know.

    Michu

  23. #23
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    Video capture and display to Octows2811…. Hi all, still playing with michu's pixel controller. I found that you can do video capture and display in real time with his software and display it straight to the octows2811 array. I have attached a short video. The update rate looks bad because the youtube video I captured from the screen was a low rate animation, it actually updates video capture very quickly. The software puts a red box on the screen and displays whatever is inside the box on the led array. Because I am only using a 32x8 array, its very pixelated, but it works without problems. Might be useful for video feeds.

    http://youtu.be/sTNKpLORB8I

  24. #24
    Senior Member mortonkopf's Avatar
    Join Date
    Apr 2013
    Location
    London, uk
    Posts
    966
    Quote Originally Posted by nlecaude View Post
    Do you guys think it would be feasible to record the sequence to sd and play it back stand alone on the teensywithout a computer ?
    Well, not sure. I guess you could set up a write to a file on sd card capturing whatever info is coming in on the serial (paste append?), but I'm not convinced that you could spit out the info fast enough from the sd card for any decent size of array at a decent frame rate, but I could be wrong. I have the output from pixel controller currently set to 50 frames a sec to give a smooth flow of colour change, and I think that would be a lot of data to write and read to sd card for this small array. I found that even with my small graphic poi (pixel poi) set up, getting a high refresh rate was not easy.

    Would be interested to see how you get on with this idea.
    Last edited by mortonkopf; 01-01-2014 at 02:50 PM.

  25. #25
    Member
    Join Date
    Feb 2014
    Location
    australia
    Posts
    83
    Hey all,
    I'm new to the teensy and similar stuff.
    I have been doing a bit of looking up with the arduino with artnet to led drivers.
    But there was a problem with arduino's artnet that it will freeze when doing videos over more then 3 universes of artnet due to it being a broadcast protocol not a unicast, thus making it hang as it can't handle all the data it was getting.
    Anyway to my question,
    Can the teensy cope with getting 16+ universes
    If it can is there a list of parts that I need? And wiring map?
    I plan on using ws2812 LEDs

    Sorry if this don't make seance
    Hope u guys can help and thanks in advance

    Nick

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •