Artnet to OctoWS2811?

telmnstr

New member
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
 
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.
 
@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 !
 
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
 
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
 
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.
 
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.
 
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 ?
 
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.
 
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.
 
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.
 
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.
 
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
 
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
 
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?
 
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 :)
 
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
 
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:
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/pixelcontroller/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.

View attachment octotpm2serial.ino
View attachment config.txt
 
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:
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
 
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
 
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:
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
 
Back
Top