@@ -1,100 +0,0 @@ | |||
# data file for the Fltk User Interface Designer (fluid) | |||
version 1.0300 | |||
header_name {.H} | |||
code_name {.C} | |||
decl {\#include <FL/Fl.H>} {private local | |||
} | |||
decl {\#include <FL/Fl_Shared_Image.H>} {private local | |||
} | |||
decl {\#include <FL/filename.H>} {private local | |||
} | |||
Function {open_url( const char *url )} {open return_type void | |||
} { | |||
code {fl_open_uri( url );} {} | |||
} | |||
class About_Dialog {open | |||
} { | |||
Function {About_Dialog( const char *logo_filename )} {open | |||
} { | |||
code {make_window( logo_filename );} {} | |||
} | |||
Function {run()} {open return_type void | |||
} { | |||
code {window->show(); | |||
while ( window->shown() ) | |||
Fl::wait(); | |||
delete window;} {} | |||
} | |||
Function {make_window( const char *logo_filename )} {open private | |||
} { | |||
Fl_Window window { | |||
label About | |||
callback {o->hide(); | |||
if ( logo_box->image() ) | |||
{ | |||
((Fl_Shared_Image*)logo_box->image())->release(); | |||
logo_box->image( 0 ); | |||
}} open selected | |||
private xywh {879 215 560 695} type Double | |||
visible | |||
} { | |||
Fl_Tabs {} {open | |||
xywh {0 352 558 296} | |||
} { | |||
Fl_Group {} { | |||
label Credits open | |||
xywh {2 386 553 261} | |||
} { | |||
Fl_Box credits { | |||
label {} | |||
xywh {5 389 545 249} box ROUNDED_BOX color 46 labelsize 18 | |||
} | |||
} | |||
Fl_Group {} { | |||
label License open | |||
xywh {2 378 553 268} hide | |||
} { | |||
Fl_Box copyright { | |||
label COPYRIGHT | |||
xywh {43 389 462 22} labeltype SHADOW_LABEL labelfont 1 labelsize 18 | |||
} | |||
Fl_Box {} { | |||
label {This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. | |||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.} | |||
xywh {10 414 535 225} box ROUNDED_BOX color 46 labelfont 1 labelsize 12 labelcolor 53 align 144 | |||
} | |||
} | |||
} | |||
Fl_Box logo_box { | |||
label VERSION | |||
xywh {5 5 550 305} color 48 labelfont 1 labelsize 18 align 16 | |||
code0 {o->image( Fl_Shared_Image::get( logo_filename ) );} | |||
code1 {o->label( VERSION );} | |||
} | |||
Fl_Return_Button {} { | |||
label Rock | |||
callback {o->window()->do_callback();} | |||
xywh {400 660 76 30} | |||
} | |||
Fl_Button website_url { | |||
label {http://non-daw.tuxfamily.org} | |||
callback {open_url( o->label() );} | |||
xywh {125 660 245 30} color 14 labeltype SHADOW_LABEL labelcolor 6 | |||
} | |||
Fl_Box title { | |||
label TITLE | |||
xywh {5 317 545 29} labeltype SHADOW_LABEL labelfont 3 labelsize 17 | |||
} | |||
} | |||
} | |||
} |
@@ -1,162 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Button.H> | |||
#include <FL/Fl.H> | |||
/* Kind of like Fl_Light_Button except that the whole thing is the | |||
* indicator and it can optionally blink */ | |||
class Fl_Blink_Button : public Fl_Button | |||
{ | |||
bool _on; | |||
int _blink_interval; | |||
bool _blinking; | |||
bool _ignore_input; | |||
static void | |||
update_cb ( void *v ) | |||
{ | |||
((Fl_Blink_Button*)v)->update_cb(); | |||
} | |||
float | |||
blink_interval_as_fraction_of_seceond ( void ) const | |||
{ | |||
return (float)_blink_interval / 1000; | |||
} | |||
void | |||
update_cb ( void ) | |||
{ | |||
Fl::repeat_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this ); | |||
_on = ! _on; | |||
redraw(); | |||
} | |||
public: | |||
enum | |||
{ | |||
SLOW=500, | |||
MEDIUM=300, | |||
FAST=100, | |||
DEFAULT=500 | |||
}; | |||
Fl_Blink_Button ( int X, int Y, int W, int H, const char *L=0 ) | |||
: Fl_Button( X, Y, W, H, L ) | |||
{ | |||
_blinking = true; | |||
_on = false; | |||
_ignore_input = false; | |||
_blink_interval = DEFAULT; | |||
type( FL_TOGGLE_BUTTON ); | |||
} | |||
virtual | |||
~Fl_Blink_Button () | |||
{ | |||
if ( value() ) | |||
Fl::remove_timeout( update_cb, this ); | |||
} | |||
void ignore_input ( bool b ) | |||
{ | |||
_ignore_input = b; | |||
} | |||
bool ignore_input ( void ) const | |||
{ | |||
return _ignore_input; | |||
} | |||
void blink ( bool b ) | |||
{ | |||
_blinking = b; | |||
if ( ! b ) | |||
_on = true; | |||
} | |||
bool blink ( void ) const | |||
{ | |||
return _blinking; | |||
} | |||
void | |||
blink_interval ( float v ) | |||
{ | |||
_blink_interval = v * 1000; | |||
if ( value() ) | |||
{ | |||
Fl::remove_timeout( update_cb, this ); | |||
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this ); | |||
} | |||
} | |||
virtual void value ( float v ) | |||
{ | |||
bool b = v; | |||
if ( b != value() ) | |||
{ | |||
if ( b ) | |||
{ | |||
if ( _blinking ) | |||
{ | |||
/* just to be safe.. */ | |||
Fl::remove_timeout( update_cb, this ); | |||
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this ); | |||
} | |||
Fl_Button::value( b ); | |||
redraw(); | |||
} | |||
else | |||
{ | |||
Fl_Button::value( b ); | |||
Fl::remove_timeout( update_cb, this ); | |||
redraw(); | |||
} | |||
} | |||
} | |||
virtual float value ( void ) { return (bool)Fl_Button::value(); } | |||
virtual void | |||
draw ( void ) | |||
{ | |||
draw_box( value() ? box() : down_box(), x(), y(), w(), h(), | |||
( value() != 0 && _on ) ? selection_color() : color() ); | |||
draw_label(); | |||
} | |||
virtual int handle ( int m ) | |||
{ | |||
if ( _ignore_input ) | |||
return 0; | |||
else | |||
return Fl_Button::handle( m ); | |||
} | |||
}; |
@@ -1,124 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Fl_DialX.H" | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
void | |||
Fl_DialX::draw ( void ) | |||
{ | |||
int X,Y,S; | |||
int act = active_r(); | |||
{ | |||
int ox, oy, ww, hh, side; | |||
ox = x(); | |||
oy = y(); | |||
ww = w(); | |||
hh = h(); | |||
if (ww > hh) | |||
{ | |||
side = hh; | |||
ox = ox + (ww - side) / 2; | |||
} | |||
else | |||
{ | |||
side = ww; | |||
oy = oy + (hh - side) / 2; | |||
} | |||
side = w() > h() ? hh : ww; | |||
X = ox; | |||
Y = oy; | |||
S = side; | |||
} | |||
draw_box(); | |||
draw_label(); | |||
double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1(); | |||
fl_draw_box( box(), X, Y, S, S, color() ); | |||
/* shrink a bit */ | |||
int OX = x(); | |||
int OY = y(); | |||
X += S / 8; | |||
Y += S / 8; | |||
int OS = S; | |||
S -= S / 4; | |||
fl_line_style( FL_SOLID, S / 12 ); | |||
/* background arc */ | |||
Fl_Color c = fl_darker( color() ); | |||
if ( !act ) | |||
c = fl_inactive( c ); | |||
fl_color( c ); | |||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() ); | |||
/* foreground arc */ | |||
c = selection_color(); | |||
if ( !act ) | |||
c = fl_inactive( c ); | |||
fl_color(c); | |||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle ); | |||
fl_line_style( FL_SOLID, 0 ); | |||
if ( act ) | |||
{ | |||
int W = OS; | |||
int H = OS; | |||
fl_push_matrix(); | |||
fl_translate(OX+W/2, OY+H/2); | |||
fl_scale(W, H); | |||
fl_rotate(310+angle); | |||
fl_color( fl_color_add_alpha( FL_WHITE, 127 )); | |||
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.12); fl_end_polygon(); | |||
fl_color( FL_WHITE ); | |||
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.06); fl_end_polygon(); | |||
fl_pop_matrix(); | |||
} | |||
fl_color( fl_contrast( labelcolor(), color() ) ); | |||
if ( Fl::belowmouse() == this ) | |||
{ | |||
char s[128]; | |||
fl_font( FL_HELVETICA, 9 ); | |||
char buf[128]; | |||
format(buf); | |||
snprintf( s, sizeof( s ), buf, value() ); | |||
fl_color( FL_FOREGROUND_COLOR ); | |||
fl_draw( s, X, Y, S, S, FL_ALIGN_CENTER ); | |||
} | |||
} |
@@ -1,36 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Dial.H> | |||
class Fl_DialX : public Fl_Dial | |||
{ | |||
public: | |||
Fl_DialX ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Dial(X,Y,W,H,L) | |||
{ | |||
} | |||
virtual void draw ( void ); | |||
virtual ~Fl_DialX() { } | |||
}; | |||
@@ -1,72 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Simple extension of Fl_Button to support different lables for the | |||
* two button states. Simpler than using a an Fl_Choice when all you | |||
* need is two states. Set the label to "foo/bar" for "foo" to be the | |||
* off label and "bar" the on. Obviously you should make sure that | |||
* each label will fit. */ | |||
#pragma once | |||
#include <FL/Fl_Button.H> | |||
#include <stdlib.h> | |||
#include <stdio.h> | |||
class Fl_Flip_Button : public Fl_Button | |||
{ | |||
char *_off; | |||
char *_on; | |||
public: | |||
Fl_Flip_Button ( int X, int Y, int W, int H, const char *L = 0 ) : | |||
Fl_Button( X, Y, W, H, 0 ) | |||
{ | |||
sscanf( L, "%m[^/]/%ms", &_off, &_on ); | |||
type( FL_TOGGLE_BUTTON ); | |||
} | |||
virtual ~Fl_Flip_Button ( ) | |||
{ | |||
if ( _off ) free( _off ); | |||
if ( _on ) free( _on ); | |||
} | |||
protected: | |||
virtual void | |||
draw ( void ) | |||
{ | |||
if ( value() ) | |||
{ | |||
if ( label() != _on ) | |||
label( _on ); | |||
} | |||
else | |||
if ( label() != _off ) | |||
label( _off ); | |||
draw_box( box(), x(), y(), w(), h(), value() ? selection_color() : color() ); | |||
draw_label(); | |||
} | |||
}; |
@@ -1,237 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Group.H> | |||
#include <FL/Fl_Pack.H> | |||
class Fl_Flowpack : public Fl_Group | |||
{ | |||
int _hspacing; | |||
int _vspacing; | |||
bool _flow; | |||
bool _flowdown; | |||
int _initial_height; | |||
int _initial_width; | |||
public: | |||
Fl_Flowpack ( int X, int Y, int W, int H, const char *L = 0 ) | |||
: Fl_Group( X, Y, W, H, L ) | |||
{ | |||
resizable( 0 ); | |||
_hspacing = _vspacing = 0; | |||
_initial_width = W; | |||
_initial_height = H; | |||
_flow = true; | |||
_flowdown = false; | |||
} | |||
virtual ~Fl_Flowpack ( ) | |||
{ | |||
} | |||
void vspacing ( int v ) { _vspacing = v; } | |||
int vspacing ( void ) const { return _vspacing; }; | |||
void hspacing ( int h ) { _hspacing = h; } | |||
int hspacing ( void ) const { return _hspacing; }; | |||
bool flow ( void ) const { return _flow; } | |||
void flow ( bool v ) { _flow = v; } | |||
bool flowdown ( void ) const { return _flowdown; } | |||
void flowdown ( bool v ) { _flowdown = v; } | |||
void | |||
add ( Fl_Widget *w ) | |||
{ | |||
Fl_Group::add( w ); | |||
dolayout(); | |||
} | |||
void | |||
remove ( Fl_Widget *w ) | |||
{ | |||
Fl_Group::remove( w ); | |||
dolayout(); | |||
} | |||
void | |||
resize ( int X, int Y, int W, int H ) | |||
{ | |||
_initial_width = W; | |||
_initial_height = H; | |||
layout(); | |||
Fl_Group::resize( X, Y, w(), h() ); | |||
} | |||
void | |||
draw ( void ) | |||
{ | |||
layout(); | |||
Fl_Group::draw(); | |||
} | |||
void dolayout ( void ) | |||
{ | |||
layout(); | |||
} | |||
void | |||
layout ( void ) | |||
{ | |||
resizable( 0 ); | |||
int W; | |||
int H; | |||
int X = 0; | |||
int Y = 0; | |||
int LW = 0; | |||
int LH = 0; | |||
int LX = 0; | |||
int LY = 0; | |||
int RH = 0; | |||
// int RY = 0; | |||
int CW = 0; | |||
if ( _flow ) | |||
{ | |||
H = 0; | |||
W = 0; | |||
} | |||
else | |||
{ | |||
H = _initial_height; | |||
W = _initial_width; | |||
} | |||
for ( int i = 0; i < children(); ++i ) | |||
{ | |||
Fl_Widget *o = child( i ); | |||
if ( ! o->visible() ) | |||
continue; | |||
if ( _flow ) | |||
{ | |||
if ( _flowdown ) | |||
{ | |||
if ( Y + o->h() <= _initial_height ) | |||
{ | |||
/* if it'll fit in this column, put it below the previous widget */ | |||
X = LX; | |||
} | |||
else | |||
{ | |||
Y = H; | |||
CW = 0; | |||
} | |||
CW = o->w() > CW ? o->w() : CW; | |||
RH = Y + o->h() > RH ? Y + o->h() : RH; | |||
} | |||
else | |||
{ | |||
if ( X + o->w() >= _initial_width ) | |||
{ | |||
/* maybe wrap to the next row */ | |||
H += RH + _vspacing; | |||
// RY = Y; | |||
RH = 0; | |||
if ( X > W ) | |||
W = X; | |||
X = 0; | |||
} | |||
else | |||
{ | |||
/* otherwise, put it in the next column */ | |||
Y = H; | |||
} | |||
RH = o->h() > RH ? o->h() : RH; | |||
} | |||
} | |||
LW = o->w(); | |||
LH = o->h(); | |||
LX = X; | |||
LY = Y; | |||
if ( _flow ) | |||
{ | |||
if ( _flowdown ) | |||
{ | |||
Y += LH + _vspacing; | |||
X += CW + _hspacing; | |||
} | |||
else | |||
{ | |||
Y += RH + _vspacing; | |||
X += LW + _hspacing; | |||
} | |||
} | |||
else | |||
{ | |||
if ( type() == Fl_Pack::HORIZONTAL ) | |||
{ | |||
X += LW + _hspacing; | |||
LH = _initial_height; | |||
W = X; | |||
} | |||
else | |||
{ | |||
Y += LH + _vspacing; | |||
LW = _initial_width; | |||
H = Y; | |||
} | |||
} | |||
if ( ! ( o->x() == x() + LX && | |||
o->y() == y() + LY && | |||
o->w() == LW && | |||
o->h() == LH ) ) | |||
o->resize( x() + LX, | |||
y() + LY, | |||
LW, | |||
LH); | |||
} | |||
if ( _flow ) | |||
{ | |||
H += RH; | |||
if ( X > W ) | |||
W = X; | |||
/* if ( _flowdown ) */ | |||
/* H = _initial_height; */ | |||
} | |||
Fl_Group::resize( x(), y(), W, H ); | |||
} | |||
}; |
@@ -1,78 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* wrap a widget in a group as wide as the widget's label. This is | |||
* useful when you want to put labeled widgets into a pack */ | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Group.H> | |||
#include <FL/fl_draw.H> | |||
class Fl_Labelpad_Group : public Fl_Group | |||
{ | |||
public: | |||
static void measure_label ( Fl_Widget *o, int &W, int &H ) | |||
{ | |||
W = fl_width( o->label() ); | |||
H = fl_height(); | |||
} | |||
Fl_Labelpad_Group ( Fl_Widget *o ) : Fl_Group( 0, 0, 50, 50, 0 ) | |||
{ | |||
resizable( 0 ); | |||
end(); | |||
add( o ); | |||
fl_font( o->labelfont(), o->labelsize() ); | |||
int W, H; | |||
measure_label( o, W, H ); | |||
// set size to contain widget | |||
if ( o->align() & ( FL_ALIGN_TOP | FL_ALIGN_BOTTOM ) ) | |||
size( W > o->w() ? W : o->w(), o->h() + H ); | |||
if ( o->align() & ( FL_ALIGN_LEFT | FL_ALIGN_RIGHT ) ) | |||
size( o->w() + W, H > o->h() ? H : o->h() ); | |||
// center widget in group | |||
if ( o->align() & FL_ALIGN_TOP ) | |||
o->position( x() + w() / 2 - (o->w() / 2 ), y() + H ); | |||
else if ( o->align() & FL_ALIGN_BOTTOM ) | |||
o->position( x() + w() / 2 - (o->w() / 2 ), y() ); | |||
else if ( o->align() & FL_ALIGN_RIGHT ) | |||
o->position( x(), y() ); | |||
else if ( o->align() & FL_ALIGN_LEFT ) | |||
o->position( x() + W, y() ); | |||
else | |||
{ | |||
/* TODO: other alignments */ | |||
} | |||
resizable(o); | |||
init_sizes(); | |||
} | |||
virtual ~Fl_Labelpad_Group ( ) | |||
{ | |||
} | |||
}; |
@@ -1,338 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Fl_Menu_Settings.H" | |||
#include <string.h> | |||
/* code to dump and restore (portions of) an Fl_Menu_ */ | |||
#define MAX_PATH 1024 | |||
void | |||
Fl_Menu_Settings::remove_ampersands ( char *str, int n ) | |||
{ | |||
char *d = str; | |||
char *s = str; | |||
while ( n-- ) | |||
{ | |||
if ( *s == '&' ) | |||
{ | |||
++s; | |||
continue; | |||
} | |||
*(d++) = *(s++); | |||
} | |||
*d = '\0'; | |||
} | |||
void | |||
Fl_Menu_Settings::indent ( FILE *fp, int n ) | |||
{ | |||
while ( n-- ) | |||
fprintf( fp, "\t" ); | |||
} | |||
int | |||
Fl_Menu_Settings::item_pathname_x ( char *path, int n, const Fl_Menu_Item *item ) | |||
{ | |||
int r = Fl_Menu_::item_pathname( path, n, item ); | |||
remove_ampersands( path, n ); | |||
return r; | |||
} | |||
/** dump options from submenu /menu/ of menubar /bar/ to file /fp/ */ | |||
const Fl_Menu_Item * | |||
Fl_Menu_Settings::dump ( Fl_Menu_ *bar, const Fl_Menu_Item *menu, FILE *fp, int depth ) | |||
{ | |||
static char path[256]; | |||
const Fl_Menu_Item *m = menu; | |||
for ( ; m->text; ++m ) | |||
{ | |||
bool is_radio = false; | |||
if ( m->flags & FL_SUBMENU ) | |||
// if ( m->submenu() ) | |||
{ | |||
strcpy( path, m->text ); | |||
remove_ampersands( path, strlen( path ) ); | |||
indent( fp, depth ); | |||
fprintf( fp, "%s\n", path ); | |||
/* recurse */ | |||
m = dump( bar, ++m, fp, depth + 1 ); | |||
// ++m; | |||
// m = dump( bar, m->flags & FL_SUBMENU_POINTER ? (Fl_Menu_Item*) m->user_data() : m, fp, depth + 1 ); | |||
if ( ! depth ) | |||
break; | |||
else | |||
continue; | |||
} | |||
if ( m->radio() ) | |||
is_radio = true; | |||
// bar->item_pathname( path, sizeof( path ) - 1, m ); | |||
item_pathname_x( path, sizeof( path ) - 1, m ); | |||
if ( m->flags & FL_MENU_TOGGLE || m->flags & FL_MENU_RADIO ) | |||
{ | |||
if ( ! is_radio ) | |||
{ | |||
indent( fp, depth ); | |||
fprintf( fp, "%s\n", rindex( path, '/' ) + 1 ); | |||
indent( fp, depth + 1 ); | |||
fprintf( fp, "%s\n", m->flags & FL_MENU_VALUE ? "true" : "false" ); | |||
} | |||
else if ( m->flags & FL_MENU_VALUE ) | |||
{ | |||
*rindex( path, '/' ) = '\0'; | |||
indent( fp, depth ); | |||
fprintf( fp, "%s\n", path + strlen( path ) + 1 ); | |||
} | |||
} | |||
} | |||
return m; | |||
} | |||
/** dump menu to file /name/ starting at /item. */ | |||
int | |||
Fl_Menu_Settings::dump ( const Fl_Menu_Item *item, const char *name ) | |||
{ | |||
FILE *fp = fopen( name, "w" ); | |||
if ( ! fp ) | |||
return false; | |||
dump( this, item, fp, 0 ); | |||
fclose( fp ); | |||
return true; | |||
} | |||
#define strlcat strncat | |||
/* taken from Fl_Menu_.cxx and modified to ignore hotkeys and case */ | |||
const Fl_Menu_Item * | |||
Fl_Menu_Settings::find_item_x ( const char *name, const Fl_Menu_Item *item ) | |||
{ | |||
char menupath [ MAX_PATH ] = ""; // File/Export | |||
const Fl_Menu_Item *m = item ? item : menu(); | |||
int depth = 0; | |||
while ( depth >= 0 ) | |||
for ( ;m ; ++m ) | |||
{ | |||
if ( m->flags & FL_SUBMENU ) | |||
{ | |||
// IT'S A SUBMENU | |||
// we do not support searches through FL_SUBMENU_POINTER links | |||
if ( menupath[0] ) | |||
strlcat( menupath, "/", sizeof( menupath ) ); | |||
strlcat( menupath, m->label(), sizeof( menupath ) ); | |||
remove_ampersands( menupath, strlen( menupath ) ); | |||
if ( ! strcasecmp( menupath, name ) ) | |||
return m; | |||
else | |||
{ | |||
++depth; | |||
continue; | |||
} | |||
} | |||
else | |||
{ | |||
if ( ! m->label() ) | |||
{ | |||
// END OF SUBMENU? Pop back one level. | |||
char *ss = strrchr( menupath, '/' ); | |||
if ( ss ) | |||
*ss = 0; | |||
else | |||
menupath[0] = '\0'; | |||
--depth; | |||
++m; | |||
break; | |||
} | |||
// IT'S A MENU ITEM | |||
char itempath[ MAX_PATH ]; // eg. Edit/Copy | |||
strcpy( itempath, menupath ); | |||
if ( itempath[0] ) | |||
strlcat( itempath, "/", sizeof( itempath ) ); | |||
strlcat( itempath, m->label(), sizeof( itempath ) ); | |||
remove_ampersands( itempath, strlen( itempath ) ); | |||
if ( !strcasecmp( itempath, name ) ) | |||
return m; | |||
} | |||
} | |||
return ( Fl_Menu_Item * )0; | |||
} | |||
static void | |||
path_push ( char *path, const char *s ) | |||
{ | |||
strcat( path, s ); | |||
strcat( path, "/" ); | |||
} | |||
static void | |||
path_pop ( char *path ) | |||
{ | |||
char *s; | |||
int l = strlen( path ); | |||
if ( ! l ) | |||
return; | |||
if ( path[ l - 1 ] == '/' ) | |||
path[ l - 1 ] = '\0'; | |||
s = rindex( path, '/' ); | |||
if ( s ) | |||
*(s + 1) = '\0'; | |||
else | |||
*path = '\0'; | |||
} | |||
void | |||
Fl_Menu_Settings::load ( Fl_Menu_ *bar, const Fl_Menu_Item *item, FILE *fp, int depth, char *path, int pmax ) | |||
{ | |||
char line[256]; | |||
while ( ! feof( fp ) ) | |||
{ | |||
*line = '\0'; | |||
fgets( line, sizeof( line ), fp ); | |||
if ( *line == '#' ) | |||
continue; | |||
line[ strlen( line ) - 1 ] = '\0'; | |||
int ld = strspn( line, "\t" ); | |||
if ( ld > depth ) | |||
{ | |||
path_push( path, line + ld ); | |||
++depth; | |||
// load( bar, item, fp, depth + 1, path, pmax ); | |||
/* */; | |||
} | |||
else if ( ld < depth ) | |||
{ | |||
/* we should know the path and the value now */ | |||
// path_pop( path ); | |||
*rindex( path, '/' ) = '\0'; | |||
// printf( "%s = %s\n", path, path + strlen( path ) + 1 ); | |||
const Fl_Menu_Item *it = find_item_x( path, item + 1 ); | |||
if ( it && it->radio() ) /* radio button */ | |||
{ | |||
bar->picked( it ); | |||
path_pop( path ); | |||
} | |||
else /* toggle */ | |||
{ | |||
*rindex( path, '/' ) = '\0'; | |||
if ( ( it = find_item_x( path, item + 1 ) ) && it->checkbox() ) | |||
{ | |||
int v = 0 == strcasecmp( "true", (path + strlen( path ) + 1 ) ); | |||
if ( v != ( it->value() != 0 ) /* grr, FLTK */ ) | |||
bar->picked( it ); | |||
} | |||
} | |||
while ( ld < depth ) | |||
{ | |||
path_pop( path ); | |||
depth--; | |||
} | |||
path_push( path, line + ld ); | |||
} | |||
else /* d == depth */ | |||
{ | |||
/* doesn't apply? */ | |||
} | |||
} | |||
} | |||
/** load settings from file /name/ into menu starting at /item */ | |||
int | |||
Fl_Menu_Settings::load ( const Fl_Menu_Item *item, const char *name ) | |||
{ | |||
FILE *fp = fopen( name, "r" ); | |||
if ( ! fp ) | |||
return false; | |||
char path[ MAX_PATH ]; | |||
path[0] = '\0'; | |||
load( this, item, fp, 0, path, sizeof( path ) ); | |||
fclose( fp ); | |||
return true; | |||
} |
@@ -1,43 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <FL/Fl_Menu_.H> | |||
#include <stdio.h> | |||
class Fl_Menu_Settings : public Fl_Menu_ | |||
{ | |||
void remove_ampersands ( char *str, int n ); | |||
void indent ( FILE *fp, int n ); | |||
const Fl_Menu_Item * dump ( Fl_Menu_ *bar, const Fl_Menu_Item *menu, FILE *fp, int depth ); | |||
void load ( Fl_Menu_ *bar, const Fl_Menu_Item *item, FILE *fp, int depth, char *path, int pmax ); | |||
public: | |||
int item_pathname_x ( char *path, int n, const Fl_Menu_Item *item ); | |||
const Fl_Menu_Item * find_item_x ( const char *name, const Fl_Menu_Item *item ); | |||
int dump ( const Fl_Menu_Item *item, const char *name ); | |||
int load ( const Fl_Menu_Item *item, const char *name ); | |||
}; |
@@ -1,212 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2010 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Scrolling group suitable for containing a single child (a | |||
* pack). When the Fl_Packscroller is resized, the child will be resized | |||
* too. No scrollbars are displayed, but the widget responds to | |||
* FL_MOUSEWHEEL events. */ | |||
#pragma once | |||
#include <FL/Fl_Group.H> | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl.H> | |||
/* FIXME: Optimize scroll */ | |||
class Fl_Packscroller : public Fl_Group | |||
{ | |||
int _increment; | |||
int _yposition; | |||
static const int sbh = 15; /* scroll button height */ | |||
public: | |||
Fl_Packscroller ( int X, int Y, int W, int H, const char *L = 0 ) : Fl_Group( X, Y, W, H, L ) | |||
{ | |||
_increment = 30; | |||
_yposition = 0; | |||
// color( FL_WHITE ); | |||
} | |||
int increment ( void ) const { return _increment; } | |||
void increment ( int v ) { _increment = v; } | |||
void yposition ( int v ) | |||
{ | |||
if ( ! children() ) | |||
return; | |||
int Y = v; | |||
if ( Y > 0 ) | |||
Y = 0; | |||
const int H = h(); | |||
// - (sbh * 2); | |||
Fl_Widget *o = child( 0 ); | |||
if ( o->h() > H && | |||
Y + o->h() < H ) | |||
Y = H - o->h(); | |||
else if ( o->h() < H ) | |||
Y = 0; | |||
if ( _yposition != Y ) | |||
{ | |||
_yposition = Y; | |||
damage( FL_DAMAGE_SCROLL ); | |||
} | |||
} | |||
int yposition ( void ) const | |||
{ | |||
if ( children() ) | |||
return child( 0 )->y() - (y() + sbh); | |||
return 0; | |||
} | |||
void bbox ( int &X, int &Y, int &W, int &H ) | |||
{ | |||
X = x(); | |||
Y = y() + ( sbh * top_sb_visible() ); | |||
W = w(); | |||
H = h() - ( sbh * ( top_sb_visible() + bottom_sb_visible() ) ); | |||
} | |||
int top_sb_visible ( void ) | |||
{ | |||
return children() && child(0)->y() != y() ? 1 : 0; | |||
} | |||
int bottom_sb_visible ( void ) | |||
{ | |||
if ( children() ) | |||
{ | |||
Fl_Widget *o = child( 0 ); | |||
if ( o->h() > h() && o->y() + o->h() != y() + h() ) | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
virtual void | |||
draw ( void ) | |||
{ | |||
if ( damage() & FL_DAMAGE_ALL ) | |||
{ | |||
fl_rectf( x(), y(), w(), h(), color() ); | |||
} | |||
if ( ! children() ) | |||
return; | |||
Fl_Widget *o = child( 0 ); | |||
o->position( x(), y() + _yposition ); | |||
const int top_sb = top_sb_visible(); | |||
const int bottom_sb = bottom_sb_visible(); | |||
fl_push_clip( x(), y() + ( sbh * top_sb ), w(), h() - (sbh * (top_sb + bottom_sb) )); | |||
draw_children(); | |||
fl_pop_clip(); | |||
fl_font( FL_HELVETICA, 12 ); | |||
if ( top_sb ) | |||
{ | |||
fl_draw_box( box(), x(), y(), w(), sbh, color() ); | |||
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) ); | |||
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER ); | |||
} | |||
if ( bottom_sb ) | |||
{ | |||
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() ); | |||
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) ); | |||
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER ); | |||
} | |||
} | |||
virtual int | |||
handle ( int m ) | |||
{ | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
if ( top_sb_visible() && | |||
Fl::event_inside( x(), y(), w(), sbh ) ) | |||
{ | |||
return 1; | |||
} | |||
else if ( bottom_sb_visible() && | |||
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) ) | |||
{ | |||
return 1; | |||
} | |||
break; | |||
case FL_RELEASE: | |||
{ | |||
if ( top_sb_visible() && | |||
Fl::event_inside( x(), y(), w(), sbh ) ) | |||
{ | |||
yposition( yposition() + ( h() / 4 ) ); | |||
return 1; | |||
} | |||
else if ( bottom_sb_visible() && | |||
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) ) | |||
{ | |||
yposition( yposition() - (h() / 4 ) ); | |||
return 1; | |||
} | |||
break; | |||
} | |||
case FL_KEYBOARD: | |||
{ | |||
if ( Fl::event_key() == FL_Up ) | |||
{ | |||
yposition( yposition() + ( h() / 4 ) ); | |||
return 1; | |||
} | |||
else if ( Fl::event_key() == FL_Down ) | |||
{ | |||
yposition( yposition() - (h() / 4 ) ); | |||
return 1; | |||
} | |||
break; | |||
} | |||
case FL_MOUSEWHEEL: | |||
{ | |||
yposition( yposition() - ( Fl::event_dy() * _increment ) ); | |||
return 1; | |||
} | |||
} | |||
return Fl_Group::handle( m ); | |||
} | |||
}; |
@@ -1,250 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Fl_Scalepack | |||
This is similar to an Fl_Pack, but instead of the pack resizing | |||
itself to enclose its children, this pack resizes its children to | |||
fit itself. Of course, this only works well with highly flexible | |||
widgets, but the task comes up often enough to warrent this class. | |||
If and child happens to be the resizable() widget, then it will be | |||
resized so the all the other children can fit around it, with their | |||
current sizes (and the size of the Fl_Scalepack) maintained. | |||
NOTES: An Fl_Pack as a direct child will not work, because Fl_Pack | |||
changes its size in draw(), which throws off our resize | |||
calculation. The whole idea of widgets being able to resize | |||
themselves within draw() is horribly broken... | |||
*/ | |||
#include "Fl_Scalepack.H" | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
#include <stdio.h> | |||
Fl_Scalepack::Fl_Scalepack ( int X, int Y, int W, int H, const char *L ) : | |||
Fl_Group( X, Y, W, H, L ) | |||
{ | |||
resizable( 0 ); | |||
_spacing = 0; | |||
} | |||
void | |||
Fl_Scalepack::resize ( int X, int Y, int W, int H ) | |||
{ | |||
/* Fl_Group's resize will change our child widget sizes, which | |||
interferes with our own resizing method. */ | |||
long dx = X - x(); | |||
long dy = Y - y(); | |||
bool r = W != w() || H != h(); | |||
Fl_Widget::resize( X, Y, W, H ); | |||
Fl_Widget*const* a = array(); | |||
for (int i=children(); i--;) | |||
{ | |||
Fl_Widget* o = *a++; | |||
o->position( o->x() + dx, o->y() + dy ); | |||
} | |||
if ( r ) | |||
redraw(); | |||
} | |||
void | |||
Fl_Scalepack::draw ( void ) | |||
{ | |||
if ( resizable() == this ) | |||
/* this resizable( this ) is the default for Fl_Group and is | |||
* reset by Fl_Group::clear(), but it is not our default... */ | |||
resizable( 0 ); | |||
int tx = x() + Fl::box_dx( box() ); | |||
int ty = y() + Fl::box_dy( box() ); | |||
int tw = w() - Fl::box_dw( box() ); | |||
int th = h() - Fl::box_dh( box() ); | |||
if ( damage() & FL_DAMAGE_ALL ) | |||
{ | |||
draw_box(); | |||
draw_label(); | |||
} | |||
int v = 0; | |||
int cth = 0; | |||
int ctw = 0; | |||
Fl_Widget * const * a = array(); | |||
for ( int i = children(); i--; ) | |||
{ | |||
Fl_Widget *o = *a++; | |||
if ( o->visible() ) | |||
{ | |||
++v; | |||
if ( o != this->resizable() ) | |||
{ | |||
cth += o->h(); | |||
ctw += o->w(); | |||
} | |||
cth += _spacing; | |||
ctw += _spacing; | |||
} | |||
} | |||
ctw -= _spacing; | |||
cth -= _spacing; | |||
if ( 0 == v ) | |||
return; | |||
if ( this->resizable() ) | |||
{ | |||
int pos = 0; | |||
Fl_Widget * const * a = array(); | |||
for ( int i = children(); i--; ) | |||
{ | |||
Fl_Widget *o = *a++; | |||
if ( o->visible() ) | |||
{ | |||
int X, Y, W, H; | |||
if ( type() == HORIZONTAL ) | |||
{ | |||
X = tx + pos; | |||
Y = ty; | |||
W = o->w(); | |||
H = th; | |||
} | |||
else | |||
{ | |||
X = tx; | |||
Y = ty + pos; | |||
W = tw; | |||
H = o->h(); | |||
} | |||
if ( this->resizable() == o ) | |||
{ | |||
if ( type() == HORIZONTAL ) | |||
W = tw - ctw - 3; | |||
else | |||
H = th - cth; | |||
} | |||
if (X != o->x() || Y != o->y() || W != o->w() || H != o->h() ) | |||
{ | |||
o->resize(X,Y,W,H); | |||
o->clear_damage(FL_DAMAGE_ALL); | |||
} | |||
if ( damage() & FL_DAMAGE_ALL ) | |||
{ | |||
draw_child( *o ); | |||
draw_outside_label( *o ); | |||
} | |||
else | |||
update_child( *o ); | |||
/* if ( this->resizable() == o ) */ | |||
/* fl_rect( o->x(), o->y(), o->w(), o->h(), type() == VERTICAL ? FL_GREEN : FL_BLUE ); */ | |||
if ( type() == HORIZONTAL ) | |||
pos += o->w() + spacing(); | |||
else | |||
pos += o->h() + spacing(); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
int sz = 0; | |||
int pos = 0; | |||
if ( type() == HORIZONTAL ) | |||
sz = (tw - (_spacing * (v - 1))) / v; | |||
else | |||
sz = (th - (_spacing * (v - 1))) / v; | |||
Fl_Widget * const * a = array(); | |||
for ( int i = children(); i--; ) | |||
{ | |||
Fl_Widget *o = *a++; | |||
if ( o->visible() ) | |||
{ | |||
int X, Y, W, H; | |||
if ( type() == HORIZONTAL ) | |||
{ | |||
X = tx + pos; | |||
Y = ty; | |||
W = sz; | |||
H = th; | |||
} | |||
else | |||
{ | |||
X = tx; | |||
Y = ty + pos; | |||
W = tw; | |||
H = sz; | |||
} | |||
if (X != o->x() || Y != o->y() || W != o->w() || H != o->h() ) | |||
{ | |||
o->resize(X,Y,W,H); | |||
o->clear_damage(FL_DAMAGE_ALL); | |||
} | |||
if ( damage() & FL_DAMAGE_ALL ) | |||
{ | |||
draw_child( *o ); | |||
draw_outside_label( *o ); | |||
} | |||
else | |||
update_child( *o ); | |||
// fl_rect( o->x(), o->y(), o->w(), o->h(), type() == VERTICAL ? FL_RED : FL_YELLOW ); | |||
if ( type() == HORIZONTAL ) | |||
pos += o->w() + spacing(); | |||
else | |||
pos += o->h() + spacing(); | |||
} | |||
} | |||
} | |||
} |
@@ -1,43 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Group.H> | |||
class Fl_Scalepack : public Fl_Group | |||
{ | |||
int _spacing; | |||
public: | |||
enum { VERTICAL, HORIZONTAL }; | |||
Fl_Scalepack ( int X, int Y, int W, int H, const char *L = 0 ); | |||
virtual ~Fl_Scalepack ( ) { } | |||
int spacing ( void ) const { return _spacing; } | |||
void spacing ( int v ) { _spacing = v; redraw(); } | |||
virtual void resize ( int, int, int, int ); | |||
virtual void draw ( void ); | |||
}; |
@@ -1,341 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Fl_SliderX.H" | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
#include <math.h> | |||
void | |||
Fl_SliderX::draw ( int X, int Y, int W, int H) | |||
{ | |||
slider_size( horizontal() ? H / (float)W : W / (float)H ); | |||
int act = active_r(); | |||
if (damage()&FL_DAMAGE_ALL) draw_box(); | |||
int ww = (horizontal() ? W : H); | |||
int hh = (horizontal() ? H : W); | |||
int xx, S; | |||
xx = slider_position( value(), ww ); | |||
S = (horizontal() ? H : W ); | |||
int xsl, ysl, wsl, hsl; | |||
if (horizontal()) { | |||
xsl = X+xx; | |||
wsl = S; | |||
ysl = Y + hh/2; | |||
hsl = hh/4; | |||
} else { | |||
ysl = Y+xx; | |||
hsl = S; | |||
xsl = X + hh/2; | |||
wsl = hh/4; | |||
} | |||
{ | |||
fl_push_clip(X, Y, W, H); | |||
draw_box(); | |||
fl_pop_clip(); | |||
} | |||
//draw_bg(X, Y, W, H); | |||
fl_line_style( FL_SOLID, hh/6 ); | |||
Fl_Color c = fl_darker(color()); | |||
if ( !act ) | |||
c = fl_inactive(c); | |||
fl_color(c); | |||
if ( horizontal() ) | |||
fl_line ( X + S/2, Y + hh/2, X + W - S/2, Y + hh/2 ); | |||
else | |||
fl_line ( X + hh/2, Y + S/2, X + hh/2, Y + H - S/2 ); | |||
c = selection_color(); | |||
if ( !act ) | |||
c = fl_inactive(c); | |||
fl_color( c ); | |||
if ( horizontal() ) | |||
fl_line ( X + S/2, ysl, xsl + S/2, ysl ); | |||
else | |||
fl_line ( X + S/2, Y + H - S/2, xsl, ysl + (S/2) ); | |||
fl_line_style( FL_SOLID, 0 ); | |||
if ( act ) | |||
{ | |||
fl_push_matrix(); | |||
if ( horizontal() ) | |||
fl_translate( xsl + (hh/2), ysl); | |||
else | |||
fl_translate( xsl, ysl + (hh/2) ); | |||
fl_color( fl_color_add_alpha( FL_WHITE, 127 )); | |||
fl_begin_polygon(); fl_circle(0.0,0.0, hh/3); fl_end_polygon(); | |||
fl_color( FL_WHITE ); | |||
fl_begin_polygon(); fl_circle(0.0,0.0, hh/6); fl_end_polygon(); | |||
fl_pop_matrix(); | |||
} | |||
draw_label(xsl, ysl, wsl, hsl); | |||
if (Fl::focus() == this) { | |||
draw_focus(); | |||
} | |||
/* draw(x()+Fl::box_dx(box()), */ | |||
/* y()+Fl::box_dy(box()), */ | |||
/* w()-Fl::box_dw(box()), */ | |||
/* h()-Fl::box_dh(box())); */ | |||
} | |||
/** return a value between 0.0 and 1.0 which represents the current slider position. */ | |||
int | |||
Fl_SliderX::slider_position ( double value, int w ) | |||
{ | |||
double A = minimum(); | |||
double B = maximum(); | |||
if (B == A) return 0; | |||
bool flip = B < A; | |||
if (flip) {A = B; B = minimum();} | |||
// if (!horizontal()) flip = !flip; | |||
// if both are negative, make the range positive: | |||
if (B <= 0) {flip = !flip; double t = A; A = -B; B = -t; value = -value;} | |||
double fraction; | |||
if (!log()) { | |||
// linear slider | |||
fraction = (value-A)/(B-A); | |||
} else if (A > 0) { | |||
// logatithmic slider | |||
if (value <= A) fraction = 0; | |||
else fraction = (::log(value)-::log(A))/(::log(B)-::log(A)); | |||
} else if (A == 0) { | |||
// squared slider | |||
if (value <= 0) fraction = 0; | |||
else fraction = sqrt(value/B); | |||
} else { | |||
// squared signed slider | |||
if (value < 0) fraction = (1-sqrt(value/A))*.5; | |||
else fraction = (1+sqrt(value/B))*.5; | |||
} | |||
if (flip) fraction = 1-fraction; | |||
w -= int(slider_size()*w+.5); if (w <= 0) return 0; | |||
if (fraction >= 1) return w; | |||
else if (fraction <= 0) return 0; | |||
else return int(fraction*w+.5); | |||
} | |||
double | |||
Fl_SliderX::slider_value ( int X, int w ) | |||
{ | |||
w -= int(slider_size()*w+.5); if (w <= 0) return minimum(); | |||
double A = minimum(); | |||
double B = maximum(); | |||
bool flip = B < A; | |||
if (flip) {A = B; B = minimum();} | |||
// if (!horizontal()) flip = !flip; | |||
if (flip) X = w-X; | |||
double fraction = double(X)/w; | |||
if (fraction <= 0) return A; | |||
if (fraction >= 1) return B; | |||
// if both are negative, make the range positive: | |||
flip = (B <= 0); | |||
if (flip) {double t = A; A = -B; B = -t; fraction = 1-fraction;} | |||
double value; | |||
double derivative; | |||
if (!log()) { | |||
// linear slider | |||
value = fraction*(B-A)+A; | |||
derivative = (B-A)/w; | |||
} else if (A > 0) { | |||
// log slider | |||
double d = (::log(B)-::log(A)); | |||
value = exp(fraction*d+::log(A)); | |||
derivative = value*d/w; | |||
} else if (A == 0) { | |||
// squared slider | |||
value = fraction*fraction*B; | |||
derivative = 2*fraction*B/w; | |||
} else { | |||
// squared signed slider | |||
fraction = 2*fraction - 1; | |||
if (fraction < 0) B = A; | |||
value = fraction*fraction*B; | |||
derivative = 4*fraction*B/w; | |||
} | |||
// find nicest multiple of 10,5, or 2 of step() that is close to 1 pixel: | |||
if (step() && derivative > step()) { | |||
double w = log10(derivative); | |||
double l = ceil(w); | |||
int num = 1; | |||
int i; for (i = 0; i < l; i++) num *= 10; | |||
int denom = 1; | |||
for (i = -1; i >= l; i--) denom *= 10; | |||
if (l-w > 0.69897) denom *= 5; | |||
else if (l-w > 0.30103) denom *= 2; | |||
value = floor(value*denom/num+.5)*num/denom; | |||
} | |||
if (flip) return -value; | |||
return value; | |||
} | |||
int Fl_SliderX::handle(int event, int X, int Y, int W, int H) { | |||
// Fl_Widget_Tracker wp(this); | |||
switch (event) { | |||
case FL_PUSH: { | |||
Fl_Widget_Tracker wp(this); | |||
if (!Fl::event_inside(X, Y, W, H)) return 0; | |||
handle_push(); | |||
if (wp.deleted()) return 1; } | |||
// fall through ... | |||
case FL_DRAG: { | |||
static int offcenter; | |||
int ww = (horizontal() ? W : H); | |||
if ( event == FL_PUSH ) | |||
{ | |||
int x = slider_position( value(), ww ); | |||
offcenter = (horizontal() ? (Fl::event_x()-X) - x : (Fl::event_y()-Y) - x ); | |||
} | |||
try_again: | |||
int mx = (horizontal() ? Fl::event_x()-X : Fl::event_y()-Y) - offcenter; | |||
double v = slider_value( mx, ww ); | |||
if (event == FL_PUSH ) // && v == value()) { | |||
{ | |||
int os = int(slider_size()*ww+0.5)/2; | |||
if ( abs( offcenter ) > os ) | |||
{ | |||
offcenter = os; | |||
event = FL_DRAG; | |||
goto try_again; | |||
} | |||
} | |||
handle_drag(clamp(v)); | |||
} return 1; | |||
case FL_RELEASE: | |||
handle_release(); | |||
return 1; | |||
case FL_KEYBOARD: | |||
{ Fl_Widget_Tracker wp(this); | |||
switch (Fl::event_key()) { | |||
case FL_Up: | |||
if (horizontal()) return 0; | |||
handle_push(); | |||
if (wp.deleted()) return 1; | |||
handle_drag(clamp(increment(value(),-1))); | |||
if (wp.deleted()) return 1; | |||
handle_release(); | |||
return 1; | |||
case FL_Down: | |||
if (horizontal()) return 0; | |||
handle_push(); | |||
if (wp.deleted()) return 1; | |||
handle_drag(clamp(increment(value(),1))); | |||
if (wp.deleted()) return 1; | |||
handle_release(); | |||
return 1; | |||
case FL_Left: | |||
if (!horizontal()) return 0; | |||
handle_push(); | |||
if (wp.deleted()) return 1; | |||
handle_drag(clamp(increment(value(),-1))); | |||
if (wp.deleted()) return 1; | |||
handle_release(); | |||
return 1; | |||
case FL_Right: | |||
if (!horizontal()) return 0; | |||
handle_push(); | |||
if (wp.deleted()) return 1; | |||
handle_drag(clamp(increment(value(),1))); | |||
if (wp.deleted()) return 1; | |||
handle_release(); | |||
return 1; | |||
default: | |||
return 0; | |||
} | |||
} | |||
// break not required because of switch... | |||
case FL_FOCUS : | |||
case FL_UNFOCUS : | |||
if (Fl::visible_focus()) { | |||
redraw(); | |||
return 1; | |||
} else return 0; | |||
case FL_ENTER : | |||
case FL_LEAVE : | |||
return 1; | |||
case FL_MOUSEWHEEL : | |||
{ | |||
if ( this != Fl::belowmouse() ) | |||
return 0; | |||
if (Fl::e_dy==0) | |||
return 0; | |||
const int steps = Fl::event_ctrl() ? 128 : 16; | |||
const float step = fabs( maximum() - minimum() ) / (float)steps; | |||
int dy = Fl::e_dy; | |||
/* slider is in 'upside down' configuration, invert meaning of mousewheel */ | |||
if ( minimum() > maximum() ) | |||
dy = 0 - dy; | |||
handle_drag(clamp(value() + step * dy)); | |||
return 1; | |||
} | |||
default: | |||
return 0; | |||
} | |||
} | |||
int Fl_SliderX::handle(int event) { | |||
if (event == FL_PUSH && Fl::visible_focus()) { | |||
Fl::focus(this); | |||
redraw(); | |||
} | |||
return handle(event, | |||
x()+Fl::box_dx(box()), | |||
y()+Fl::box_dy(box()), | |||
w()-Fl::box_dw(box()), | |||
h()-Fl::box_dh(box())); | |||
} |
@@ -1,50 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Slider.H> | |||
class Fl_SliderX : public Fl_Slider | |||
{ | |||
bool _log; | |||
public: | |||
void log ( bool v ) { _log = v; } | |||
bool log ( void ) const { return _log; } | |||
Fl_SliderX( int X, int Y, int W, int H, const char *L=0 ) : Fl_Slider(X,Y,W,H,L) | |||
{ | |||
_log = 0; | |||
} | |||
virtual ~Fl_SliderX ( ) { }; | |||
virtual int slider_position ( double value, int w ); | |||
virtual double slider_value ( int X, int w ); | |||
virtual void draw ( int X, int Y, int W, int H ); | |||
virtual void draw ( void ) { draw(x(),y(),w(),h()); } | |||
virtual int handle(int event, int X, int Y, int W, int H); | |||
virtual int handle(int event); | |||
}; |
@@ -1,113 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
/* Just like an Fl_Input, except that when not being edited it | |||
* displays just like a label. */ | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Window.H> | |||
#include <FL/Fl_Input.H> | |||
class Fl_Sometimes_Input : public Fl_Input | |||
{ | |||
Fl_Boxtype _up_box; | |||
public: | |||
Fl_Sometimes_Input ( int X, int Y, int W, int H, const char *L=0 ) | |||
: Fl_Input( X, Y, W, H, L ) | |||
{ | |||
clear_visible_focus(); | |||
up_box( FL_NO_BOX ); | |||
when(FL_WHEN_ENTER_KEY); | |||
} | |||
void up_box ( Fl_Boxtype b ) { _up_box = b; } | |||
Fl_Boxtype up_box ( void ) const { return _up_box; } | |||
virtual void | |||
draw ( void ) | |||
{ | |||
if ( this == Fl::focus() ) | |||
Fl_Input::draw(); | |||
else | |||
{ | |||
fl_draw_box( up_box(), x(), y(), w(), h(), color() ); | |||
Fl_Color c = fl_contrast( textcolor(), color() ); | |||
fl_color( active_r() ? c : fl_inactive( c ) ); | |||
fl_font( textfont(), textsize() ); | |||
fl_draw( value(), x(), y(), w(), h(), (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP) ); | |||
} | |||
} | |||
virtual void | |||
take_focus ( void ) | |||
{ | |||
set_visible_focus(); | |||
Fl_Widget::take_focus(); | |||
clear_visible_focus(); | |||
} | |||
virtual int | |||
handle ( int m ) | |||
{ | |||
int r = 0; | |||
switch ( m ) | |||
{ | |||
case FL_KEYDOWN: | |||
{ | |||
if ( ( Fl::event_key() == FL_Enter || | |||
Fl::event_key() == FL_Tab ) ) | |||
{ | |||
Fl::focus( NULL ); | |||
r = 1; | |||
} | |||
break; | |||
} | |||
case FL_FOCUS: | |||
redraw(); | |||
r = 1; | |||
break; | |||
case FL_UNFOCUS: | |||
do_callback(); | |||
r = 1; | |||
break; | |||
case FL_PUSH: | |||
take_focus(); | |||
redraw(); | |||
r = 1; | |||
break; | |||
case FL_DND_ENTER: | |||
return 0; | |||
case FL_PASTE: | |||
return 0; | |||
default: | |||
break; | |||
} | |||
return Fl_Input::handle( m ) | r; | |||
} | |||
}; |
@@ -1,76 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2012 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Pack.H> | |||
class Fl_Sometimes_Pack : public Fl_Pack | |||
{ | |||
bool _pack; | |||
public: | |||
Fl_Sometimes_Pack ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Pack(X,Y,W,H,L) | |||
{ | |||
_pack = true; | |||
} | |||
virtual ~Fl_Sometimes_Pack ( ) | |||
{ | |||
} | |||
void pack ( bool b ) | |||
{ | |||
if ( b != _pack ) | |||
redraw(); | |||
_pack = b; | |||
} | |||
bool pack ( void ) const | |||
{ | |||
return _pack; | |||
} | |||
virtual void draw ( void ) | |||
{ | |||
/* draw_box(); */ | |||
if ( _pack ) | |||
{ | |||
Fl_Pack::draw(); | |||
} | |||
else | |||
{ | |||
if ( children() ) | |||
{ | |||
for ( int i = 0; i < children(); i++ ) | |||
{ | |||
Fl_Widget *o = child( i ); | |||
o->resize( x(),y(),w(), o->h() ); | |||
} | |||
resize( x(), y(), w(), child(0)->h() ); | |||
} | |||
Fl_Group::draw(); | |||
} | |||
} | |||
}; |
@@ -1,53 +0,0 @@ | |||
# data file for the Fltk User Interface Designer (fluid) | |||
version 1.0300 | |||
header_name {.H} | |||
code_name {.C} | |||
decl {\#include <string.h>} {private local | |||
} | |||
widget_class Fl_Text_Edit_Window {open | |||
xywh {377 295 355 410} type Double resizable | |||
code0 {this->size_range( 0, 0, 400, 400 );} | |||
class Fl_Double_Window modal visible | |||
} { | |||
Fl_Box title_box { | |||
label {<title>} | |||
xywh {5 7 345 28} | |||
} | |||
Fl_Text_Editor text_editor {selected | |||
xywh {5 37 345 341} resizable | |||
code0 {o->buffer( new Fl_Text_Buffer );} | |||
} | |||
Fl_Group {} {open | |||
xywh {5 383 345 27} | |||
} { | |||
Fl_Return_Button return_button { | |||
label {<return>} | |||
callback {hide();} | |||
xywh {250 383 100 25} | |||
} | |||
Fl_Box {} { | |||
label {<empty>} | |||
xywh {5 386 240 19} resizable | |||
code0 {o->labeltype( FL_NO_LABEL );} | |||
} | |||
} | |||
} | |||
Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text, int W = 355, int H = 410 )} {open C return_type {char *} | |||
} { | |||
code {Fl_Text_Edit_Window tew( 355, 410, title ); | |||
tew.size( W, H ); | |||
tew.return_button->label( button_text ); | |||
tew.title_box->label( title ); | |||
if ( initial_text ) | |||
tew.text_editor->buffer()->text( initial_text ); | |||
tew.show(); | |||
while ( tew.shown() ) | |||
Fl::wait(); | |||
return strdup( tew.text_editor->buffer()->text() );} {} | |||
} |
@@ -1,234 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2012 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Fl_Value_SliderX.H" | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
#include <math.h> | |||
void Fl_Value_SliderX::input_cb(Fl_Widget*, void* v) { | |||
Fl_Value_SliderX& t = *(Fl_Value_SliderX*)v; | |||
double nv; | |||
if ((t.step() - floor(t.step()))>0.0 || t.step() == 0.0) | |||
nv = strtod(t.input.value(), 0); | |||
else | |||
nv = strtol(t.input.value(), 0, 0); | |||
if (nv != t.value() || t.when() & FL_WHEN_NOT_CHANGED) { | |||
if ( ! t.soft()) | |||
nv = t.clamp(nv); | |||
t.set_value(nv); | |||
t.set_changed(); | |||
if (t.when()) | |||
{ | |||
t.value_damage(); | |||
t.do_callback(); | |||
} | |||
} | |||
} | |||
void Fl_Value_SliderX::value_damage() { | |||
char buf[128]; | |||
format(buf); | |||
input.value(buf); | |||
input.mark(input.position()); // turn off selection highlight | |||
redraw(); | |||
} | |||
Fl_Value_SliderX::~Fl_Value_SliderX ( void ) | |||
{ | |||
if (input.parent() == (Fl_Group *)this) | |||
input.parent(0); // *revert* ctor kludge! | |||
} | |||
/** | |||
Creates a new Fl_Value_SliderX widget using the given | |||
position, size, and label string. The default boxtype is FL_DOWN_BOX. | |||
*/ | |||
Fl_Value_SliderX::Fl_Value_SliderX(int X, int Y, int W, int H, const char*l) | |||
: Fl_SliderX(X,Y,W,H,l),input(X, Y, W, H, 0) { | |||
step(1,100); | |||
soft_ = 0; | |||
if (input.parent()) // defeat automatic-add | |||
input.parent()->remove(input); | |||
input.parent((Fl_Group *)this); // kludge! | |||
input.callback(input_cb, this); | |||
input.when(FL_WHEN_ENTER_KEY); | |||
align(FL_ALIGN_LEFT); | |||
value_damage(); | |||
textsize(9); | |||
set_flag(SHORTCUT_LABEL); | |||
} | |||
void Fl_Value_SliderX::draw() { | |||
int sxx = x(), syy = y(), sww = w(), shh = h(); | |||
int bxx = x(), byy = y(), bww = w(), bhh = h(); | |||
if (horizontal()) { | |||
input.resize(x(), y(), 35, h()); | |||
bww = 35; sxx += 35; sww -= 35; | |||
} else { | |||
input.resize(x(), y(), w(), 25 ); | |||
syy += 25; bhh = 25; shh -= 25; | |||
} | |||
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color()); | |||
Fl_SliderX::draw(sxx+Fl::box_dx(box()), | |||
syy+Fl::box_dy(box()), | |||
sww-Fl::box_dw(box()), | |||
shh-Fl::box_dh(box())); | |||
draw_box(box(),bxx,byy,bww,bhh,color()); | |||
if (damage()&~FL_DAMAGE_CHILD) input.clear_damage(FL_DAMAGE_ALL); | |||
input.box(box()); | |||
input.color(color(), selection_color()); | |||
Fl_Widget *i = &input; i->draw(); // calls protected input.draw() | |||
input.clear_damage(); | |||
} | |||
int Fl_Value_SliderX::handle(int event) { | |||
if (event == FL_PUSH && Fl::visible_focus()) { | |||
Fl::focus(this); | |||
redraw(); | |||
} | |||
int sxx = x(), syy = y(), sww = w(), shh = h(); | |||
if (horizontal()) { | |||
sxx += 35; sww -= 35; | |||
} else { | |||
syy += 25; shh -= 25; | |||
} | |||
double v; | |||
int delta; | |||
int mx = Fl::event_x_root(); | |||
static int ix, drag; | |||
// input.when(when()); | |||
switch (event) { | |||
case FL_ENTER: | |||
return 1; | |||
case FL_LEAVE: | |||
if ( ! drag ) | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
return 1; | |||
case FL_MOVE: | |||
if ( drag || Fl::event_inside( &input ) ) | |||
fl_cursor( FL_CURSOR_WE ); | |||
else | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
return 1; | |||
case FL_PUSH: | |||
// if (!step()) goto DEFAULT; | |||
if ( Fl::event_inside(&input) ) | |||
{ | |||
input.handle(event); | |||
ix = mx; | |||
drag = Fl::event_button(); | |||
handle_push(); | |||
return 1; | |||
} | |||
goto DEFAULT; | |||
break; | |||
case FL_DRAG: | |||
{ | |||
if ( ! drag ) | |||
goto DEFAULT; | |||
fl_cursor( FL_CURSOR_WE ); | |||
// if (!step()) goto DEFAULT; | |||
delta = mx-ix; | |||
if (!horizontal()) | |||
delta = -delta; | |||
if (delta > 5) delta -= 5; | |||
else if (delta < -5) delta += 5; | |||
else delta = 0; | |||
float S = fabs( maximum() - minimum() ); | |||
switch (drag) { | |||
case 3: v = previous_value() + ( S * delta * 0.0100f); break; | |||
case 2: v = previous_value() + ( S * delta * 0.0010f); break; | |||
default:v = previous_value() + ( S * delta * 0.0005f); break; | |||
} | |||
v = round(v); | |||
v = soft()?softclamp(v):clamp(v); | |||
handle_drag(v); | |||
value_damage(); | |||
return 1; | |||
} | |||
case FL_RELEASE: | |||
if ( ! drag ) | |||
goto DEFAULT; | |||
// if (!step()) goto DEFAULT; | |||
if (value() != previous_value() || !Fl::event_is_click()) | |||
handle_release(); | |||
drag = 0; | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
/* else { */ | |||
/* Fl_Widget_Tracker wp(&input); */ | |||
/* input.handle(FL_PUSH); */ | |||
/* if (wp.exists()) */ | |||
/* input.handle(FL_RELEASE); */ | |||
/* } */ | |||
return 1; | |||
case FL_FOCUS: | |||
return input.take_focus(); | |||
case FL_UNFOCUS: | |||
{ | |||
input_cb(&input,this); | |||
return 1; | |||
} | |||
case FL_PASTE: | |||
return 0; | |||
case FL_SHORTCUT: | |||
return input.handle(event); | |||
} | |||
DEFAULT: | |||
int r = Fl_SliderX::handle(event, | |||
sxx+Fl::box_dx(box()), | |||
syy+Fl::box_dy(box()), | |||
sww-Fl::box_dw(box()), | |||
shh-Fl::box_dh(box())); | |||
if ( r ) | |||
{ | |||
return r; | |||
} | |||
else | |||
{ | |||
input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT); | |||
return input.handle(event); | |||
} | |||
} | |||
@@ -1,100 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#ifndef Fl_Value_SliderX_H | |||
#define Fl_Value_SliderX_H | |||
#include "Fl_SliderX.H" | |||
#include <FL/Fl_Input.H> | |||
/** | |||
The Fl_Value_SliderX widget is a Fl_SliderX widget | |||
with a box displaying the current value. | |||
<P ALIGN=CENTER>\image html value_slider.png | |||
\image latex value_slider.png "Fl_Value_SliderX" width=4cm | |||
*/ | |||
class FL_EXPORT Fl_Value_SliderX : public Fl_SliderX { | |||
/* This is the encapsulated Fl_input attribute to which | |||
this class delegates the value font, color and shortcut */ | |||
Fl_Input input; | |||
private: | |||
char soft_; | |||
static void input_cb(Fl_Widget*,void*); | |||
virtual void value_damage(); // cause damage() due to value() changing | |||
protected: | |||
void draw(); | |||
public: | |||
int handle(int); | |||
Fl_Value_SliderX(int x,int y,int w,int h, const char *l = 0); | |||
virtual ~Fl_Value_SliderX ( ); | |||
/** See void Fl_Value_Input::soft(char s) */ | |||
void soft(char s) {soft_ = s;} | |||
/** | |||
If "soft" is turned on, the user is allowed to drag | |||
the value outside the range. If they drag the value to one of | |||
the ends, let go, then grab again and continue to drag, they can | |||
get to any value. The default is true. | |||
*/ | |||
char soft() const {return soft_;} | |||
/** | |||
Returns the current shortcut key for the Input. | |||
\see Fl_Value_Input::shortcut(int) | |||
*/ | |||
int shortcut() const {return input.shortcut();} | |||
/** | |||
Sets the shortcut key to \p s. Setting this | |||
overrides the use of '&' in the label(). The value is a bitwise | |||
OR of a key and a set of shift flags, for example FL_ALT | 'a' | |||
, FL_ALT | (FL_F + 10), or just 'a'. A value | |||
of 0 disables the shortcut. | |||
The key can be any value returned by | |||
Fl::event_key(), but will usually be an ASCII letter. Use | |||
a lower-case letter unless you require the shift key to be held down. | |||
The shift flags can be any set of values accepted by | |||
Fl::event_state(). If the bit is on that shift key must | |||
be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in | |||
the shift flags (zero for the other bits indicates a "don't care" | |||
setting). | |||
*/ | |||
void shortcut(int s) {input.shortcut(s);} | |||
/** Gets the typeface of the text in the value box. */ | |||
Fl_Font textfont() const {return input.textfont();} | |||
/** Sets the typeface of the text in the value box. */ | |||
void textfont(Fl_Font s) {input.textfont(s);} | |||
/** Gets the size of the text in the value box. */ | |||
Fl_Fontsize textsize() const {return input.textsize();} | |||
/** Sets the size of the text in the value box. */ | |||
void textsize(Fl_Fontsize s) {input.textsize(s);} | |||
/** Gets the color of the text in the value box. */ | |||
Fl_Color textcolor() const {return input.textcolor();} | |||
/** Sets the color of the text in the value box.*/ | |||
void textcolor(Fl_Color n) {input.textcolor(n);} | |||
/** Gets the color of the text cursor. The text cursor is black by default. */ | |||
Fl_Color cursor_color() const {return input.cursor_color();} | |||
/** Sets the color of the text cursor. The text cursor is black by default. */ | |||
void cursor_color(Fl_Color n) {input.cursor_color(n);} | |||
}; | |||
#endif | |||
@@ -1,132 +0,0 @@ | |||
# data file for the Fltk User Interface Designer (fluid) | |||
version 1.0300 | |||
header_name {.H} | |||
code_name {.C} | |||
comment {// | |||
// Copyright (C) 2008 Jonathan Moore Liles | |||
// | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the GNU General Public License | |||
// as published by the Free Software Foundation; either version 2 | |||
// of the License, or (at your option) any later version. | |||
// | |||
// This program is distributed in the hope that it will be useful, | |||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
// GNU General Public License for more details. | |||
// | |||
// You should have received a copy of the GNU General Public License | |||
// along with this program; if not, write to the Free Software | |||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
// | |||
} {in_source in_header | |||
} | |||
decl {\#include <stdlib.h>} {private local | |||
} | |||
decl {\#include <string.h>} {private local | |||
} | |||
decl {\#include <stdio.h>} {private local | |||
} | |||
decl {\#include <FL/Fl_File_Chooser.H>} {private local | |||
} | |||
class New_Project_Dialog {open | |||
} { | |||
Function {New_Project_Dialog()} {open | |||
} { | |||
code {_default_path = 0; | |||
path = 0; | |||
make_window();} {} | |||
} | |||
Function {run()} {open return_type void | |||
} { | |||
code {_directory->value( _default_path ); | |||
_window->show(); | |||
while ( _window->shown() ) | |||
Fl::wait();} {} | |||
} | |||
Function {make_window()} {open | |||
} { | |||
Fl_Window _window { | |||
label {New Project} open selected | |||
xywh {743 696 550 105} type Double modal visible | |||
} { | |||
Fl_File_Input _name { | |||
label {Named:} | |||
xywh {75 55 375 35} | |||
} | |||
Fl_Button {} { | |||
label Browse | |||
callback {_directory->value( fl_dir_chooser( "Directory for new project", NULL, 0 ) );} | |||
xywh {455 15 80 35} | |||
} | |||
Fl_Return_Button {} { | |||
label Create | |||
callback {if ( strlen( _directory->value() ) && strlen( _name->value() ) ) | |||
{ | |||
char pat[1024]; | |||
snprintf( pat, sizeof( pat ), "%s/%s", _directory->value(), _name->value() ); | |||
path = strdup( pat ); | |||
_default_path = _directory->value() ? strdup( _directory->value() ) : 0; | |||
//if ( ! Project::create( pat, _template->text( _template->value() ) ) ) | |||
// fl_alert( "Error creating project!" ); | |||
_window->hide(); | |||
}} | |||
xywh {455 55 80 35} | |||
} | |||
Fl_File_Input _directory { | |||
label {Where:} | |||
callback {if ( ! fl_filename_isdir( o->value() ) ) | |||
{ | |||
fl_alert( "Must be a directory" ); | |||
o->value( "" ); | |||
return; | |||
} | |||
// write_line( user_config_dir, "default_path", o->value() );} | |||
xywh {75 15 375 35} | |||
code0 {\#include <FL/filename.H>} | |||
code1 {char *v = NULL;} | |||
code2 {// read_line( user_config_dir, "default_path", &v );} | |||
code3 {o->value( v );} | |||
} | |||
} | |||
} | |||
decl {char *path;} {public local | |||
} | |||
decl {char *_default_path} {private local | |||
} | |||
Function {default_path( char *s )} {open return_type void | |||
} { | |||
code {_default_path = s;} {} | |||
} | |||
Function {default_path()} {open return_type {char *} | |||
} { | |||
code {return _default_path;} {} | |||
} | |||
} | |||
Function {new_project_chooser( char **default_path)} {open C return_type {char*} | |||
} { | |||
code {New_Project_Dialog nsd; | |||
nsd.default_path( *default_path ); | |||
nsd.run(); | |||
if ( nsd.default_path() ) | |||
*default_path = nsd.default_path(); | |||
return nsd.path;} {} | |||
} |
@@ -1,52 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
static const char *event_names[] = | |||
{ | |||
"FL_NO_EVENT", | |||
"FL_PUSH", | |||
"FL_RELEASE", | |||
"FL_ENTER", | |||
"FL_LEAVE", | |||
"FL_DRAG", | |||
"FL_FOCUS", | |||
"FL_UNFOCUS", | |||
"FL_KEYDOWN", | |||
"FL_KEYUP", | |||
"FL_CLOSE", | |||
"FL_MOVE", | |||
"FL_SHORTCUT", | |||
"FL_DEACTIVATE", | |||
"FL_ACTIVATE", | |||
"FL_HIDE", | |||
"FL_SHOW", | |||
"FL_PASTE", | |||
"FL_SELECTIONCLEAR", | |||
"FL_MOUSEWHEEL", | |||
"FL_DND_ENTER", | |||
"FL_DND_DRAG", | |||
"FL_DND_LEAVE", | |||
"FL_DND_RELEASE", | |||
}; | |||
const char * | |||
event_name ( int m ) | |||
{ | |||
return event_names[ m ]; | |||
} |
@@ -1,20 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
const char *event_name ( int m ); |
@@ -1,103 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2012 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
void | |||
draw_focus_frame ( int x, int y, int w, int h, Fl_Color c ) | |||
{ | |||
fl_push_clip( x, y, w, h ); | |||
// fl_color( fl_color_average( FL_GRAY, c, 0.50 ) ); | |||
/* fl_color( fl_color_add_alpha( c, 100 ) ); */ | |||
/* fl_line_style( FL_DASH, 2 ); */ | |||
/* fl_rect( x, y, w, h ); */ | |||
fl_line_style( FL_SOLID, 3 ); | |||
fl_color( c ); | |||
int l = 15; | |||
fl_line( x, y, x + l, y ); | |||
fl_line( x, y + l, x, y ); | |||
fl_line( x + w - 1, y, x + w - l - 1, y ); | |||
fl_line( x + w - 1, y, x + w - 1, y + l - 1 ); | |||
fl_line( x, y + h - 1, x, y + h - l - 1); | |||
fl_line( x, y + h - 1, x + l, y + h - 1 ); | |||
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 ); | |||
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 ); | |||
fl_line_style( FL_SOLID, 0 ); | |||
fl_pop_clip(); | |||
} | |||
void | |||
draw_selection_frame ( int x, int y, int w, int h, Fl_Color c ) | |||
{ | |||
fl_push_clip( x, y, w, h ); | |||
fl_color( fl_color_average( FL_GRAY, c, 0.50 ) ); | |||
/// fl_color( fl_color_add_alpha( c, 100 ) ); | |||
fl_line_style( FL_DASH, 2 ); | |||
fl_rect( x, y, w, h ); | |||
fl_line_style( FL_SOLID, 3 ); | |||
fl_color( c ); | |||
int l = 15; | |||
fl_line( x, y, x + l, y ); | |||
fl_line( x, y + l, x, y ); | |||
fl_line( x + w - 1, y, x + w - l - 1, y ); | |||
fl_line( x + w - 1, y, x + w - 1, y + l - 1 ); | |||
fl_line( x, y + h - 1, x, y + h - l - 1); | |||
fl_line( x, y + h - 1, x + l, y + h - 1 ); | |||
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 ); | |||
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 ); | |||
fl_line_style( FL_SOLID, 0 ); | |||
fl_pop_clip(); | |||
} | |||
bool | |||
focused_r ( Fl_Widget *w ) | |||
{ | |||
for ( Fl_Widget *p = Fl::focus(); p; p = p->parent() ) | |||
if ( p == w ) | |||
return true; | |||
return false; | |||
} |
@@ -1,22 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2012 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
void draw_focus_frame ( int x, int y, int w, int h, Fl_Color c ); | |||
void draw_selection_frame ( int x, int y, int w, int h, Fl_Color c ); | |||
bool focused_r ( Fl_Widget *w ); |
@@ -1,61 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
static unsigned char img_io_input_connector_10x10_png[] = { | |||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, | |||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, | |||
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00, | |||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, | |||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, | |||
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00, | |||
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, | |||
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, | |||
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, | |||
0x00, 0x01, 0x51, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x3d, 0xd0, 0xb1, | |||
0x6a, 0xdb, 0x40, 0x1c, 0xc0, 0xe1, 0x9f, 0x72, 0x7f, 0xcc, 0x21, 0xbc, | |||
0xc5, 0x87, 0xb0, 0xb7, 0x18, 0x6c, 0xa8, 0x49, 0x37, 0x1b, 0x8c, 0x26, | |||
0xdb, 0x19, 0xfb, 0x0e, 0x7e, 0x82, 0xee, 0x21, 0x53, 0xe9, 0x14, 0x42, | |||
0x37, 0x37, 0x7b, 0x9e, 0xa2, 0x63, 0x07, 0x6b, 0xd6, 0xec, 0xc5, 0xe0, | |||
0x80, 0xc1, 0x08, 0xac, 0x66, 0xf0, 0xa0, 0xb3, 0x90, 0x4e, 0xa7, 0x4e, | |||
0xed, 0xf6, 0xcd, 0x5f, 0xd0, 0xb6, 0x2d, 0x00, 0xfb, 0xfd, 0xfe, 0x4b, | |||
0x59, 0x96, 0x8f, 0x4d, 0xd3, 0xdc, 0x01, 0x4e, 0x44, 0xf2, 0x30, 0x0c, | |||
0x9f, 0x86, 0xc3, 0xe1, 0x6f, 0x80, 0xa0, 0x6d, 0x5b, 0x76, 0xbb, 0xdd, | |||
0xb7, 0xf3, 0xf9, 0xfc, 0x35, 0x4d, 0xd3, 0x5e, 0x96, 0x65, 0x78, 0xef, | |||
0x19, 0x0c, 0x06, 0x4c, 0xa7, 0xd3, 0x8f, 0x28, 0x8a, 0x7e, 0x4e, 0x26, | |||
0x93, 0xef, 0x6a, 0xbd, 0x5e, 0x3f, 0x9c, 0x4e, 0xa7, 0x1f, 0x49, 0x92, | |||
0xf4, 0x2e, 0x97, 0x0b, 0xdb, 0xed, 0x96, 0xe3, 0xf1, 0x88, 0x31, 0x86, | |||
0x2c, 0xcb, 0x42, 0x63, 0xcc, 0x7d, 0x5d, 0xd7, 0xbb, 0x1b, 0x6b, 0xed, | |||
0x73, 0x9a, 0xa6, 0xb7, 0x00, 0x4a, 0x29, 0x44, 0x04, 0x11, 0x41, 0x29, | |||
0x05, 0x40, 0x9a, 0xa6, 0xbd, 0xb2, 0x2c, 0x1f, 0xc5, 0x39, 0x67, 0xac, | |||
0xb5, 0x78, 0xef, 0x09, 0x82, 0x80, 0xd5, 0x6a, 0x45, 0x10, 0x04, 0xb4, | |||
0x6d, 0x8b, 0x73, 0x8e, 0xa2, 0x28, 0x68, 0x9a, 0xe6, 0x4e, 0x00, 0xf1, | |||
0xde, 0x93, 0x24, 0x09, 0x45, 0x51, 0x10, 0xc7, 0x31, 0x22, 0x42, 0x92, | |||
0x24, 0x68, 0xad, 0x59, 0x2e, 0x97, 0x00, 0xee, 0x46, 0x29, 0xf5, 0xde, | |||
0xed, 0x76, 0xb9, 0x5e, 0xaf, 0x78, 0xef, 0xa9, 0xaa, 0x8a, 0xaa, 0xaa, | |||
0xfe, 0x5b, 0x6b, 0x8d, 0x88, 0xe4, 0xa2, 0xb5, 0x7e, 0x99, 0xcd, 0x66, | |||
0x9f, 0xf2, 0x3c, 0xef, 0x59, 0x6b, 0x31, 0xc6, 0x00, 0x10, 0xc7, 0x31, | |||
0x9d, 0x4e, 0x87, 0xf9, 0x7c, 0xfe, 0x11, 0x86, 0xe1, 0x93, 0xda, 0x6c, | |||
0x36, 0x7b, 0x6b, 0x6d, 0xd8, 0xef, 0xf7, 0x3f, 0x5b, 0x6b, 0xc3, 0xba, | |||
0xae, 0x01, 0x30, 0xc6, 0xb0, 0x58, 0x2c, 0xfe, 0x44, 0x51, 0xf4, 0x3a, | |||
0x1e, 0x8f, 0xdf, 0x82, 0x7f, 0xe1, 0x87, 0xc3, 0xe1, 0xc1, 0x5a, 0xfb, | |||
0xec, 0x9c, 0x33, 0x80, 0x28, 0xa5, 0xde, 0xb5, 0xd6, 0x2f, 0xa3, 0xd1, | |||
0xe8, 0x17, 0xc0, 0x5f, 0xd1, 0x17, 0xa6, 0x12, 0x83, 0xc3, 0x30, 0x9b, | |||
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 | |||
}; | |||
static unsigned int img_io_input_connector_10x10_png_len = 468; |
@@ -1,63 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
static unsigned char img_io_output_connector_10x10_png[] = { | |||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, | |||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, | |||
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00, | |||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, | |||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, | |||
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00, | |||
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, | |||
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, | |||
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, | |||
0x00, 0x01, 0x61, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x35, 0xd0, 0xbf, | |||
0x6a, 0xc2, 0x40, 0x00, 0x07, 0xe0, 0xdf, 0xfd, 0x89, 0xe4, 0x32, 0xc4, | |||
0x40, 0xed, 0x22, 0x9c, 0x50, 0x24, 0x99, 0x1c, 0xdc, 0x33, 0x38, 0x64, | |||
0xec, 0x03, 0x14, 0x9c, 0xd4, 0xb9, 0x7b, 0xe9, 0x54, 0x3a, 0x95, 0xd2, | |||
0xb1, 0x1d, 0x74, 0xeb, 0xe4, 0xec, 0xd2, 0x31, 0x01, 0x9f, 0x40, 0x04, | |||
0xe9, 0x10, 0x85, 0x06, 0x1c, 0x6d, 0x40, 0x34, 0xe4, 0xd0, 0x0b, 0x5e, | |||
0xa7, 0x7e, 0x8f, 0xf0, 0x11, 0x63, 0x0c, 0x00, 0x60, 0xbd, 0x5e, 0xdf, | |||
0x96, 0x65, 0xf9, 0xa0, 0xb5, 0xbe, 0x21, 0x84, 0x54, 0x9c, 0xf3, 0x9d, | |||
0x10, 0xe2, 0x31, 0x08, 0x82, 0x18, 0x00, 0x88, 0x31, 0x06, 0xab, 0xd5, | |||
0xea, 0x69, 0xbb, 0xdd, 0xde, 0x27, 0x49, 0xd2, 0xb0, 0x6d, 0x1b, 0x8c, | |||
0x31, 0x14, 0x45, 0x81, 0x28, 0x8a, 0x72, 0x29, 0xe5, 0x7b, 0xa7, 0xd3, | |||
0x79, 0x66, 0xfd, 0x7e, 0x3f, 0xca, 0xb2, 0xec, 0x6d, 0x36, 0x9b, 0x35, | |||
0x84, 0x10, 0x18, 0x8d, 0x46, 0xe8, 0x76, 0xbb, 0x58, 0x2e, 0x97, 0x58, | |||
0x2c, 0x16, 0x4e, 0xb3, 0xd9, 0xec, 0x00, 0xf8, 0xa6, 0x4a, 0xa9, 0x97, | |||
0x38, 0x8e, 0xaf, 0x00, 0x40, 0x6b, 0x8d, 0xf3, 0xf9, 0x8c, 0xd3, 0xe9, | |||
0x04, 0xad, 0x35, 0x00, 0x20, 0x49, 0x92, 0x46, 0x59, 0x96, 0x0f, 0xbc, | |||
0xaa, 0xaa, 0xeb, 0xe3, 0xf1, 0x08, 0xc6, 0x18, 0x2e, 0x97, 0x0b, 0xc6, | |||
0xe3, 0x31, 0x8c, 0x31, 0xa0, 0x94, 0xa2, 0x56, 0xab, 0xe1, 0x70, 0x38, | |||
0x40, 0x6b, 0x7d, 0xc3, 0x8d, 0x31, 0x9c, 0x52, 0x8a, 0xe1, 0x70, 0x08, | |||
0xcf, 0xf3, 0x30, 0x9d, 0x4e, 0xa1, 0xb5, 0xc6, 0x60, 0x30, 0x40, 0x51, | |||
0x14, 0x98, 0x4c, 0x26, 0x20, 0x84, 0x54, 0xd4, 0xb2, 0xac, 0x1f, 0xd7, | |||
0x75, 0xe1, 0xba, 0x2e, 0x38, 0xe7, 0x70, 0x1c, 0x07, 0x42, 0x08, 0x30, | |||
0xc6, 0x60, 0xdb, 0x36, 0x3c, 0xcf, 0x03, 0xe7, 0x7c, 0x47, 0xd2, 0x34, | |||
0xbd, 0xdd, 0x6c, 0x36, 0x9f, 0xf3, 0xf9, 0xbc, 0x51, 0xaf, 0xd7, 0x91, | |||
0x65, 0x19, 0x00, 0xa0, 0xd5, 0x6a, 0x41, 0x29, 0x85, 0x30, 0x0c, 0xf3, | |||
0x76, 0xbb, 0x7d, 0x47, 0x7d, 0xdf, 0xff, 0x92, 0x52, 0x7e, 0xf4, 0x7a, | |||
0xbd, 0x3c, 0xcf, 0x73, 0xfc, 0xdb, 0xef, 0xf7, 0x08, 0xc3, 0xf0, 0x57, | |||
0x4a, 0xf9, 0x1e, 0x04, 0x41, 0x4c, 0xfe, 0xc3, 0xd3, 0x34, 0x8d, 0x94, | |||
0x52, 0x2f, 0x55, 0x55, 0x5d, 0x1b, 0x63, 0xb8, 0x65, 0x59, 0x3f, 0x8e, | |||
0xe3, 0xbc, 0xfa, 0xbe, 0xff, 0x05, 0x00, 0x7f, 0xb0, 0xa3, 0x9e, 0x20, | |||
0x9c, 0xde, 0x99, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, | |||
0xae, 0x42, 0x60, 0x82 | |||
}; | |||
static unsigned int img_io_output_connector_10x10_png_len = 484; |
@@ -1 +0,0 @@ | |||
../lib |
@@ -1,61 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Menu_.H> | |||
#include <FL/Fl_Menu_Item.H> | |||
/** popup menu and execute callback */ | |||
bool | |||
menu_popup ( Fl_Menu_ *m, int X, int Y ) | |||
{ | |||
const Fl_Menu_Item *r = m->menu()->popup( X, Y, m->label() ); | |||
if ( r ) | |||
{ | |||
m->value( r ); | |||
if ( r->callback() ) | |||
r->do_callback( static_cast<Fl_Widget*>(m) ); | |||
else if ( m->callback() ) | |||
m->do_callback( static_cast<Fl_Widget*>(m), m->user_data() ); | |||
return true; | |||
} | |||
return false; | |||
} | |||
/** popup menu and execute callback */ | |||
bool | |||
menu_popup ( Fl_Menu_ *m ) | |||
{ | |||
return menu_popup( m, Fl::event_x(), Fl::event_y() ); | |||
} | |||
/** set a single callback for all items in menu. */ | |||
void | |||
menu_set_callback( Fl_Menu_Item *menu, void (*callback)( Fl_Widget *, void * ), void *user_data ) | |||
{ | |||
for ( int i = menu->size(); i--; ) | |||
if ( menu[i].label() && ! menu[i].submenu() ) | |||
{ | |||
menu[i].callback( callback ); | |||
menu[i].user_data( user_data ); | |||
} | |||
} |
@@ -1,26 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
class Fl_Menu_; | |||
struct Fl_Menu_Item; | |||
class Fl_Widget; | |||
bool menu_popup ( Fl_Menu_ *m, int X, int Y ); | |||
bool menu_popup ( Fl_Menu_ *m ); | |||
void menu_set_callback ( Fl_Menu_Item *menu, void (*callback)( Fl_Widget *, void * ), void *user_data ); |
@@ -1,40 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Fl::test_shortcut() is broken for use in FL_PUSH handlers etc, | |||
* because it relies on Fl::event_text(), which isn't cleared as it | |||
* should be--and there's no official way to clear it. Therefore, we | |||
* provide a test_press() function instead, which, unlike | |||
* test_shortcut(), does not treat a missing FL_SHIFT as "don't care". */ | |||
#include <FL/Fl.H> | |||
int | |||
test_press ( unsigned long e ) | |||
{ | |||
if ( Fl::event_text()[0] ) | |||
((char *)Fl::event_text())[0] = '\0'; | |||
const int mod_mask = FL_SHIFT | FL_ALT | FL_CTRL; | |||
if ( ( e & mod_mask ) != ( Fl::event_state() & mod_mask ) ) | |||
return false; | |||
else | |||
return Fl::test_shortcut( e ); | |||
} |
@@ -1,20 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
int test_press ( unsigned long e ); |
@@ -1,163 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2012 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Double_Window.H> | |||
#include <FL/Fl_Single_Window.H> | |||
#include <FL/Fl_Pack.H> | |||
#include <FL/Fl_Choice.H> | |||
#include <FL/fl_draw.H> | |||
#include <sys/time.h> | |||
#include <stdio.h> | |||
static Fl_Boxtype boxtype = FL_UP_BOX; | |||
#include <unistd.h> | |||
unsigned long long tv_to_ts ( timeval *tv ) | |||
{ | |||
return tv->tv_sec * 1e6 + tv->tv_usec; | |||
} | |||
unsigned long long get_ts ( void ) | |||
{ | |||
struct timeval then; | |||
gettimeofday( &then, NULL ); | |||
return tv_to_ts( &then ); | |||
} | |||
class PerfTest : public Fl_Widget | |||
{ | |||
public: | |||
PerfTest ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Widget( X, Y, W, H, L ) | |||
{ | |||
align(FL_ALIGN_TOP | FL_ALIGN_RIGHT |FL_ALIGN_INSIDE); | |||
box(FL_UP_BOX); | |||
labelcolor( FL_WHITE ); | |||
use_cairo = false; | |||
} | |||
bool use_cairo; | |||
void draw ( void ) | |||
{ | |||
if ( use_cairo ) | |||
fl_push_use_cairo(true); | |||
fl_rectf( x(), y(), w(), h(), FL_BLACK ); | |||
unsigned long long then = get_ts(); | |||
fl_push_clip( x(), y(), w(), h() ); | |||
int count = 400; | |||
/* draw stuff */ | |||
int i = 0; | |||
for ( ; i < count; ++i ) | |||
fl_draw_box( boxtype, x(), y(), w(), h(), fl_lighter( FL_BLACK ) ); | |||
fl_pop_clip(); | |||
unsigned long long now = get_ts(); | |||
double elapsedms = (now - then) / 1000.0; | |||
static char text[256]; | |||
sprintf( text, "Drew %i boxes in in %fms", i, elapsedms ); | |||
fl_color( FL_RED ); | |||
fl_draw( text, x(), y(), w(), h(), FL_ALIGN_CENTER | FL_ALIGN_INSIDE ); | |||
draw_label(); | |||
if ( use_cairo ) | |||
fl_pop_use_cairo(); | |||
} | |||
}; | |||
void | |||
boxtype_cb ( Fl_Widget *w, void *v ) | |||
{ | |||
const char *picked = ((Fl_Choice*)w)->mvalue()->label(); | |||
if ( !strcmp( picked, "UP_BOX" ) ) | |||
boxtype = FL_UP_BOX; | |||
else if ( !strcmp( picked, "FLAT_BOX" ) ) | |||
boxtype = FL_FLAT_BOX; | |||
else if ( !strcmp( picked, "ROUNDED_BOX" ) ) | |||
boxtype = FL_ROUNDED_BOX; | |||
else if ( !strcmp( picked, "OVAL_BOX" ) ) | |||
boxtype = FL_OVAL_BOX; | |||
w->window()->redraw(); | |||
} | |||
int | |||
main ( int argc, char **argv ) | |||
{ | |||
{ | |||
Fl_Single_Window *w = new Fl_Single_Window( 800, 600 ); | |||
{ Fl_Choice *o = new Fl_Choice( 0, 0, 200, 24, "Boxtype" ); | |||
o->align( FL_ALIGN_RIGHT ); | |||
o->callback( boxtype_cb, NULL ); | |||
o->add( "UP_BOX" ); | |||
o->add( "FLAT_BOX" ); | |||
o->add( "ROUNDED_BOX" ); | |||
o->add( "OVAL_BOX" ); | |||
} | |||
{ | |||
Fl_Pack *o = new Fl_Pack( 0, 24, 800, 600 - 24 ); | |||
o->type( 0 ); | |||
{ | |||
PerfTest *o = new PerfTest( 0,0, 800, 400, "Xlib" ); | |||
} | |||
{ | |||
PerfTest *o = new PerfTest( 0,0, 800, 400, "Cairo" ); | |||
o->use_cairo = true; | |||
} | |||
o->end(); | |||
} | |||
w->end(); | |||
w->show(); | |||
} | |||
/* { */ | |||
/* Fl_Single_Window *w = new Fl_Single_Window( 800, 600 ); */ | |||
/* PerfTest *o = new PerfTest( 0,0, 800, 600 ); */ | |||
/* w->end(); */ | |||
/* w->show(); */ | |||
/* } */ | |||
Fl::run(); | |||
} |
@@ -1,29 +0,0 @@ | |||
#!/usr/bin/env python | |||
def options(opt): | |||
pass | |||
def configure(conf): | |||
pass | |||
def build(bld): | |||
bld.stlib( | |||
source = | |||
''' | |||
About_Dialog.fl | |||
Fl_Menu_Settings.C | |||
Fl_Scalepack.C | |||
Fl_Text_Edit_Window.fl | |||
Fl_Value_SliderX.C | |||
Fl_DialX.C | |||
Fl_SliderX.C | |||
New_Project_Dialog.fl | |||
event_name.C | |||
menu_popup.C | |||
test_press.C | |||
focus_frame.C | |||
''', | |||
includes = '.', | |||
export_incdirs = [ '.' 'FL' ], | |||
uselib = 'PTHREAD NTK', | |||
target = 'fl_widgets') |
@@ -1,515 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |||
<html><head> | |||
<meta name="generator" content="Generated by MUP v3.5"> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |||
<link type="text/css" rel="stylesheet" href="mup.css"> | |||
<title>Non Mixer User Manual</title> | |||
</head> | |||
<body> | |||
<div id=cover> | |||
<h1>Non Mixer User Manual</h1> | |||
<h3></h3> | |||
<address> | |||
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org"><male@tuxfamily.org></a><br> | |||
<br> | |||
</address><hr></div> | |||
<div id=body> | |||
<div id=toc> | |||
<h1 id=toc>Table Of Contents</h1> | |||
<ul> | |||
<li><a href="#n:1.">1. Non Mixer User Manual</a> | |||
<ul><li><a href="#n:1.1.">1.1. Mixer Groups</a> | |||
<ul><li><a href="#n:1.1.1.">1.1.1. How to Choose Groupings</a> | |||
<li><a href="#n:1.1.2.">1.1.2. Considering JACK Overhead</a> | |||
<li><a href="#n:1.1.3.">1.1.3. Creating a New Group</a> | |||
<li><a href="#n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</a> | |||
<li><a href="#n:1.1.5.">1.1.5. Removing a Strip from a Group</a> | |||
<li><a href="#n:1.1.6.">1.1.6. Removing a Group</a> | |||
<li><a href="#n:1.1.7.">1.1.7. Monitoring Group DSP Load</a> | |||
</ul><li><a href="#n:1.2.">1.2. Mixer Strips</a> | |||
<ul><li><a href="#n:1.2.1.">1.2.1. Navigation</a> | |||
<li><a href="#n:1.2.2.">1.2.2. Control</a> | |||
<li><a href="#n:1.2.3.">1.2.3. Signal Chain</a> | |||
<ul><li><a href="#n:1.2.3.1.">1.2.3.1. Modules</a> | |||
<ul><li><a href="#n:1.2.3.1.1.">1.2.3.1.1. OSC Control</a> | |||
<li><a href="#n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</a> | |||
<li><a href="#n:1.2.3.1.3.">1.2.3.1.3. Manipulation</a> | |||
<li><a href="#n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</a> | |||
<li><a href="#n:1.2.3.1.5.">1.2.3.1.5. Controls</a> | |||
<ul><li><a href="#n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</a> | |||
</ul><li><a href="#n:1.2.3.1.6.">1.2.3.1.6. Spatialization </a> | |||
<ul><li><a href="#n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</a> | |||
<ul><li><a href="#n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</a> | |||
</ul><li><a href="#n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</a> | |||
</ul></ul></ul></ul><li><a href="#n:1.3.">1.3. Spatialization Console</a> | |||
<li><a href="#n:1.4.">1.4. Projects</a> | |||
<ul><li><a href="#n:1.4.1.">1.4.1. JACK I/O</a> | |||
</ul></ul></ul></ul><hr></div> | |||
<h1 id="n:1.">1. Non Mixer User Manual</h1> | |||
<center><div class="fig image"><table id="Fig.1.1" border=1> | |||
<caption> | |||
<strong>Fig. 1.1.</strong> Mixer | |||
</caption> | |||
<tr><td><img src="non-mixer-complex.png" alt="fig. 1.1"></td></tr> | |||
</table></div></center> | |||
<p> | |||
The Non-Mixer is a stand-alone audio mixer, utilizing JACK as an audio subsystem. At the time of writing, the architecture of Non-Mixer is unique. By making the mixer stand-alone, concepts such as busses, sends, and inserts are eliminated, as the same goals can be achieved by simply adding more strips to the mixer. | |||
</p> | |||
<p> | |||
Start by creating a new project (menu item <tt>Project/New</tt>). | |||
</p> | |||
<center><div class="fig image"><table id="Fig.1.2" border=1> | |||
<caption> | |||
<strong>Fig. 1.2.</strong> New Project | |||
</caption> | |||
<tr><td><img src="new-project.png" alt="fig. 1.2"></td></tr> | |||
</table></div></center> | |||
<p> | |||
After the project has been created. Hit <tt>a</tt> or choose <tt>Mixer/Add Strip</tt> from the menu to add a new strip to the mixer. | |||
</p> | |||
<h2 id="n:1.1.">1.1. Mixer Groups</h2> | |||
<center><div class="fig image"><table border=1> | |||
<tr><td><img src="group-dropdown.png" alt="fig. "></td></tr> | |||
</table></div></center> | |||
<p> | |||
Groups serve several purposes. Firstly, they allow for some organization of strips. Groups also allow parallel relationships of mixer strips to be made explicit. This has important performance implications in JACK2. Non Mixer supports an unlimited number of groups, each of which can contain an unlimited number of mixer strips. | |||
</p> | |||
<h3 id="n:1.1.1.">1.1.1. How to Choose Groupings</h3> | |||
<p> | |||
All strips in a group should be completely parallel with no feedback loop connections. A typical group might be named 'Input' and contain all input strips (strips that accept input from Non Timeline and have outputs all connecting to some master bus). | |||
</p> | |||
<p> | |||
To put it another way, if you have 100 inputs strips with identical output configurations (e.g. stereo or B-Format), that all connect to a master bus, then you have a candidate for a group. | |||
</p> | |||
<h3 id="n:1.1.2.">1.1.2. Considering JACK Overhead</h3> | |||
<p> | |||
JACK provides immense flexibility. But, as in most situations, that flexibility comes with a cost. In JACK the cost is a context switch per client. This applies <i>even for many clients which belong to the same process</i>, as in Non Mixer. Various factors go into determining the price of a context switch on any given system. It's not very expensive, but it does add up. It becomes problematic in sessions involving many clients (think 100s), each of which having a small DSP load (often smaller than the cost of JACK's context context switch). JACK <b>could</b> be smart enough to recognize that some clients belong to the same process and could be executed serially without requiring a context switch, but at the time of writing neither JACK1 nor JACK2's scheduling is that smart. | |||
</p> | |||
<p> | |||
If you're mixing a normal song (couple of dozen tracks) at low latency, this overhead will probably account for less than 1% of the total DSP load. If you're mixing an entire orchestra at ultra-low latency, then it might account for a quarter or more of the total DSP load. | |||
</p> | |||
<p> | |||
Groups mitigate this cost by reducing the number of JACK clients required for a mix. Strips in a group will execute serially without context switches or thread synchronization--reducing the total JACK overhead. However, if you have several groups, then they may all by run in parallel by JACK2. | |||
</p> | |||
<p> | |||
<p> | |||
To illustrate this point here are some figures from an actual song session including the whole Non suite plus a sampler, a synth and an ambisonics convolution reverb with a total of 13 strips in 4 groups in different configurations on the same system. | |||
</p> | |||
<p> | |||
JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph (if there are enough clients in parallel signal flow). | |||
</p> | |||
<p> | |||
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms) | |||
</p> | |||
<center><div class="fig table"><table border=1> | |||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr> | |||
<tr><td>JACK1</td><td>N</td><td>39%</td></tr> | |||
<tr><td>JACK1</td><td>Y</td><td>27%</td></tr> | |||
<tr><td>JACK2</td><td>N</td><td>24%</td></tr> | |||
<tr><td>JACK2</td><td>Y</td><td>31%</td></tr> | |||
</table></div></center> | |||
<p> | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms) | |||
</p> | |||
<center><div class="fig table"><table border=1> | |||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr> | |||
<tr><td>JACK1</td><td>N</td><td>28%</td></tr> | |||
<tr><td>JACK1</td><td>Y</td><td>12%</td></tr> | |||
<tr><td>JACK2</td><td>N</td><td>12%</td></tr> | |||
<tr><td>JACK2</td><td>Y</td><td>11%</td></tr> | |||
</table></div></center> | |||
<p> | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms) | |||
</p> | |||
<center><div class="fig table"><table border=1> | |||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr> | |||
<tr><td>JACK1</td><td>N</td><td>29%</td></tr> | |||
<tr><td>JACK1</td><td>Y</td><td>17%</td></tr> | |||
<tr><td>JACK2</td><td>N</td><td>17%</td></tr> | |||
<tr><td>JACK2</td><td>Y</td><td>17%</td></tr> | |||
</table></div></center> | |||
<p> | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms) | |||
</p> | |||
<center><div class="fig table"><table border=1> | |||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr> | |||
<tr><td>JACK1</td><td>N</td><td>x</td></tr> | |||
<tr><td>JACK1</td><td>Y</td><td>x</td></tr> | |||
<tr><td>JACK2</td><td>N</td><td>43%</td></tr> | |||
<tr><td>JACK2</td><td>Y</td><td>41%</td></tr> | |||
</table></div></center> | |||
<p> | |||
As you can see, for multiprocessor systems, JACK2 clearly has an advantage even without grouping. | |||
</p> | |||
<p> | |||
Of course, results will vary depending on the system and the mix. On the dual core system, performance actually degraded with JACK2 when using groups--this is because the number of parallel flows that JACK2 detected was reduced and the second core was being under utilized. Similarly, the performance of the 8-core AMD system doesn't seem that great even in the ungrouped mode--this is because the DSP load of each individual client is around the same as the cost of the context switching. It's a wash either way (if each strip had more or more complex modules on it, then the ungrouped mode would probably perform better). Since JACK1 cannot take advantage of more than 1 CPU core, there is no benefit to parallelism and grouped mode always outperforms ungrouped mode. | |||
</p> | |||
<p> | |||
So, for maximum capacity the combination of a multicore CPU with JACK2 and mixer groups is best. | |||
</p> | |||
<h3 id="n:1.1.3.">1.1.3. Creating a New Group</h3> | |||
<p> | |||
Groups can be created by selecting the group dropdown on any mixer strip and choosing 'New Group'. A window will popup asking for a group name. Group names must be unique. The group will then be created and the selected strip added to it. | |||
</p> | |||
<h3 id="n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</h3> | |||
<p> | |||
To add a strip to an existing group, simply select a group name from the group dropdown on the strip. | |||
</p> | |||
<h3 id="n:1.1.5.">1.1.5. Removing a Strip from a Group</h3> | |||
<p> | |||
Select '---' from the group dropdown. The strip will be removed from the group and will run in an independent JACK client. | |||
</p> | |||
<h3 id="n:1.1.6.">1.1.6. Removing a Group</h3> | |||
<p> | |||
Groups are destroyed automatically as soon as they contain zero strips. | |||
</p> | |||
<h3 id="n:1.1.7.">1.1.7. Monitoring Group DSP Load</h3> | |||
<p> | |||
Above the grop dropdown on each strip is a DSP load meter for the selected group. For ungrouped strips or strips which are the only one in their group, this is simply the DSP load of the single strip. | |||
</p> | |||
<p> | |||
If DSP usage goes up when strips are fed silence, then you're probably running a plugin which has denormal issues. | |||
</p> | |||
<h2 id="n:1.2.">1.2. Mixer Strips</h2> | |||
<center><div class="fig image"><table id="Fig.1.3" border=1> | |||
<caption> | |||
<strong>Fig. 1.3.</strong> Mixer Strip | |||
</caption> | |||
<tr><td><img src="single-strip.png" alt="fig. 1.3"></td></tr> | |||
</table></div></center> | |||
<p> | |||
Each mixer strip has a name and color, each of which may be defined by the user. Names, but not colors, must be unique. In addition, each strip has controls to move it left or right (the arrows) in the display and to remove it entirely (the 'X'). | |||
</p> | |||
<p> | |||
Strips start out in <i>narrow</i> mode, with the <i>fader</i> view enabled. Click the desired button to toggle the mode or view. | |||
</p> | |||
<p> | |||
<p> | |||
The fader view comprises a large gain control and digital peak meter indicator. These are automatically connected to the default gain and meter modules of the strip's signal chain. | |||
</p> | |||
<p> | |||
To see how an audio signal traveling through this strip will be processed, switch to its <i>signal</i> view. | |||
</p> | |||
<h3 id="n:1.2.1.">1.2.1. Navigation</h3> | |||
<p> | |||
A strip is focused when you click on it. Focus can be moved among strips with the <tt>Tab</tt> and <tt>Shift-Tab</tt> keys. | |||
</p> | |||
<h3 id="n:1.2.2.">1.2.2. Control</h3> | |||
<p> | |||
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one). | |||
</p> | |||
<h3 id="n:1.2.3.">1.2.3. Signal Chain</h3> | |||
<p> | |||
The signal chain view of a mixer strip provides a way to view and manipulate the signal processing of a mixer strip. | |||
</p> | |||
<h4 id="n:1.2.3.1.">1.2.3.1. Modules</h4> | |||
<center><div class="fig image"><table id="Fig.1.4" border=1> | |||
<caption> | |||
<strong>Fig. 1.4.</strong> Modules | |||
</caption> | |||
<tr><td><img src="modules.png" alt="fig. 1.4"></td></tr> | |||
</table></div></center> | |||
<p> | |||
All signal processing in Non Mixer occurs in <i>Modules</i>. Modules are signal processing abstractions providing ports for audio and control I/O and, in addition, some simple user interface. Sink and source modules carry audio out of and into JACK. | |||
</p> | |||
<p> | |||
Modules are displayed as named blocks. Some modules (e.g. the Meter module) may have additional GUI components. | |||
</p> | |||
<p> | |||
Each module has zero or more audio I/O ports and zero or more control ports. Audio routing between modules is handled automatically. Modules with mono audio configurations (one channel in, one channel out) can be automatically adjusted to support any number of discrete channels. Modules with more (related) channels, however, introduce restrictions on the order in which modules can be chained. | |||
</p> | |||
<p> | |||
An indicator in the upper left-hand corner of each module block indicates whether the module has any parameters bound to controls. | |||
</p> | |||
<p> | |||
Non Mixer has several built-in modules. They are: | |||
</p> | |||
<dl> | |||
<dt><em>JACK</em></dt> | |||
<dd>Performs JACK I/O</dd> | |||
<dt><em>Gain</em></dt> | |||
<dd>Applies gain in dB</dd> | |||
<dt><em>Meter</em></dt> | |||
<dd>Digital Peak Meter</dd> | |||
<dt><em>Mono Pan</em></dt> | |||
<dd>Performs intensity panning of a mono signal into a stereo signal.</dd> | |||
<dt><em>Aux</em></dt> | |||
<dd>Provides auxiliary outputs</dd> | |||
<dt><em>Spatializer</em></dt> | |||
<dd>Provides advanced Ambisonics spatialization with distance simulation.</dd> | |||
<dt><em>Plugin</em></dt> | |||
<dd>Hosts a LADSPA plugin</dd> | |||
</dl> | |||
<h5 id="n:1.2.3.1.1.">1.2.3.1.1. OSC Control</h5> | |||
<p> | |||
The input parameters of all modules are controllable via OSC, regardless of whether the parameter is set as controllable. | |||
</p> | |||
<p> | |||
The format of the automatically generated OSC path names is as follows: | |||
</p> | |||
<div class="fig example"><table width=100%><tr><td><pre> | |||
/strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME] | |||
</pre></td></tr> | |||
</table></div> | |||
<p> | |||
The UDP port that the OSC server binds to can be set by providing the <tt>--osc-port</tt> command-line option. Without this option, a random port will be bound automatically (the exact OSC URL will always be printed to the console as a line beginning with "OSC: "). | |||
</p> | |||
<p> | |||
The default path accepts a float value between 0.0 and 1.0 (a Control Voltage like signal) which will be automatically scaled to the allowable range of the control. | |||
</p> | |||
<p> | |||
A path ending in /unscaled is also available, which accepts exact values, which will be clamped to the allowable range. For example: | |||
</p> | |||
<div class="fig example"><table width=100%><tr><td><pre> | |||
/strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]/unscaled | |||
</pre></td></tr> | |||
</table></div> | |||
<p> | |||
If same module/plugin is used twice in a signal chain (e.g. multiple Gain stages), then a position dependent sequence number will be appended to the module name. For example, a path might look like the following: | |||
</p> | |||
<div class="fig example"><table width=100%><tr><td><pre> | |||
/strip/Foo/Gain.1/Gain_(dB) | |||
</pre></td></tr> | |||
</table></div> | |||
<p> | |||
For the second instance of the Gain module on the strip named 'Foo'. | |||
</p> | |||
<p> | |||
There's a possibility to get exact OSC path for module controls. For this you need to switch strip mode to 'Signl', right click a module, for example 'Gain', and open 'Edit parameters' dialog. OSC path will be shown in a statusbar of the main window when you hover a parameter. | |||
</p> | |||
<p> | |||
Non-DAW accesses these same signals via a more advanced signal routing layer on top of OSC. Any module parameter is easily controlled via Control Sequences in Non-DAW without the need to specify an OSC URL. | |||
</p> | |||
<h5 id="n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</h5> | |||
<p> | |||
Automatic translation between MIDI and Non's OSC Signals can be achieved by adding the headless program <tt>non-midi-mapper</tt> (included in the Non-Mixer distribution) to an NSM session. | |||
</p> | |||
<p> | |||
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be connected to a suitable controller device. | |||
</p> | |||
<p> | |||
In Non-Mixer, the <tt>Remote Control/Start Learning</tt> menu item enters learning mode in which Non Mixer can be taught which controls to associated with which MIDI messages by clicking a control in Non-Mixer and moving the desired control on the MIDI device. <tt>Remote Control/End Learning</tt> ends the learning session. | |||
</p> | |||
<p> | |||
The mapping will be saved with the NSM session. | |||
</p> | |||
<h5 id="n:1.2.3.1.3.">1.2.3.1.3. Manipulation</h5> | |||
<p> | |||
Left-clicking on a module brings up a Module Parameter Editor window for the selected module. | |||
</p> | |||
<p> | |||
Right-clicking on a module brings up a context menu allowing you manipulate the module, as well as to pick a new module to insert before the selected one in the chain. | |||
</p> | |||
<p> | |||
Middle-clicking on a module toggles its activation state (the audio signal will bypass inactive modules). | |||
</p> | |||
<p> | |||
Control+Right-clicking on a module causes it to be removed from the chain (modules added by default cannot be removed). | |||
</p> | |||
<p> | |||
The focused module may also be controlled via the keyboard. <tt>Menu</tt> brings up the context menu for the focused module. <tt>Space</tt> opens the module parameter editor, <tt>b</tt> toggles the bypassed state, and <tt>Delete</tt> removes the module from the chain (without confirmation!). <tt>Control-X</tt>, <tt>Control-C</tt> and <tt>Control-V</tt>, cut, copy, and paste modules, respectively. Modules may be copied within or across chain boundaries. The normal module I/O constraints also apply to pasted modules. | |||
</p> | |||
<h5 id="n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</h5> | |||
<center><div class="fig image"><table id="Fig.1.5" border=1> | |||
<caption> | |||
<strong>Fig. 1.5.</strong> Module Parameter Editor | |||
</caption> | |||
<tr><td><img src="module-parameter-editor.png" alt="fig. 1.5"></td></tr> | |||
</table></div></center> | |||
<p> | |||
The Module Parameter Editor is used to alter the values of a module's parameters, and in addition, to bind its parameters to controls. A menu button in the upper left-hand corner allows you to select between knob, vertical slider and horizontal slider controls. | |||
</p> | |||
<p> | |||
Underneath each control is a bind button. Clicking adds a new control to the chain's <i>Controls</i> view and binds it to the parameter in question. For simplicity, only one control at a time may be bound to a given parameter. | |||
</p> | |||
<h5 id="n:1.2.3.1.5.">1.2.3.1.5. Controls</h5> | |||
<center><div class="fig image"><table id="Fig.1.6" border=1> | |||
<caption> | |||
<strong>Fig. 1.6.</strong> Control View | |||
</caption> | |||
<tr><td><img src="controls.png" alt="fig. 1.6"></td></tr> | |||
</table></div></center> | |||
<p> | |||
The control view of a chain groups together all of the controls bound to parameters of modules in that chain. The default mode of controls is <i>Manual</i>. Right click on a control to bring up a menu which will allow you to select one of the available control I/O methods to use. When <i>Control Voltage</i> (CV) is selected, a CV input port will be created on the containing mixer strip's JACK client. The control will now accept values from that input. A control bound and configured in this way can then be connected to the output of a Non-DAW control sequence using your favorite connection manager. | |||
</p> | |||
<div class=admonition> | |||
<table width=100%> | |||
<tr><td>NOTE: | |||
All knob and slider controls respond to mousewheel | |||
events. Hold down the `Ctrl` key while scrolling the mousewheel to | |||
achieve finer resolution. | |||
</td></table> | |||
</div> | |||
<h6 id="n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</h6> | |||
<p> | |||
The control voltage concept should be familiar to anyone who has experience with analog modular synthesizers. MIDI, while having definite advantages in many respects, multiplexes control data in such a way as to make connecting one MIDI control to a parameter involve a significant inconvenience, usually requiring the adjustment of settings on both ends of the connection in order to separate the control data streams. | |||
</p> | |||
<p> | |||
Control Voltages, on the other hand, provide a simple 1:1 source to sink relationship and offer much higher resolution, both in time and value, than can be natively expressed through MIDI. The chief advantage of CV in the context of Non-DAW is the ease with which an control sequence can be connected to a mixer module parameter. If you have a MIDI controller that you'd like to use to control parameters of Non-Mixer, consider <i>jm2cv</i>, a JACK MIDI to Control Voltage daemon which was written by Peter Nelson specifically for use with Non-Mixer. jm2cv can be acquired by: | |||
</p> | |||
<div class="fig example"><table width=100%><tr><td><pre> | |||
git clone git://fuzzle.org/jm2cv.git | |||
</pre></td></tr> | |||
</table></div> | |||
<div class=admonition> | |||
<table width=100%> | |||
<tr><td>NOTE: | |||
The use of Control Signals (OSC) should be preferred for most types | |||
of parameter automation, as LADSPA plugins are incapable of | |||
processing Control Voltage signals at full audio resolution anyway. | |||
</td></table> | |||
</div> | |||
<h5 id="n:1.2.3.1.6.">1.2.3.1.6. Spatialization </h5> | |||
<h6 id="n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</h6> | |||
<center><div class="fig image"><table border=1> | |||
<tr><td><img src="spatializer-module.png" alt="fig. "></td></tr> | |||
</table></div></center> | |||
<p> | |||
The Spatializer Module included with Non Mixer allows one to not only control the position of a sound source (angle and elevation), but also to control it's apparent distance from the listener. | |||
</p> | |||
<p> | |||
Distance cues are based on physical properties--the speed of sound in air, the damping effect of humidity, the ratio of reverb early and late reflections, the volume of the sound. | |||
</p> | |||
<p> | |||
In legacy mixers, all of these properties must be controlled individually by the engineer. This is nearly always a process of trial and error. Much of a studio engineers' skill lies in his ability to guess at these values and arrive at a reasonably realistic sounding result. | |||
</p> | |||
<p> | |||
Non Mixer eliminates the guesswork and combines all of these controls into a single spatialization point encoding both a sound source's position relative to the listener and its distance. No matter where the point is placed, the result will be realistic. | |||
</p> | |||
<p> | |||
Use of the Spatializer Modules eliminates much complexity from the mixing process. No more back and forth, no more guessing at values for reverb sends and predelay and EQ. The Spatializer does it all for you. | |||
</p> | |||
<p> | |||
The B-Format outputs of the Spatializer Module are in the order standard order WXYZ. | |||
</p> | |||
<p> | |||
All Spatializer Module instances will present controls and aziumuth, elevation, and radius. Additionally, a <i>Highpass</i> control is provided to compensate for the proximity effect in close-mic'd signals. The default cutoff is 200Hz. Adjust it according to the nature of the input signal. | |||
</p> | |||
<p> | |||
A Spatializer Module fed stereo input will perform stereo encoding and will present a <i>Width</i> control. | |||
</p> | |||
<h7 id="n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</h7> | |||
<p> | |||
The Spatializer module is intended to work with an external reverb engine having Ambisonics B-Format inputs for early reflections and a Mono input for reverb tail (and, of course, B-Format outputs). | |||
</p> | |||
<center><div class="fig image"><table border=1> | |||
<tr><td><img src="reverb-routing.png" alt="fig. "></td></tr> | |||
</table></div></center> | |||
<p> | |||
The Spatializer Module has two sets auxiliary outputs for reverb send. One, consisting of a single mono signal, is intended to be connected to the input of a reverb tail, otherwise known as a diffuse field. Another set of outputs in B-Format is indended to be connected to the B-Format inputs of an early reflection reverb engine. The output of the reverb engine should be 100% 'wet'. | |||
</p> | |||
<p> | |||
I have crafted several jconvolver config files that meet these specifications. They can be found in <a class=ext href="http://non.tuxfamily.org/ambiverb.tar.bz2">ambiverb.tar.bz2</a> | |||
</p> | |||
<p> | |||
The main outputs of the strip should go to a master bus, into which the output of the reverb engine is also fed. | |||
</p> | |||
<h6 id="n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</h6> | |||
<p> | |||
There are several Ambisonics panners/encoders released as LADSPA plugins. When one of these plugins is added to a strip, Non Mixer will detect its parameter signature and create a Spatialization Control for it just as with the Spatializer Module. | |||
</p> | |||
<center><div class="fig image"><table id="Fig.1.7" border=1> | |||
<caption> | |||
<strong>Fig. 1.7.</strong> Spatialization Control on a Strip | |||
</caption> | |||
<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.7"></td></tr> | |||
</table></div></center> | |||
<p> | |||
Whenever a module is added to a strip whose set of parameters include parameters named Azimuth and Elevation (and perhaps Radius), Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor. | |||
</p> | |||
<center><div class="fig image"><table id="Fig.1.8" border=1> | |||
<caption> | |||
<strong>Fig. 1.8.</strong> Spatialization Control in the Module Parameter Editor | |||
</caption> | |||
<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.8"></td></tr> | |||
</table></div></center> | |||
<p> | |||
The spatialization control may be visualized as moving the sound source across the surface of a hemispherical dome enclosing the listener. | |||
</p> | |||
<p> | |||
The output of the spatializing plugin may be routed into a decoding plugin following it the same strip or, more usefully, the output of a number of Ambisonic panning plugins on different strips may be routed (through JACK) into a single master decoder instance on a final strip. | |||
</p> | |||
<h2 id="n:1.3.">1.3. Spatialization Console</h2> | |||
<center><div class="fig image"><table border=1> | |||
<tr><td><img src="spatialization-console.png" alt="fig. "></td></tr> | |||
</table></div></center> | |||
<p> | |||
The Spatialization Console allows the user to view and control all of the source positions in an Ambisonics mix at once. | |||
</p> | |||
<p> | |||
The visibility of the Spatialization Console may be toggled with the <tt>F8</tt> key. | |||
</p> | |||
<p> | |||
The console will display a point for each Spatializer Module or other Ambisonics panner plugin contained in the mix. | |||
</p> | |||
<p> | |||
There are two projections available, Planar and Spherical. The range of the view can be adjusted with the range dropdown in the lower lefthand corner. | |||
</p> | |||
<h2 id="n:1.4.">1.4. Projects</h2> | |||
<p> | |||
A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, project specific settings, and some meta-data. A project is completely self-contained. You can rename a project as simply as: | |||
</p> | |||
<div class="fig example"><table width=100%><tr><td><pre> | |||
$ mv Project-A Project-B | |||
</pre></td></tr> | |||
</table></div> | |||
<h3 id="n:1.4.1.">1.4.1. JACK I/O</h3> | |||
<p> | |||
Each mixer strip is presented as a separate JACK "client". This helps to avoid the necessity of internally duplicating JACK's routing logic and, with JACK2, permits the possibility of parallel execution of mixer strip signal chains. | |||
</p> | |||
<p> | |||
The JACK client name of each strip will correspond to the name of the strip. | |||
</p> | |||
<div class=admonition> | |||
<table width=100%> | |||
<tr><td>NOTE: | |||
The JACK API makes implementing this far more difficult and kludgey than it should have to be. | |||
Please petition your local JACK developer to accept jack_client_set_name() into the API. | |||
</td></table> | |||
</div> | |||
<center><div class="fig image"><table id="Fig.1.9" border=1> | |||
<caption> | |||
<strong>Fig. 1.9.</strong> Patchage | |||
</caption> | |||
<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.9"></td></tr> | |||
</table></div></center> | |||
</div> | |||
</body> | |||
</html> |
@@ -1,544 +0,0 @@ | |||
! title Non Mixer User Manual | |||
! author Jonathan Moore Liles #(email,male@tuxfamily.org) | |||
: Non Mixer User Manual | |||
/ Mixer | |||
< non-mixer-complex.png | |||
The Non-Mixer is a stand-alone audio mixer, utilizing JACK as an | |||
audio subsystem. At the time of writing, the architecture of | |||
Non-Mixer is unique. By making the mixer stand-alone, concepts such | |||
as busses, sends, and inserts are eliminated, as the same goals can | |||
be achieved by simply adding more strips to the mixer. | |||
Start by creating a new project (menu item `Project\/New`). | |||
/ New Project | |||
< new-project.png | |||
After the project has been created. Hit `a` or choose `Mixer\/Add | |||
Strip` from the menu to add a new strip to the mixer. | |||
:: Mixer Groups | |||
< group-dropdown.png | |||
Groups serve several purposes. Firstly, they allow for some | |||
organization of strips. Groups also allow parallel relationships of | |||
mixer strips to be made explicit. This has important performance | |||
implications in JACK2. Non Mixer supports an unlimited number of | |||
groups, each of which can contain an unlimited number of mixer | |||
strips. | |||
::: How to Choose Groupings | |||
All strips in a group should be completely parallel with no feedback | |||
loop connections. A typical group might be named 'Input' and contain | |||
all input strips (strips that accept input from Non Timeline and | |||
have outputs all connecting to some master bus). | |||
To put it another way, if you have 100 inputs strips with identical | |||
output configurations (e.g. stereo or B-Format), that all connect to | |||
a master bus, then you have a candidate for a group. | |||
::: Considering JACK Overhead | |||
JACK provides immense flexibility. But, as in most situations, that | |||
flexibility comes with a cost. In JACK the cost is a context switch | |||
per client. This applies /even for many clients which belong to the | |||
same process/, as in Non Mixer. Various factors go into determining | |||
the price of a context switch on any given system. It's not very | |||
expensive, but it does add up. It becomes problematic in sessions | |||
involving many clients (think 100s), each of which having a small | |||
DSP load (often smaller than the cost of JACK's context context | |||
switch). JACK *could* be smart enough to recognize that some clients | |||
belong to the same process and could be executed serially without | |||
requiring a context switch, but at the time of writing neither JACK1 | |||
nor JACK2's scheduling is that smart. | |||
If you're mixing a normal song (couple of dozen tracks) at low | |||
latency, this overhead will probably account for less than 1% of the | |||
total DSP load. If you're mixing an entire orchestra at ultra-low | |||
latency, then it might account for a quarter or more of the total | |||
DSP load. | |||
Groups mitigate this cost by reducing the number of JACK clients | |||
required for a mix. Strips in a group will execute serially without | |||
context switches or thread synchronization--reducing the total JACK | |||
overhead. However, if you have several groups, then they may all by | |||
run in parallel by JACK2. | |||
A mixer which uses a single JACK client (which is basically the way | |||
everything other than Non Mixer has been designed) is not a viable | |||
solution by this author's definition, because such a mixer cannot be | |||
from/to any other JACK clients without introducing an extra period | |||
of latency. | |||
To illustrate this point here are some figures from an actual song | |||
session including the whole Non suite plus a sampler, a synth and an | |||
ambisonics convolution reverb with a total of 13 strips in 4 groups | |||
in different configurations on the same system. | |||
JACK's DSP load figures are interpreted thus: if at a 2.7ms software | |||
latency setting the average time a proces cycle takes to complete is | |||
2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is | |||
80%. This is true for both JACK1 and JACK2. The difference is that | |||
JACK2 may use all available CPU cores to execute the graph (if | |||
there are enough clients in parallel signal flow). | |||
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms) | |||
[[ JACK Ver, Groups, DSP Load | |||
[[ JACK1, N, 39% | |||
[[ JACK1, Y, 27% | |||
[[ JACK2, N, 24% | |||
[[ JACK2, Y, 31% | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms) | |||
[[ JACK Ver, Groups, DSP Load | |||
[[ JACK1, N, 28% | |||
[[ JACK1, Y, 12% | |||
[[ JACK2, N, 12% | |||
[[ JACK2, Y, 11% | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms) | |||
[[ JACK Ver, Groups, DSP Load | |||
[[ JACK1, N, 29% | |||
[[ JACK1, Y, 17% | |||
[[ JACK2, N, 17% | |||
[[ JACK2, Y, 17% | |||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms) | |||
[[ JACK Ver, Groups, DSP Load | |||
[[ JACK1, N, x | |||
[[ JACK1, Y, x | |||
[[ JACK2, N, 43% | |||
[[ JACK2, Y, 41% | |||
As you can see, for multiprocessor systems, JACK2 clearly has an | |||
advantage even without grouping. | |||
Of course, results will vary depending on the system and the mix. On | |||
the dual core system, performance actually degraded with JACK2 when | |||
using groups--this is because the number of parallel flows that | |||
JACK2 detected was reduced and the second core was being under | |||
utilized. Similarly, the performance of the 8-core AMD system | |||
doesn't seem that great even in the ungrouped mode--this is because | |||
the DSP load of each individual client is around the same as the | |||
cost of the context switching. It's a wash either way (if each strip | |||
had more or more complex modules on it, then the ungrouped mode | |||
would probably perform better). Since JACK1 cannot take advantage of | |||
more than 1 CPU core, there is no benefit to parallelism and grouped | |||
mode always outperforms ungrouped mode. | |||
So, for maximum capacity the combination of a multicore CPU with | |||
JACK2 and mixer groups is best. | |||
# All strips in a group *MUST* have the same output configuration. All | |||
# outputs will be mixed together by identity. That is, the 'AUX \(A\)' | |||
# outputs of each strip will be mixed together into a single 'AUX \(A\)' | |||
# output of the group. A strip within a group whose output | |||
# configuration differs from the group configuration will be marked as | |||
# invalid and will not be executed. | |||
::: Creating a New Group | |||
Groups can be created by selecting the group dropdown on any mixer | |||
strip and choosing 'New Group'. A window will popup asking for a | |||
group name. Group names must be unique. The group will then be | |||
created and the selected strip added to it. | |||
::: Adding a Strip to an Existing Group | |||
To add a strip to an existing group, simply select a group name from | |||
the group dropdown on the strip. | |||
::: Removing a Strip from a Group | |||
Select '---' from the group dropdown. The strip will be removed from | |||
the group and will run in an independent JACK client. | |||
::: Removing a Group | |||
Groups are destroyed automatically as soon as they contain zero | |||
strips. | |||
::: Monitoring Group DSP Load | |||
Above the grop dropdown on each strip is a DSP load meter for the | |||
selected group. For ungrouped strips or strips which are the only | |||
one in their group, this is simply the DSP load of the single strip. | |||
If DSP usage goes up when strips are fed silence, then you're | |||
probably running a plugin which has denormal issues. | |||
:: Mixer Strips | |||
/ Mixer Strip | |||
< single-strip.png | |||
Each mixer strip has a name and color, each of which may be defined | |||
by the user. Names, but not colors, must be unique. In addition, | |||
each strip has controls to move it left or right (the arrows) in the | |||
display and to remove it entirely (the 'X'). | |||
Strips start out in /narrow/ mode, with the /fader/ view | |||
enabled. Click the desired button to toggle the mode or view. | |||
Each strip has a context menu which lists the available options | |||
and their associated key-bindings. To bring up the context menu, `Right | |||
The fader view comprises a large gain control and digital peak meter | |||
indicator. These are automatically connected to the default gain and | |||
meter modules of the strip's signal chain. | |||
To see how an audio signal traveling through this strip will be | |||
processed, switch to its /signal/ view. | |||
::: Navigation | |||
A strip is focused when you click on it. Focus can be moved among | |||
strips with the `Tab` and `Shift-Tab` keys. | |||
::: Control | |||
The focused strip can be moved in the display order via the `[` and | |||
`]` keys. `Delete` removes a strip (with confirmation dialog). `n` | |||
and `w` set the focused strip's width to /narrow/ or /wide/, | |||
respectively, and `f` and `s` switch between /fader/ and /signal/ | |||
views. The strip's context menu can be invoked without the mouse by | |||
hitting the `Menu` key (assuming your keyboard has one). | |||
::: Signal Chain | |||
The signal chain view of a mixer strip provides a way to view and | |||
manipulate the signal processing of a mixer strip. | |||
:::: Modules | |||
/ Modules | |||
< modules.png | |||
All signal processing in Non Mixer occurs in /Modules/. Modules are | |||
signal processing abstractions providing ports for audio and control | |||
I\/O and, in addition, some simple user interface. Sink and source | |||
modules carry audio out of and into JACK. | |||
Modules are displayed as named blocks. Some modules (e.g. the Meter | |||
module) may have additional GUI components. | |||
Each module has zero or more audio I\/O ports and zero or more | |||
control ports. Audio routing between modules is handled | |||
automatically. Modules with mono audio configurations (one channel | |||
in, one channel out) can be automatically adjusted to support any | |||
number of discrete channels. Modules with more (related) channels, | |||
however, introduce restrictions on the order in which modules can be | |||
chained. | |||
An indicator in the upper left-hand corner of each module block | |||
indicates whether the module has any parameters bound to controls. | |||
Non Mixer has several built-in modules. They are: | |||
= JACK | |||
= Performs JACK I\/O | |||
= Gain | |||
= Applies gain in dB | |||
= Meter | |||
= Digital Peak Meter | |||
= Mono Pan | |||
= Performs intensity panning of a mono signal into a stereo signal. | |||
= Aux | |||
= Provides auxiliary outputs | |||
= Spatializer | |||
= Provides advanced Ambisonics spatialization with distance simulation. | |||
= Plugin | |||
= Hosts a LADSPA plugin | |||
::::: OSC Control | |||
The input parameters of all modules are controllable via OSC, | |||
regardless of whether the parameter is set as controllable. | |||
The format of the automatically generated OSC path names is as follows: | |||
> /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME] | |||
The UDP port that the OSC server binds to can be set by providing | |||
the `--osc-port` command-line option. Without this option, a random | |||
port will be bound automatically (the exact OSC URL will always be | |||
printed to the console as a line beginning with "OSC: "). | |||
The default path accepts a float value between 0.0 and 1.0 (a | |||
Control Voltage like signal) which will be automatically scaled to | |||
the allowable range of the control. | |||
A path ending in \/unscaled is also available, which accepts exact values, | |||
which will be clamped to the allowable range. For example: | |||
> /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]/unscaled | |||
If same module\/plugin is used twice in a signal chain | |||
(e.g. multiple Gain stages), then a position dependent sequence | |||
number will be appended to the module name. For example, a path | |||
might look like the following: | |||
> /strip/Foo/Gain.1/Gain_(dB) | |||
For the second instance of the Gain module on the strip named 'Foo'. | |||
There's a possibility to get exact OSC path for module controls. | |||
For this you need to switch strip mode to 'Signl', right click a | |||
module, for example 'Gain', and open 'Edit parameters' dialog. OSC | |||
path will be shown in a statusbar of the main window when you | |||
hover a parameter. | |||
Non-DAW accesses these same signals via a more advanced signal | |||
routing layer on top of OSC. Any module parameter is easily | |||
controlled via Control Sequences in Non-DAW without the need to | |||
specify an OSC URL. | |||
::::: MIDI Control | |||
Automatic translation between MIDI and Non's OSC Signals can be | |||
achieved by adding the headless program `non-midi-mapper` (included in the | |||
Non-Mixer distribution) to an NSM session. | |||
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be | |||
connected to a suitable controller device. | |||
In Non-Mixer, the `Remote Control\/Start Learning` menu item enters learning | |||
mode in which Non Mixer can be taught which controls to associated with which | |||
MIDI messages by clicking a control in Non-Mixer and moving the desired control | |||
on the MIDI device. `Remote Control\/End Learning` ends the learning session. | |||
The mapping will be saved with the NSM session. | |||
::::: Manipulation | |||
Left-clicking on a module brings up a Module Parameter Editor window | |||
for the selected module. | |||
Right-clicking on a module brings up a context menu allowing you | |||
manipulate the module, as well as to pick a new module to insert | |||
before the selected one in the chain. | |||
Middle-clicking on a module toggles its activation state (the audio | |||
signal will bypass inactive modules). | |||
Control+Right-clicking on a module causes it to be removed from the | |||
chain (modules added by default cannot be removed). | |||
The focused module may also be controlled via the keyboard. `Menu` | |||
brings up the context menu for the focused module. `Space` opens the | |||
module parameter editor, `b` toggles the bypassed state, and | |||
`Delete` removes the module from the chain (without confirmation!). | |||
`Control-X`, `Control-C` and `Control-V`, cut, copy, and paste | |||
modules, respectively. Modules may be copied within or across chain | |||
boundaries. The normal module I\/O constraints also apply to pasted | |||
modules. | |||
::::: Module Parameter Editor | |||
/ Module Parameter Editor | |||
< module-parameter-editor.png | |||
The Module Parameter Editor is used to alter the values of a | |||
module's parameters, and in addition, to bind its parameters to | |||
controls. A menu button in the upper left-hand corner allows you to | |||
select between knob, vertical slider and horizontal slider controls. | |||
Underneath each control is a bind button. Clicking adds a new | |||
control to the chain's /Controls/ view and binds it to the parameter | |||
in question. For simplicity, only one control at a time may be bound | |||
to a given parameter. | |||
::::: Controls | |||
/ Control View | |||
< controls.png | |||
The control view of a chain groups together all of the controls | |||
bound to parameters of modules in that chain. The default mode of | |||
controls is /Manual/. Right click on a control to bring up a menu | |||
which will allow you to select one of the available control I\/O | |||
methods to use. When /Control Voltage/ (CV) is selected, a CV input | |||
port will be created on the containing mixer strip's JACK | |||
client. The control will now accept values from that input. A | |||
control bound and configured in this way can then be connected to | |||
the output of a Non-DAW control sequence using your favorite | |||
connection manager. | |||
{ NOTE: | |||
{ All knob and slider controls respond to mousewheel | |||
{ events. Hold down the `Ctrl` key while scrolling the mousewheel to | |||
{ achieve finer resolution. | |||
:::::: Control Voltages | |||
The control voltage concept should be familiar to anyone who has | |||
experience with analog modular synthesizers. MIDI, while having | |||
definite advantages in many respects, multiplexes control data in | |||
such a way as to make connecting one MIDI control to a parameter | |||
involve a significant inconvenience, usually requiring the | |||
adjustment of settings on both ends of the connection in order to | |||
separate the control data streams. | |||
Control Voltages, on the other hand, provide a simple 1:1 source to | |||
sink relationship and offer much higher resolution, both in time and | |||
value, than can be natively expressed through MIDI. The chief | |||
advantage of CV in the context of Non-DAW is the ease with which an | |||
control sequence can be connected to a mixer module parameter. If | |||
you have a MIDI controller that you'd like to use to control | |||
parameters of Non-Mixer, consider /jm2cv/, a JACK MIDI to Control | |||
Voltage daemon which was written by Peter Nelson specifically for | |||
use with Non-Mixer. jm2cv can be acquired by: | |||
> git clone git://fuzzle.org/jm2cv.git | |||
{ NOTE: | |||
{ The use of Control Signals (OSC) should be preferred for most types | |||
{ of parameter automation, as LADSPA plugins are incapable of | |||
{ processing Control Voltage signals at full audio resolution anyway. | |||
::::: Spatialization | |||
:::::: Spatializer Module | |||
< spatializer-module.png | |||
The Spatializer Module included with Non Mixer allows one to not | |||
only control the position of a sound source (angle and elevation), | |||
but also to control it's apparent distance from the listener. | |||
Distance cues are based on physical properties--the speed of sound | |||
in air, the damping effect of humidity, the ratio of reverb early and | |||
late reflections, the volume of the sound. | |||
In legacy mixers, all of these properties must be controlled | |||
individually by the engineer. This is nearly always a process of | |||
trial and error. Much of a studio engineers' skill lies in his | |||
ability to guess at these values and arrive at a reasonably | |||
realistic sounding result. | |||
Non Mixer eliminates the guesswork and combines all of these | |||
controls into a single spatialization point encoding both a sound | |||
source's position relative to the listener and its distance. No | |||
matter where the point is placed, the result will be realistic. | |||
Use of the Spatializer Modules eliminates much complexity from the | |||
mixing process. No more back and forth, no more guessing at values | |||
for reverb sends and predelay and EQ. The Spatializer does it all | |||
for you. | |||
The B-Format outputs of the Spatializer Module are in the order | |||
standard order WXYZ. | |||
All Spatializer Module instances will present controls and aziumuth, | |||
elevation, and radius. Additionally, a /Highpass/ control is | |||
provided to compensate for the proximity effect in close-mic'd | |||
signals. The default cutoff is 200Hz. Adjust it according to the | |||
nature of the input signal. | |||
A Spatializer Module fed stereo input will perform stereo encoding | |||
and will present a /Width/ control. | |||
::::::: Reverb Routing | |||
The Spatializer module is intended to work with an external reverb | |||
engine having Ambisonics B-Format inputs for early reflections and a | |||
Mono input for reverb tail (and, of course, B-Format outputs). | |||
< reverb-routing.png | |||
The Spatializer Module has two sets auxiliary outputs for reverb | |||
send. One, consisting of a single mono signal, is intended to be | |||
connected to the input of a reverb tail, otherwise known as a | |||
diffuse field. Another set of outputs in B-Format is indended to be | |||
connected to the B-Format inputs of an early reflection reverb | |||
engine. The output of the reverb engine should be 100% 'wet'. | |||
I have crafted several jconvolver config files that meet these | |||
specifications. They can be found in #(url,http:\/\/non.tuxfamily.org\/ambiverb.tar.bz2,ambiverb.tar.bz2) | |||
The main outputs of the strip should go to a master bus, into which | |||
the output of the reverb engine is also fed. | |||
:::::: LADSPA Plugins | |||
There are several Ambisonics panners\/encoders released as LADSPA | |||
plugins. When one of these plugins is added to a strip, Non Mixer | |||
will detect its parameter signature and create a Spatialization | |||
Control for it just as with the Spatializer Module. | |||
/ Spatialization Control on a Strip | |||
< spatialization-on-strip.png | |||
Whenever a module is added to a strip whose set of parameters | |||
include parameters named Azimuth and Elevation (and perhaps Radius), | |||
Non-Mixer will detect this and automatically attach a Spatializer | |||
control to these parameters. The Spatializer will be displayed at | |||
the bottom of the mixer strip. A larger version of the control may | |||
also be found in the Module Parameter Editor. | |||
/ Spatialization Control in the Module Parameter Editor | |||
< spatialization-in-mpe.png | |||
The spatialization control may be visualized as moving the sound | |||
source across the surface of a hemispherical dome enclosing the | |||
listener. | |||
The output of the spatializing plugin may be routed into a decoding | |||
plugin following it the same strip or, more usefully, the output of | |||
a number of Ambisonic panning plugins on different strips may be | |||
routed (through JACK) into a single master decoder instance on a | |||
final strip. | |||
:: Spatialization Console | |||
< spatialization-console.png | |||
The Spatialization Console allows the user to view and control all | |||
of the source positions in an Ambisonics mix at once. | |||
The visibility of the Spatialization Console may be toggled with the `F8` key. | |||
The console will display a point for each Spatializer Module or | |||
other Ambisonics panner plugin contained in the mix. | |||
There are two projections available, Planar and Spherical. The range | |||
of the view can be adjusted with the range dropdown in the lower | |||
lefthand corner. | |||
:: Projects | |||
A Non-Mixer project is a directory where Non-Mixer keeps the strip | |||
settings, project specific settings, and some meta-data. A project | |||
is completely self-contained. You can rename a project as simply as: | |||
> $ mv Project-A Project-B | |||
::: JACK I/O | |||
Each mixer strip is presented as a separate JACK "client". This | |||
helps to avoid the necessity of internally duplicating JACK's | |||
routing logic and, with JACK2, permits the possibility of parallel | |||
execution of mixer strip signal chains. | |||
The JACK client name of each strip will correspond to the name of the strip. | |||
{ NOTE: | |||
{ The JACK API makes implementing this far more difficult and kludgey than it should have to be. | |||
{ Please petition your local JACK developer to accept jack_client_set_name() into the API. | |||
/ Patchage | |||
< non-mixer-and-non-daw-in-patchage.png |
@@ -1,23 +0,0 @@ | |||
SRCS=$(wildcard *.mu) | |||
OBJS=$(SRCS:.mu=.html) | |||
%.html: %.mu | |||
@ echo Mupping $<... | |||
@ mup.wrapper html $< | |||
.PHONY: all clean | |||
all: $(OBJS) | |||
upload: all | |||
@ rsync -L mup.css MANUAL.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs | |||
install: | |||
@ install -d "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer | |||
@ cp $(OBJS) *.png mup.css ../../COPYING "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer | |||
# @ ln -sf $(PIXMAP_PATH)/logo.png $(DOCUMENT_PATH) | |||
clean: | |||
rm -f $(OBJS) |
@@ -1 +0,0 @@ | |||
../icons/hicolor/256x256/apps/non-mixer.png |
@@ -1,461 +0,0 @@ | |||
/* Example CSS Style for MUP */ | |||
body | |||
{ | |||
font: normal normal 14pt "Helvetica", sans-serif; | |||
/* background: url("http://non.tuxfamily.org/background-pattern.png") fixed; */ | |||
background-color: #121212; color: lightgray; padding: 0; margin: 0; | |||
} | |||
a:link { | |||
color: white; | |||
} | |||
a:visited { | |||
color: olive; | |||
} | |||
a:active { | |||
color: white; | |||
} | |||
a:link:hover { | |||
text-decoration: underline; | |||
} | |||
/* #(url) */ | |||
a.ext:link { | |||
color: red; | |||
text-decoration: none; | |||
border-bottom: dashed silver 1; | |||
} | |||
a.ext:visited { | |||
color: darkred; | |||
border-bottom: dashed silver 1; | |||
text-decoration: none; | |||
} | |||
/* #(ref) */ | |||
a.int:link { | |||
border-bottom: dashed silver 0.15em; | |||
} | |||
a.int:link:hover { | |||
text-decoration: none; | |||
color: white; | |||
} | |||
/* | |||
a[href^="#"]:link { | |||
border-bottom: dashed silver 0.15em; | |||
} | |||
a[href^="#"]:link:hover { | |||
text-decoration: none; | |||
color: white; | |||
} | |||
*/ | |||
p:contains("Warning:") { | |||
background: #d00; | |||
color: white; | |||
border: dotted gray 0.5em; | |||
display: block; | |||
} | |||
/* First letter of first paragraph of every chapter */ | |||
/* | |||
h1 + p:first-letter { | |||
text-transform: uppercase; | |||
float: left; | |||
line-height: 0.8em; | |||
font-size: 350%; | |||
font-family: Serif; | |||
letter-spacing: 0; | |||
margin-right: 0.1em; | |||
margin-top: 0.1em; | |||
border: solid gray 1px; | |||
padding: 1px; | |||
color: #d00; | |||
text-shadow: #666 3px 3px 3px; | |||
} | |||
*/ | |||
/* First paragraph of every chapter */ | |||
/* | |||
h1 + p { | |||
text-indent: 0; | |||
} | |||
*/ | |||
/* cover */ | |||
#cover * { | |||
background: transparent; | |||
} | |||
#cover { | |||
position: relative; | |||
/* background: #da0;*/ | |||
background: #555; | |||
color: #aaa; | |||
text-align: center; | |||
margin: 0; | |||
padding: 0.5em; | |||
border-top: 4px solid black; | |||
border-bottom: 4px solid black; | |||
} | |||
#cover h1, #cover h3 { | |||
text-shadow: #222 0.2em 0.2em 0.2em; | |||
color: white; | |||
border: none; | |||
letter-spacing: 0.2em; | |||
line-height: 0.8em; | |||
margin-left: 2em; | |||
margin-right: 2em; | |||
} | |||
#cover h1:before, #cover h1:after { | |||
/* content: "::"; */ | |||
font-size: 300%; | |||
color: black; | |||
} | |||
#cover h1:before { | |||
position: absolute; | |||
top: 0.2em; | |||
left: 0.1em; | |||
} | |||
#cover h1:after { | |||
position: absolute; | |||
top: 0.2em; | |||
right: 0.1em; | |||
} | |||
#cover hr { | |||
display: none; | |||
} | |||
hr:first-child { | |||
display: none; | |||
} | |||
hr { | |||
height: 0.2em; | |||
background: #555; | |||
color: #555; | |||
margin-left: 0.5em; | |||
} | |||
#cover a:visited { | |||
color: black; | |||
} | |||
/* endnote */ | |||
#endnote { | |||
color: black; | |||
} | |||
/* TOC */ | |||
#toc { | |||
position: relative; | |||
} | |||
#toc hr { | |||
} | |||
#toc h1 { | |||
} | |||
#toc ul { | |||
font-size: 125%; | |||
font-weight: bold; | |||
margin-bottom: 1em; | |||
} | |||
#toc ul ul { | |||
font-size: 90%; | |||
font-weight: normal; | |||
margin-bottom: 0; | |||
} | |||
#toc li { | |||
list-style: none; | |||
} | |||
#toc a:link { | |||
border-bottom: 0; | |||
} | |||
/* */ | |||
#body { | |||
position: relative; | |||
margin: 0 auto; | |||
padding: 0.5em; | |||
max-width: 900px; | |||
background-color: #1c1c1c; | |||
} | |||
/* ;, : */ | |||
h1 { | |||
color: #fff; | |||
border-bottom: solid #444 0.1em; | |||
text-shadow: 1px 1px 2px #000; | |||
} | |||
/* ::, :::, ::::, :::::, :::::: */ | |||
h2, h3, h4, h5, h6 { | |||
color: #fff; | |||
text-shadow: 1px 1px 2px #000; | |||
} | |||
/* tables, figures */ | |||
.fig caption { | |||
color: gray; | |||
text-align: center; | |||
/* Required for Mozilla */ | |||
margin: auto; | |||
} | |||
.fig table { | |||
border: none; | |||
margin: auto; | |||
/* border-collapse: collapse; */ | |||
} | |||
/* / */ | |||
.fig.table th { | |||
border: none; | |||
background: gray; | |||
color: black; | |||
} | |||
/* [ */ | |||
.fig.table td { | |||
border: none; | |||
background: silver; | |||
color: black; | |||
padding-left: 1em; | |||
padding-right: 1em; | |||
padding-top: 0.2em; | |||
padding-bottom: 0.2em; | |||
} | |||
/* < */ | |||
.fig.image table { | |||
border: none; | |||
background: transparent; | |||
max-width: 100%; | |||
} | |||
.fig.image tr, .fig.image td { | |||
border: none; | |||
background: transparent; | |||
padding: 0; | |||
} | |||
.fig.image img | |||
{ | |||
max-width: 900px; | |||
} | |||
/* */ | |||
p { | |||
margin-right: 2%; | |||
text-align: justify; | |||
text-indent: 1em; | |||
} | |||
/* > */ | |||
.example * | |||
{ | |||
background: transparent; | |||
} | |||
.example table | |||
{ | |||
margin: 0; | |||
padding: 0; | |||
table-layout: fixed; | |||
width: 100%; | |||
caption-side: top; | |||
overflow: auto; | |||
} | |||
.example caption | |||
{ | |||
caption-side: top; | |||
} | |||
.example { | |||
} | |||
.example p { | |||
display: inline; | |||
margin: 0; | |||
padding: 0; | |||
text-align: center; | |||
} | |||
.example pre { | |||
margin-top: 0; | |||
font-family: Monospace; | |||
padding: 1em; | |||
border: solid 1px black; | |||
background: #222; | |||
color: white; | |||
display: block; | |||
overflow: auto; | |||
/* Every browser should support border radii */ | |||
/* -moz-border-radius: 0.5em; | |||
border-radius: 0.5em; */ | |||
} | |||
/* " */ | |||
/* | |||
.quote:before { | |||
float: left; | |||
font-size: 500%; | |||
content: "\201C"; | |||
} | |||
*/ | |||
/* | |||
blockquote:after { | |||
content: "\201D"; | |||
}*/ | |||
.quote blockquote { | |||
padding: 0.5em; | |||
margin-left: 0.5em; | |||
font-family: Serif; | |||
border-left: solid 0.4em gray; | |||
/* background: #333; */ | |||
color: white; | |||
} | |||
/* ^ */ | |||
small { | |||
/* | |||
color: silver; | |||
font-size: 50%; | |||
*/ | |||
} | |||
.footnote p { | |||
color: silver; | |||
margin: 0; | |||
} | |||
/* Popup footnotes */ | |||
.footnote p { | |||
display: none; | |||
} | |||
.footnote p:target { | |||
display: block; | |||
overflow: auto; | |||
position: fixed; | |||
left: auto; | |||
bottom: 0; | |||
right: 0; | |||
max-width: 50%; | |||
border: solid 0.3em white; | |||
-moz-border-radius: 0.5em; | |||
background: black; | |||
padding: 0.2em; | |||
} | |||
/* { */ | |||
.admonition * { | |||
background: transparent; | |||
color: white; | |||
} | |||
.admonition dl | |||
{ | |||
display: table; | |||
margin: 0; | |||
padding: 0; | |||
background: #333; | |||
border: dotted black 0.3em; | |||
width: 90% | |||
margin-top: 0.5em; | |||
margin-bottom: 0.5em; | |||
} | |||
.admonition dt | |||
{ | |||
display: table-cell; | |||
vertical-align: center; | |||
border-right: solid silver 0.4em; | |||
font-weight: bold; | |||
font-size: 115%; | |||
font-family: Serif; | |||
background: gray; | |||
width: 0; | |||
text-shadow: black 0.15em 0.15em 0.15em; | |||
} | |||
.admonition dd | |||
{ | |||
padding-left: 0.4em; | |||
display: table-cell; | |||
width: 100%; | |||
text-align: justify; | |||
} | |||
.admonition table | |||
{ | |||
margin: 0; | |||
padding: 0; | |||
background: #333; | |||
border: dotted black 0.3em; | |||
width: 90% | |||
margin-top: 0.5em; | |||
margin-bottom: 0.5em; | |||
} | |||
.admonition td { | |||
width: 100%; | |||
text-align: justify; | |||
} | |||
.admonition td:first-child:contains("Warning:") { | |||
background: #900; | |||
} | |||
.admonition td:first-child:contains("Caution:") { | |||
background: #960; | |||
} | |||
.admonition td:first-child:contains("Note:") { | |||
background: #690; | |||
} | |||
.admonition td:first-child { | |||
border-right: solid silver 0.4em; | |||
font-weight: bold; | |||
font-size: 115%; | |||
font-family: Serif; | |||
background: gray; | |||
width: 0; | |||
text-shadow: black 0.15em 0.15em 0.15em; | |||
} | |||
/* #(b) */ | |||
/* b { color: olive; } */ | |||
/* #(c) */ | |||
tt { | |||
color: #7f0; | |||
} | |||
/* ! keywords ... */ | |||
p em { | |||
color: gray; | |||
font-style: normal; | |||
font-weight: bold; | |||
} | |||
/* *, + */ | |||
/* Bullet, numbe */ | |||
li { | |||
color: #f0f; | |||
} | |||
/* Text */ | |||
li span, li p { | |||
color: white; | |||
} | |||
li p { | |||
color: red; | |||
display: block; | |||
} | |||
ul { | |||
list-style-type: square; | |||
} | |||
dl { | |||
margin-left: 2%; | |||
margin-top: 1em; | |||
} | |||
/* = */ | |||
dt { | |||
background: #181818; | |||
padding: 0.2em; | |||
font-variant: small-caps; | |||
font-weight: bold; | |||
color: #f0f; | |||
} | |||
dd { | |||
color: white; | |||
text-align: justify; | |||
margin-right: 5%; | |||
} | |||
dt a:link, dt a:visited { | |||
color: #f0f; | |||
} | |||
dt a:link:hover { | |||
color: silver; | |||
text-decoration: underline; | |||
} |
@@ -1,155 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:xlink="http://www.w3.org/1999/xlink" | |||
version="1.1" | |||
width="512" | |||
height="512" | |||
id="svg3137"> | |||
<defs | |||
id="defs3139"> | |||
<linearGradient | |||
x1="0" | |||
y1="150" | |||
x2="300" | |||
y2="150" | |||
id="linearGradient3813" | |||
xlink:href="#SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
gradientTransform="translate(-5.5328369e-8,-300.00001)" /> | |||
<linearGradient | |||
x1="149.9995" | |||
y1="4" | |||
x2="149.9995" | |||
y2="304" | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse"> | |||
<stop | |||
id="stop6" | |||
style="stop-color:#fffdf7;stop-opacity:1" | |||
offset="0.3398" /> | |||
<stop | |||
id="stop22" | |||
style="stop-color:#20fb00;stop-opacity:1" | |||
offset="0.99440002" /> | |||
</linearGradient> | |||
<linearGradient | |||
x1="0" | |||
y1="150" | |||
x2="300" | |||
y2="150" | |||
id="linearGradient3135" | |||
xlink:href="#SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
gradientTransform="matrix(1.7066667,0,0,1.7066667,-186.78068,-642.00002)" /> | |||
</defs> | |||
<metadata | |||
id="metadata3142"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title></dc:title> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<g | |||
transform="translate(-130,186.78068)" | |||
id="layer1"> | |||
<rect | |||
width="512" | |||
height="512" | |||
x="-186.78067" | |||
y="-642" | |||
transform="matrix(0,1,-1,0,0,0)" | |||
id="rect24" | |||
style="fill:url(#linearGradient3135);fill-opacity:1" /> | |||
<rect | |||
width="435.42188" | |||
height="65.710075" | |||
x="173.40906" | |||
y="196.90019" | |||
id="rect28" | |||
style="fill:none" /> | |||
<g | |||
id="g3571"> | |||
<path | |||
d="m 321.16035,174.86778 0,94.91448 -21.57414,0 0,-64.07754 -8.61793,64.07754 -15.30122,0 -9.08693,-62.6119 0,62.6119 -21.57414,0 0,-94.91448 31.95083,0 c 0.93797,5.70629 1.9346,12.42866 2.98989,20.16713 l 3.40028,24.15365 5.62803,-44.32078 32.18533,0" | |||
id="path3531" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 355.74932,174.86778 0,94.91448 -24.68128,0 0,-94.91448 24.68128,0" | |||
id="path3533" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 415.78171,174.86778 -8.61793,41.97576 13.01483,52.93872 -22.86389,0 c -2.73589,-9.45822 -5.23724,-20.96832 -7.50405,-34.53035 -0.62537,5.97982 -1.48521,12.33089 -2.57952,19.05325 l -2.34501,15.4771 -24.03641,0 8.91106,-52.93872 -8.91106,-41.97576 23.86053,0 c 0.4299,2.61869 1.28973,6.9765 2.57952,13.07345 1.01614,4.65103 1.85644,8.91113 2.52089,12.78034 l 5.27628,-25.85379 20.69476,0" | |||
id="path3535" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 423.69613,174.86778 41.15501,0 0,18.99462 -16.47373,0 0,17.99799 15.41848,0 0,18.05661 -15.41848,0 0,20.87064 18.11524,0 0,18.99462 -42.79652,0 0,-94.91448" | |||
id="path3537" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 343.65625,361.65625 0,94.90625 24.65625,0 0,-42.78125 c 3.40023,5e-5 5.49954,0.60095 6.28125,1.8125 0.82072,1.21163 1.24997,4.35667 1.25,9.4375 l 0,31.53125 22.90625,0 0,-25.03125 c -7e-5,-7.66035 -0.22639,-12.31937 -0.65625,-14 -0.3909,-1.71964 -1.41321,-3.62386 -3.09375,-5.65625 -1.68065,-2.0323 -4.95836,-3.63211 -9.84375,-4.84375 5.39348,-0.50804 9.00677,-2.05327 10.84375,-4.59375 1.83687,-2.54038 2.74993,-7.48814 2.75,-14.875 -7e-5,-8.09022 -1.31895,-13.98231 -3.9375,-17.65625 -2.57957,-3.71285 -5.91969,-6.00723 -10.0625,-6.90625 -4.10382,-0.89883 -11.97812,-1.34366 -23.625,-1.34375 l -17.46875,0 z M 368.3125,377.875 c 2.85307,7e-5 4.81971,0.46833 5.875,1.40625 1.09431,0.93809 1.65622,2.92814 1.65625,5.9375 l 0,5.21875 c -3e-5,4.182 -0.58536,6.65589 -1.71875,7.4375 -1.09438,0.74264 -3.0376,1.12506 -5.8125,1.125 l 0,-21.125 z" | |||
transform="translate(130,-186.78068)" | |||
id="path3560" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
</g> | |||
<polygon | |||
points="300,0 300,110.426 150,188 0,110.426 0,0 " | |||
transform="matrix(1.7066667,0,0,1.7066667,130,-186.78068)" | |||
id="polygon26" | |||
style="fill:#000200" /> | |||
<g | |||
id="g3518"> | |||
<path | |||
d="m 247.89101,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85043,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04083,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336" | |||
id="path3502" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 261.59539,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02391,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27208,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599" | |||
id="path3500" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 316.23944,-32.523683 c -1.3e-4,4.510316 -1.33009,8.44237 -3.98989,11.796175 -3.23828,4.279007 -7.97987,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16336,11.96965 l 0,82.226277" | |||
id="path3489" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 363.27506,-32.523683 c -5e-5,2.775586 0.80949,4.972911 2.42862,6.59198 1.61904,1.619093 3.81636,2.428634 6.59198,2.428625 1.27208,9e-6 2.37075,0.462603 3.29599,1.387785 0.92513,0.925197 1.38773,2.023859 1.38779,3.29599 -6e-5,1.156491 -0.46266,2.197329 -1.38779,3.122517 -0.92524,0.92519 -2.02391,1.387785 -3.29599,1.387785 l -27.40876,0 c -4.51032,0 -8.44237,-1.32996 -11.79617,-3.989883 -4.27902,-3.238158 -6.41852,-7.979753 -6.41851,-14.224799 l 0,-82.226277 c -10e-6,-4.5102 1.32995,-8.44225 3.98988,-11.79618 3.23815,-4.27888 7.97975,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04084,0 0.69389,0.34694 c 1.96598,0.92531 2.94899,2.3131 2.94905,4.16336 -6e-5,1.1566 -0.40483,2.19744 -1.21432,3.12252 -0.80959,0.9253 -1.85043,1.38789 -3.12251,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98989,0.69389 -3.58515,1.3879 -5.37771,4.22129 -5.37766,8.50019 l 0,82.226277" | |||
id="path3510" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 390.68381,-128.45434 c -6e-5,1.27225 -0.46266,2.37091 -1.38778,3.29599 -0.92526,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19739,-0.46249 -3.12252,-1.38779 -0.92525,-0.92508 -1.38784,-2.02374 -1.38778,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37073,0.40489 3.29599,1.21431 0.92512,0.80966 1.38772,1.90832 1.38778,3.29599" | |||
id="path3508" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 390.68381,-18.819303 c -6e-5,1.156491 -0.46266,2.197329 -1.38778,3.122517 -0.92526,0.92519 -2.02392,1.387785 -3.29599,1.387785 -1.2722,0 -2.37086,-0.40477 -3.29599,-1.214312 -0.8096,-0.925188 -1.21437,-2.02385 -1.21431,-3.29599 -6e-5,-1.272131 0.40471,-2.370793 1.21431,-3.29599 0.80948,-0.925182 1.90814,-1.387776 3.29599,-1.387785 1.27207,9e-6 2.37073,0.462603 3.29599,1.387785 0.92512,0.925197 1.38772,2.023859 1.38778,3.29599" | |||
id="path3506" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 445.32786,-32.523683 c -1.2e-4,6.129397 -2.0818,10.813168 -6.24503,14.051326 -3.46958,2.775572 -7.45946,4.163356 -11.96965,4.163356 l -27.40876,0 c -1.27221,0 -2.37088,-0.40477 -3.29599,-1.214312 -0.80962,-0.925188 -1.21439,-2.02385 -1.21431,-3.29599 -8e-5,-1.272131 0.40469,-2.370793 1.21431,-3.29599 0.80946,-0.925182 1.90813,-1.387776 3.29599,-1.387785 3.46938,9e-6 6.01365,-1.214302 7.63282,-3.642937 1.04075,-1.50342 1.56117,-3.295974 1.56126,-5.377668 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42863,-6.59198 -1.61916,-1.61897 -3.87431,-2.42852 -6.76545,-2.42862 -1.15657,1e-4 -2.1974,-0.46249 -3.12252,-1.38779 -0.92526,-0.92508 -1.38786,-2.02374 -1.38778,-3.29599 -8e-5,-1.27202 0.40469,-2.31286 1.21431,-3.12252 0.92511,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01362,1.2e-4 10.69739,2.08179 14.05132,6.24503 2.77545,3.46957 4.16324,7.45945 4.16336,11.96965 l 0,82.226277" | |||
id="path3491" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 506.06786,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85044,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40875,0 1.04084,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336" | |||
id="path3516" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 519.77224,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599" | |||
id="path3514" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 574.41628,-32.523683 c -1.2e-4,4.510316 -1.33008,8.44237 -3.98988,11.796175 -3.23828,4.279007 -7.97988,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16335,11.96965 l 0,82.226277" | |||
id="path3493" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
</g> | |||
</g> | |||
</svg> |
@@ -1,774 +0,0 @@ | |||
/* XPM */ | |||
static char *icon_16x16[] = { | |||
/* columns rows colors chars-per-pixel */ | |||
"512 512 256 2 ", | |||
" c #000201B10001", | |||
". c #05970A5D04FE", | |||
"X c #08080B610707", | |||
"o c #09F70C1F09F7", | |||
"O c #05E1106A044B", | |||
"+ c #08271144066D", | |||
"@ c #08B31B1B05B0", | |||
"# c #0CEC119F0C59", | |||
"$ c #0C651B8009E8", | |||
"% c #105919620E7C", | |||
"& c #12E714E912E7", | |||
"* c #169019791650", | |||
"= c #18181D1D1717", | |||
"- c #1B061D321AF0", | |||
"; c #0D4623CE09A6", | |||
": c #11B324240E88", | |||
"> c #11832BD60D46", | |||
", c #0E6432DD0934", | |||
"< c #12EA32D40DAF", | |||
"1 c #132F3E260C6C", | |||
"2 c #17172704144E", | |||
"3 c #1E4C22501DCB", | |||
"4 c #173D37C611F5", | |||
"5 c #1A5C3D4F14A3", | |||
"6 c #1E543E2318F0", | |||
"7 c #20A129FF1E49", | |||
"8 c #20A137571C9C", | |||
"9 c #21B523D621A5", | |||
"0 c #24C229EF239A", | |||
"q c #2B8A2D8C2B8A", | |||
"w c #295C38D225F3", | |||
"e c #2E2A30642E0E", | |||
"r c #30B13ABB2E2E", | |||
"t c #327E34A63258", | |||
"y c #372E393E3729", | |||
"u c #3ABB3BF33ABB", | |||
"i c #157545C60DCE", | |||
"p c #187F59590EA8", | |||
"a c #1B824832142A", | |||
"s c #1BE555301301", | |||
"d c #224A48481BCD", | |||
"f c #255E5A131CD6", | |||
"g c #1E5E62621394", | |||
"h c #1D4B6CBE1150", | |||
"j c #1F1F75751212", | |||
"k c #2558688D1A8F", | |||
"l c #25D469BB1AE1", | |||
"z c #23687EC3157C", | |||
"x c #26B57A1B19BB", | |||
"c c #2A9C467F257B", | |||
"v c #318742982D83", | |||
"b c #2A185874222B", | |||
"n c #378D42423434", | |||
"m c #3F2B404E3F0E", | |||
"M c #3A65555534DF", | |||
"N c #2C9364312309", | |||
"B c #2BD66ACE21BE", | |||
"V c #331969D02976", | |||
"C c #369D76762BF9", | |||
"Z c #395977772ECF", | |||
"A c #41A853863CD6", | |||
"S c #434368BE3B91", | |||
"D c #443A453B443A", | |||
"F c #479D4AF54545", | |||
"G c #4C2D4D334C25", | |||
"H c #494954AA45F0", | |||
"J c #525255554F4F", | |||
"K c #543155325431", | |||
"L c #572C592E5681", | |||
"P c #5B655C665B65", | |||
"I c #4A4A6666446F", | |||
"U c #515171C74A75", | |||
"Y c #5AD165795743", | |||
"T c #59DA777752D2", | |||
"R c #616177775ADB", | |||
"E c #61AA62AB61AA", | |||
"W c #676768686767", | |||
"Q c #6B786C796B78", | |||
"! c #6AA576ED6603", | |||
"~ c #732D742E732D", | |||
"^ c #777778787777", | |||
"/ c #7B207C217B20", | |||
"( c #2B3C8BF21C61", | |||
") c #287E95EB176D", | |||
"_ c #2B8F93BE1B9C", | |||
"` c #30309D9D1F1F", | |||
"' c #2E6EA7D71BAC", | |||
"] c #3123ABAB1E3B", | |||
"[ c #32B3BB3B1D1D", | |||
"{ c #36B786DC298D", | |||
"} c #336293AA23DE", | |||
"| c #345F9C0D23CE", | |||
" . c #3A9E93A12C1E", | |||
".. c #3B9890792DB9", | |||
"X. c #39709A192A18", | |||
"o. c #36B7A7EC249C", | |||
"O. c #34F5AD8D226D", | |||
"+. c #3C9BA4CD2BDB", | |||
"@. c #3CD8AD762AC6", | |||
"#. c #3AB1B7F226EC", | |||
"$. c #4225876A3619", | |||
"%. c #45459A9A36D2", | |||
"&. c #40A0ACAC2F0F", | |||
"*. c #4096B7612D83", | |||
"=. c #4406A2F0340D", | |||
"-. c #44AEAE53336F", | |||
";. c #4747A4A43838", | |||
":. c #4B5AA4493C00", | |||
">. c #4BE9AD513B70", | |||
",. c #47D1B82E35BF", | |||
"<. c #34DFC51A1EC9", | |||
"1. c #22C0FBFB02B4", | |||
"2. c #2727FBFB0808", | |||
"3. c #2B2BFBFB0C45", | |||
"4. c #2EAFFBFB1090", | |||
"5. c #3252FBFB1454", | |||
"6. c #35F6FBFB18D9", | |||
"7. c #3A5AFBFB1CBD", | |||
"8. c #3A69C8992481", | |||
"9. c #3B89D4162424", | |||
"0. c #3EBFD6152767", | |||
"q. c #3E0BE84E248B", | |||
"w. c #3E3EFBFB2121", | |||
"e. c #42E6D43A2C36", | |||
"r. c #449ADD322C82", | |||
"t. c #4A1FC6303621", | |||
"y. c #4A03D44533D0", | |||
"u. c #4B34D6323506", | |||
"i. c #5252D4693D3D", | |||
"p. c #4242F47326A7", | |||
"a. c #4174FBFB24CD", | |||
"s. c #45C5FBFA29A9", | |||
"d. c #4915FBFA2DC6", | |||
"f. c #4B26E60A32A0", | |||
"g. c #4CC3E94B340C", | |||
"h. c #4C19F58E3198", | |||
"j. c #4DADFBFA32B2", | |||
"k. c #5191FBFB36B6", | |||
"l. c #5353F3B33939", | |||
"z. c #55B5FBFB3AFA", | |||
"x. c #58D8FBFB3EBE", | |||
"c. c #4E4A9791413F", | |||
"v. c #4EE899CC420F", | |||
"b. c #552A91BC499F", | |||
"n. c #5D7D888854B4", | |||
"m. c #63A390105A5A", | |||
"M. c #5401A30946B7", | |||
"N. c #5322AD994374", | |||
"B. c #5535AC0B4686", | |||
"V. c #5833ABBD49DC", | |||
"C. c #593EB7304920", | |||
"Z. c #66CDA9425A5A", | |||
"A. c #6CED878765A5", | |||
"S. c #718892636923", | |||
"D. c #7DD3852F7A24", | |||
"F. c #7B3B98987373", | |||
"G. c #7733AE5D6BE5", | |||
"H. c #57E3C80D44E8", | |||
"J. c #5AA6D4CC467B", | |||
"K. c #6161D38A4DE0", | |||
"L. c #6819CF095656", | |||
"P. c #68A2D4FD561C", | |||
"I. c #5ABAE70643E4", | |||
"U. c #5E08F59F459B", | |||
"Y. c #5C8DFBFB4300", | |||
"T. c #6060FBFB4747", | |||
"R. c #63B9F4F44BF6", | |||
"E. c #6449FBFB4BCA", | |||
"W. c #6A25EAEA5499", | |||
"Q. c #6A95F2F2537E", | |||
"!. c #6BCDFBFB53B5", | |||
"~. c #73DAF55B5D5D", | |||
"^. c #7308FBFB5BA3", | |||
"/. c #7E7EC3C37070", | |||
"(. c #774FE836639E", | |||
"). c #7A7AF4F4653A", | |||
"_. c #7777FBFA60B6", | |||
"`. c #7AFDFBFA64E7", | |||
"'. c #7EBEFBFA696A", | |||
"]. c #848498987D7D", | |||
"[. c #8517AFAF7B7B", | |||
"{. c #8767CACA7999", | |||
"}. c #83AFFBFB6DF6", | |||
"|. c #8F8FE4637DFE", | |||
" X c #86C6FBFB71B1", | |||
".X c #8A8AFBFB7575", | |||
"XX c #8DF4FC2E79E0", | |||
"oX c #91BCFCFC7DFE", | |||
"OX c #83B084B183B0", | |||
"+X c #878788888787", | |||
"@X c #8B198C1A8B19", | |||
"#X c #8D5A93C68ABD", | |||
"$X c #909098988A8A", | |||
"%X c #94A495A594A4", | |||
"&X c #9B5D9C5E9B5D", | |||
"*X c #9292B1A189A9", | |||
"=X c #9D1DA5249999", | |||
"-X c #A2A2B2329B5B", | |||
";X c #A3C1A4C2A3C1", | |||
":X c #A7A7A8A8A7A7", | |||
">X c #AC53ACD4AC53", | |||
",X c #AE6EBABAA767", | |||
"<X c #B2F2B2F2B2F2", | |||
"1X c #BB6ABB6ABB6A", | |||
"2X c #9573C5E789DF", | |||
"3X c #9729D92188AD", | |||
"4X c #A626C6C69C1C", | |||
"5X c #A5A5D90B98B2", | |||
"6X c #9A9AE8E88A8A", | |||
"7X c #9595FCFC8282", | |||
"8X c #9919FCFC8646", | |||
"9X c #9ABAF4948868", | |||
"0X c #9D1AFCFC8A68", | |||
"qX c #A0DFFCFC8E8C", | |||
"wX c #A8A8E8E89A1A", | |||
"eX c #A67BF3739616", | |||
"rX c #A57EFCFC9388", | |||
"tX c #A8A8FCFC9797", | |||
"yX c #AC9EFCFC9BE7", | |||
"uX c #B5A3D22DABB4", | |||
"iX c #B92AEB07AC01", | |||
"pX c #B529F5DEA660", | |||
"aX c #B461FCFCA451", | |||
"sX c #BBACFCFCAC19", | |||
"dX c #BEBEF1F1B1B1", | |||
"fX c #BFBFFCFAB0B0", | |||
"gX c #C4A7D563BBF4", | |||
"hX c #C5E5EACABA5A", | |||
"jX c #C318FCFCB49F", | |||
"kX c #C747F5F5BA3A", | |||
"lX c #C745FCFAB939", | |||
"zX c #CA5DFCFCBD0D", | |||
"xX c #C4A4C4A4C4A4", | |||
"cX c #CDC2CDC2CDC2", | |||
"vX c #CE9BD972C5F8", | |||
"bX c #D457D457D457", | |||
"nX c #DC2FDC2FDC2F", | |||
"mX c #D53FEAD5CB60", | |||
"MX c #CECEF7F7C1C1", | |||
"NX c #CEFDFCFCC156", | |||
"BX c #D29FFCFBC592", | |||
"VX c #D680F59FCA74", | |||
"CX c #D6D1FCFCCA5B", | |||
"ZX c #DA38FCFBCE2C", | |||
"AX c #DADAF1F1D1D1", | |||
"SX c #DE18FCFBD29A", | |||
"DX c #E2E2EFEFD8D8", | |||
"FX c #E1DAFCFCD6CF", | |||
"GX c #E2E2F59FD8D8", | |||
"HX c #E5A0FCFADB1A", | |||
"JX c #EA1CFCFCDF11", | |||
"KX c #E6E4E6E4E6E4", | |||
"LX c #EB6BF777E1E1", | |||
"PX c #ED1BFCF9E311", | |||
"IX c #F138FCF6E734", | |||
"UX c #F30FFCFCEA06", | |||
/* pixels */ | |||
" . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . ", | |||
". . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . ", | |||
". . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . ", | |||
". . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . ", | |||
". . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . ", | |||
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . ", | |||
" . . . . . . . ", | |||
" . . . . . . . . . ", | |||
" . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . ", | |||
" . . . . . . . . . . . ", | |||
" . . . . . . * 3 9 e e e r e e e e e e r e e e e e e e t r e e e e e e e r & O 3 3 # 0 e e e r e e e e e e e t e e e e e e e e r e e e e e e 3 9 o . % 9 3 r e e e e e e e e e e e e r e e r e e e e e e e e e e e & - 3 . . # 0 e r e e e e e e e q r r e q e e e e r e e e e e e e t 9 9 # . # - 9 r e e e e e e e q r e e e e e e e e e e e e e r e e e e - - 3 . O 9 e e e e e r e e e e e e e e e e t e e e e r e e e e e 9 3 & . . . ", | |||
" . . O F OX<XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX~ . ~ bXKXKXnXW % &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX;X! e . D D.>XbXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD.+ W bXKXKXnX~ # %XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX:X~ y . y / >XbXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+Xo L cXKXKXnXOX+ X OXnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX>X^ y . . . . . ", | |||
" . . & / bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X. #XKXKXKXKXKXKX#X % xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXP O # ~ cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X# / KXKXKXKXKXKX;X X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXE + . + W xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX* . W KXKXKXKXKXKX<XO . :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX~ # . ", | |||
" W nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW y KXKXKXKXKXKXKXKXt / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXu . L bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ 0 KXKXKXKXKXKXKXKXG W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXD G bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@X % KXKXKXKXKXKXKXKXP K KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXK . ", | |||
" . . . . # :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X ^ KXKXKXKXKXKXKXKX~ 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX^ # %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX E KXKXKXKXKXKXKXKX+X :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X. . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX G KXKXKXKXKXKXKXKX;X %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&XX . . . ", | |||
" * 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX +XKXKXKXKXKXKXKXKXOX xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X. o <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX ~ KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X. . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX# P KXKXKXKXKXKXKXKX>X ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X# . . ", | |||
" . . . . . X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X W KXKXKXKXKXKXKXKXE :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X G KXKXKXKXKXKXKXKX^ %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X. %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX u KXKXKXKXKXKXKXKX@X / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X. . . . . ", | |||
" . . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu & nXKXKXKXKXKXKXbX& G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ # cXKXKXKXKXKXKXKX9 u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXQ W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . xXKXKXKXKXKXKXKXt 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX . . . ", | |||
" . D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX G KXKXKXKXKXKXF @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX- r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X u nXKXKXKXKXKXL ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX0 9 nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X e bXKXKXKXKXKXW E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . . ", | |||
" . . # cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnXxX:XJ t ;XnXnX;Xq P 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X O xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX>XP q &XnXnX:Xy G <XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<XO . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX<XW . 7 %XnXnX>XD m >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX. . ", | |||
" . . . . Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXOXD - X & 0 L &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr L KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX+XG - . . * 9 J %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#XG 9 & 9 G @XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . ", | |||
". . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X# . . 3 :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X= = &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X9 . & +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX . . ", | |||
" . . . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX- t KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X. . W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXF ", | |||
" . . . %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . O <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X. ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X# @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ", | |||
" . xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3 q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . - nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X =XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . o nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX . . . ", | |||
" . . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X . . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX& . . . . . ", | |||
" . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXX 7 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3 . # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#X D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt . . . ", | |||
" . . . . . . F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX- y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXQ . . . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD ", | |||
" L KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . . 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . . . ", | |||
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ", | |||
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ", | |||
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXH y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ", | |||
". . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG t KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . . . ", | |||
" . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX* . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 m KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . . . ", | |||
" . . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX% y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . K KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . . xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . . ", | |||
" 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . . %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX& KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX% >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 . . . . . ", | |||
" . . . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX=X . . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 . % nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX . . ", | |||
" . . . . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . #XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#X . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . ", | |||
" . . . Y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy ! KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . # nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . ", | |||
" . . . . X nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ O Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX= . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX. OXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX# ", | |||
" ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXK = * E 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX . . . ", | |||
" . . * nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX. 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXX e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX<X&XD.0 * Q &X=XW # q OX;X<XcXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX* . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX- . . . ", | |||
". . . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE r bXKXKXKXKXcXr E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . & bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . . . . ", | |||
" ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X # xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy O xXKXKXKXKXKXKXcX# e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX+ . / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X . . . . F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . . ", | |||
" . . . . . 3 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<XO . >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X# 3 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X D KXKXKXKXKXKXKXKXW +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX3 X 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX* . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX- ", | |||
" . . . e nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX* . & xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX- 0 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX Q KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX9 * xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX0 . . :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnXt . . ", | |||
" . . . . q cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X& . . % <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X= . . * <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX ~ KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X& . = 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX0 . . . O &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXq . . ", | |||
" . * ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . . . X D.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+XO W nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X m KXKXKXKXKXKXKXKXK OXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXK . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX=X# E nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X% . . . . ", | |||
" . . . F 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;Xq . q ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>Xt . 3 +XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX3 . 1XKXKXKXKXKXKX>X. 3 nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX~ & . r :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xm . . - @XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXF . . . ", | |||
" . . t D.xXKXKXKXKXKXKXKXKXKXnX>X~ 9 . . . 3 Q <XKXKXKXKXKXKXKXKXKXKX<X^ q . % Q :XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXt = <XKXKXKXKX;X& D bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX;XE # 3 ~ <XKXKXKXKXKXKXKXKXKXKX<X/ e . . . & E >XnXKXKXKXKXKXKXKXKXKX1X+Xy . . ", | |||
" . & y K E Q Q P G 9 . . . . # t G E Q Q E G q . . . e D P W Q Q Q Q Q Q Q Q Q Q Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q W D X y E E 0 # D W Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q ! Q Q Q Q Q Q Q L F r # t G E Q Q E G q X . . . # 0 F P Q W W J e o . . . . . ", | |||
" . . . . . . . . ", | |||
" . . . . . . . . . ", | |||
" . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . . . . . ", | |||
" . . . . . . . . . . . . . ", | |||
"H . . . . . . . . . . . . . . . . H ", | |||
"UXvXK . . . . . . . . . . . . . . . . . . . . . . . . J vXUX", | |||
"UXUXUXxXH . . . . . . . . . . . . . . . . . H xXUXUXUX", | |||
"UXUXIXIXUX1Xn . . . . . . . . . . . . . . . . . . m 1XUXUXUXUXUX", | |||
"UXUXUXUXUXUXUX,Xt . . . . . . . . . . . . . . . . . t ,XUXUXUXUXUXUXUX", | |||
"UXUXUXUXUXUXUXUXUX,Xr . . . . . . . . . . . . . . . . e ,XUXUXUXUXUXUXUXUXUX", | |||
"UXUXUXUXIXUXUXUXUXUXIX=X0 . . . . . . . . . . . . . . . . . . w -XIXIXIXUXUXUXUXIXUXIXIX", | |||
"UXIXIXIXIXUXIXIXIXUXIXIXIX=X9 . . . . . . . . . . . . . . . . . 9 =XPXUXIXIXIXUXUXIXIXIXIXUXIX", | |||
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXPX$X3 . . . . . . . . . . . . . . . . . = $XLXIXIXIXIXIXIXIXIXIXIXIXIXIXIX", | |||
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXPX$X= . . . . . . . . . . * $XPXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX", | |||
"PXIXPXIXIXIXIXIXIXPXIXIXPXIXIXPXPXIXDXD.% . . . . . . . . . . . . . . . . . . . . . . . % D.DXIXPXIXIXIXIXPXIXIXIXPXIXIXIXPXIXIXIX", | |||
"IXPXIXPXIXJXIXIXIXPXPXPXIXPXIXPXPXIXIXPXDX].o . . . . . . . . . . . . . . . . . # D.DXIXIXIXPXIXPXPXPXIXPXPXPXPXPXPXIXPXIXPXPX", | |||
"JXPXIXPXPXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXIXAX! + . . . . . . . . . . . . . . . . . . X ~ AXLXLXPXPXPXIXIXPXPXPXPXPXPXPXPXIXPXPXPXPXPXPX", | |||
"PXPXPXJXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXLXLXPXAX! O . . . . . . . . . . . . X ! AXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPX", | |||
"PXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXvXY . . . . . . . . . . . . . . . . . . . . . . Y vXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPX", | |||
"PXPXJXPXPXPXJXPXPXPXJXPXPXPXJXPXPXPXJXPXPXPXPXPXPXPXPXPXvXL . . . . . . . . . . . . . R vXPXJXPXPXJXPXPXPXJXPXPXPXJXPXJXPXPXPXPXJXPXJXPXPXJXPXPXPX", | |||
"JXJXPXPXJXJXJXPXJXJXPXPXJXJXJXPXJXJXPXJXJXPXJXJXJXPXJXPXJXPXgXH . . . . . . . . . . . J gXPXJXJXPXPXJXJXPXPXJXPXJXPXJXJXJXPXJXPXJXPXPXPXJXPXPXJXJXPXJX", | |||
"JXJXJXJXPXJXPXJXJXJXJXJXPXJXPXJXJXPXJXJXJXPXJXPXJXJXJXJXJXJXJXPXuXD . . . . . . . . . . . . . . . . . . . F 1XJXJXJXPXJXJXJXJXJXJXJXJXJXJXJXJXJXPXJXJXJXJXJXJXJXJXJXJXJXPXJXJX", | |||
"PXJXJXJXJXJXJXJXPXJXJXJXJXJXJXJXJXJXPXJXJXJXJXJXPXJXJXJXPXJXJXJXPXJXuXn . . . . . . . . . . . . . . m uXJXJXJXJXJXJXJXJXPXJXJXJXPXJXPXJXJXJXJXJXPXJXPXJXJXJXJXJXJXJXJXJXJXPX", | |||
"JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX,Xr . . . . . . . . . . . . . . . . . . r ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", | |||
"HXJXJXJXJXJXJXJXJXJXHXPXJXJXHXJXJXJXHXJXJXHXJXJXJXHXJXJXJXJXJXJXPXHXJXJXJXHX,Xq . . . . . . . . . . . . . . e ,XHXJXJXJXJXJXJXHXJXJXJXJXJXHXHXJXHXPXJXJXJXJXJXJXHXJXJXJXHXJXJXHXJXJXJXJXHXJX", | |||
"HXJXHXHXHXHXHXJXHXHXJXHXHXHXJXJXHXJXJXHXJXHXHXJXHXJXHXJXHXHXHXHXHXJXHXJXHXJXJXHX=X7 . . . . . . . . . . . . . . . . . . 7 -XHXHXHXHXJXHXHXHXHXJXHXHXHXJXHXJXJXJXHXHXHXHXHXHXHXJXJXHXJXHXJXHXHXJXHXJXHXJXJXHX", | |||
"JXHXHXJXJXHXHXHXJXHXPXHXHXJXJXHXHXJXHXJXJXJXJXHXJXJXHXHXJXJXJXHXJXHXHXPXJXJXHXHXHXHX-X3 . . . . . . . . . . . . . . 3 -XGXHXHXPXHXJXHXJXJXJXJXHXHXJXHXJXHXHXHXJXPXHXHXJXHXHXHXJXHXJXHXJXHXHXJXJXHXHXJXHXHXJX", | |||
"JXHXHXJXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXSX#X3 . . . . . . . . . . . . 2 $XSXJXHXHXJXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXJXHXJXHXHX", | |||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFX#X* . . . . . . . . . . . . . . . * #XFXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", | |||
"HXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXHXHXHXHXHXHXHXHXAXF.# . . . . . . . . . . . . . . . # D.AXHXHXFXGXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX", | |||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXAXD.# . . . . . . . . . . . . . . . . . # D.AXHXFXFXHXHXFXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXFX", | |||
"HXHXHXHXHXHXHXFXHXHXFXHXHXFXHXFXHXHXHXFXHXFXFXHXFXHXHXFXFXHXFXHXHXFXHXFXHXFXFXHXHXHXGXHXFXHXFXFXSXHXFXmX! + . . . . . . . . . . . . # ! mXFXFXHXFXHXHXFXHXHXHXHXFXHXFXHXFXFXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXFXHXHXFXHXFXHXHXFXHXHXHXFXHXHXFXHXFXHX", | |||
"HXFXHXFXHXHXFXHXFXFXFXFXHXFXHXHXFXHXHXHXHXFXFXHXHXFXHXFXHXFXHXFXHXFXHXHXFXHXFXHXHXHXHXFXFXHXHXFXHXHXHXHXHXmX! . . . . . . . . . . . . . X ! mXSXHXHXFXHXHXHXFXHXHXFXHXHXFXFXHXFXFXHXFXFXFXHXFXHXHXHXFXHXFXHXFXHXHXFXHXFXFXHXHXHXHXFXFXFXFXHXHXFXHXHXFXHX", | |||
"FXFXFXHXFXFXFXFXFXFXFXHXHXFXFXFXFXFXFXFXFXHXFXFXFXFXFXHXFXFXHXFXFXFXFXFXFXFXHXFXFXFXFXHXFXFXFXFXFXFXSXHXSXHXGXhXY . . . . . . . . . . . . . . . . . Y gXHXFXHXFXHXFXFXFXFXFXFXFXFXFXFXFXHXFXFXHXFXFXHXFXFXHXFXFXFXFXFXHXFXFXFXFXFXFXHXFXFXFXFXFXHXFXFXFXFXFXHXFXFXFXFX", | |||
"FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXSXHXSXFXgXP o . . . . . . . . . . . . . . . . . . . X Y gXFXSXHXSXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX", | |||
"FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXHXSXHXFXFXHXuXJ . . . . . . . . . . . H uXHXSXHXHXSXHXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX", | |||
"FXFXSXFXFXFXFXFXFXFXSXFXFXFXSXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXSXFXFXSXFXFXFXFXSXFXSXFXFXFXFXFXFXFXFXFXFXSXFXHXSXFXFXFXFXFXSXuXD o . . . . . . . . . . . . . . I uXHXSXHXFXSXSXFXHXSXFXFXFXSXFXFXFXFXSXFXFXFXFXFXFXSXFXFXFXSXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXSX", | |||
"SXSXFXFXFXSXFXSXFXSXFXSXSXSXFXFXFXSXSXSXSXFXSXSXFXFXSXFXSXFXSXFXFXFXSXFXSXSXFXFXFXSXFXSXSXFXSXFXSXFXSXHXSXSXFXSXSXFXSXFXSXFXSX,Xn . . . . . . . . . . . . n ,XFXSXHXSXSXSXHXSXSXSXSXSXSXFXFXSXSXFXSXFXSXSXFXSXFXFXFXFXSXFXSXFXFXSXFXFXSXSXSXFXSXSXSXSXSXSXFXFXSXFXSXFXFXSXFXSXFXSXSXSXFXSXFX", | |||
"SXSXFXSXSXFXSXSXSXFXSXSXSXFXFXSXFXSXSXFXSXSXSXFXSXSXSXSXSXFXSXSXSXSXSXFXSXFXFXSXSXSXSXSXSXSXFXSXSXSXSXSXSXHXSXSXFXSXSXSXSXSXSXSXSX-Xr . . . . . . . . . . . . . . . . e -XFXSXFXSXSXSXSXFXSXSXSXSXSXSXSXFXSXSXSXFXFXSXSXSXSXSXSXFXSXSXFXSXFXSXSXSXSXSXSXSXSXSXFXSXSXFXSXFXSXFXSXSXSXSXSXSXSXSXSXSXFXFXSXSXFX", | |||
"FXSXSXSXSXSXSXSXSXFXSXFXSXSXSXSXSXSXSXSXFXSXSXSXSXSXFXSXSXSXSXFXSXFXSXSXSXSXSXSXFXFXSXSXFXSXSXSXSXFXSXSXSXSXSXSXSXSXFXSXFXSXSXSXSXFXSX4Xw . . . . . . . . . . r 4XSXSXSXSXSXSXSXSXSXSXSXFXSXSXHXFXSXSXSXFXSXSXSXSXFXSXFXFXSXSXSXSXSXSXSXSXSXSXSXFXSXSXFXSXSXFXFXSXSXSXSXSXSXFXSXFXSXSXFXSXSXSXSXSXSXSXSX", | |||
"SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX*X7 . . . . . . . . . . . . 9 *XAXFXZXZXFXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX", | |||
"SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXZXSXSXSXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXZXZXSXSXSXSXSXSXSXSXSXZX*X7 . . . . . . . . . . . . . . . 7 *XZXSXSXZXFXSXFXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXSXZXSXSXSXSXSXZXSXSXSXSXZXSXSXSXSXSXSXSXSX", | |||
"ZXSXZXSXZXSXSXSXZXSXZXSXZXSXZXSXZXSXZXSXSXSXSXSXSXSXSXZXZXSXSXZXSXZXZXSXZXSXSXSXZXSXSXSXZXSXSXZXSXZXZXSXZXSXSXSXSXZXSXSXSXSXSXSXSXZXSXSXSXZXSXSXVX].* . . . . . . . . . . . * ].ZXZXFXSXZXSXZXZXZXSXZXSXZXZXSXSXZXZXSXSXSXZXSXSXSXZXSXSXZXSXSXSXSXSXSXSXSXZXSXZXSXSXSXSXSXSXCXSXSXZXSXSXZXSXSXZXSXZXSXSXZXSXSXZXSXSXSXZXZXSXSXZXSX", | |||
"SXSXZXSXSXZXSXSXSXZXSXZXSXZXSXZXSXSXSXSXSXZXZXSXZXZXSXSXSXSXZXSXZXSXSXZXSXSXZXSXSXZXZXSXSXSXZXSXZXSXSXSXSXZXSXZXSXSXSXZXZXSXZXZXSXSXSXZXSXSXZXZXSXSXVX].= . . . . . . . . . . . . . = ].CXSXSXZXFXZXSXZXFXSXSXZXSXZXSXSXZXSXZXSXZXZXSXSXZXZXSXSXZXSXZXSXZXZXSXSXZXZXSXSXZXSXSXSXZXSXZXSXSXSXZXSXZXSXSXZXSXSXZXSXZXSXSXZXSXSXSXZXSXSXSXZXZXSXZX", | |||
"ZXSXSXSXCXSXSXCXSXZXSXZXZXSXZXSXZXZXSXZXZXSXZXZXZXSXZXZXSXZXZXSXSXZXZXSXZXSXZXZXZXZXZXZXZXSXZXZXZXZXSXZXZXSXZXZXZXZXSXZXZXSXZXSXZXZXSXZXZXSXZXSXZXSXZXZXVXA.& . . . . . . . . . . . . # A.VXZXSXZXSXZXZXZXSXSXZXZXZXSXZXSXZXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXZXSXZXSXZXSXSXSXCXSXSXSXZXZXSXZXSXZXSXZXSXZXZXSXZXSXZXZXSXSXZXZXZXZXSX", | |||
"SXCXCXSXSXCXSXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXmXA.o . . . . . . . . . o S.mXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXSXCXCXCXSXSXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXZX", | |||
"CXCXSXZXCXZXCXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXhX! + . . . . . . . . . . # ! hXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZXZXZXZXZXZXZXZXCXSXZXCXCXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZX", | |||
"CXSXCXZXSXCXSXCXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXhX! + . . . . . . . . . . . . . . . . . O R hXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXSXCXZXSXCXSXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZX", | |||
"CXZXCXZXCXZXZXZXCXZXZXCXZXZXZXCXZXZXCXZXCXZXZXZXCXZXCXZXCXZXCXZXZXCXZXZXZXZXZXCXZXZXZXCXZXCXZXZXCXZXZXZXCXZXZXZXZXZXCXZXZXZXZXZXZXZXZXCXCXZXCXZXZXZXCXZXZXZXCXZXZXCXZXZXhXI . . . . . . . . . . . . . o o U gXZXZXZXZXZXZXZXCXZXCXZXZXZXZXZXCXZXCXZXZXCXZXZXZXCXZXCXZXZXCXZXZXZXCXZXZXZXCXZXCXZXZXZXCXZXZXZXZXCXZXZXCXZXSXCXCXZXCXZXZXZXZXZXCXZXCXZXZXCXZXCXZXCXZXCXCXCXZXZXZXCXZXCXZX", | |||
"ZXCXZXZXZXCXCXCXCXCXCXZXCXCXZXCXCXCXCXZXCXCXCXZXZXZXCXZXZXCXZXZXCXZXCXCXCXCXCXCXCXCXCXZXCXZXCXCXCXCXCXCXZXCXCXZXCXCXCXZXCXCXCXCXCXCXCXZXCXZXCXZXCXCXZXCXCXCXCXCXZXCXCXCXZXZXgXI . . . . . . . . . . . . . . . L gXCXZXCXCXCXCXCXCXZXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXZXCXZXCXCXCXZXCXCXZXCXCXCXCXZXZXCXCXCXZXCXCXCXCXCXCXCXZXCXCXCXCXCXCXZXCXCXCXCXCXCXCXZXCXCXZXZXCXZXZXZXCXCXZXCXCXZXZXCXCXCX", | |||
"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXuXH . . . . . . . . . H uXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", | |||
"CXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXuXH . . . . . . . H uXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXZXCXCXZXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", | |||
"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX4Xy . . . . . . . . . . . . . . n 4XCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCX", | |||
"CXBXBXCXCXCXCXBXCXBXCXCXCXCXBXCXCXCXBXCXBXCXCXCXCXBXBXCXBXCXCXBXCXCXCXBXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXCXCXBXBXCXCXBXCXCXBXCXCXCXCXCXBXCXCXBXCXBXCXCXCXCXBXCXBXCX-Xw . . . . . . . . . . . r 4XCXCXBXCXBXCXCXBXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXBXBXCXCXCXCXCXBXCXCXCXBXCXCXCXBXCXCXCXCXCXCXBXBXCXBXCXCXCXBXCXCXCXCXCXCXCX", | |||
"CXBXCXBXCXBXBXCXBXCXCXBXCXBXCXBXBXCXBXCXCXBXCXBXCXBXCXBXBXCXBXCXCXCXBXCXCXBXBXCXBXCXCXBXCXBXCXBXCXBXBXCXBXBXCXBXCXBXCXBXCXBXBXCXBXCXBXCXBXCXBXCXBXBXCXCXCXCXBXCXBXCXBXCXBXCXBXCXBXCXCXBXBXCXBXCX2Xq . . . . . . . . . . . . . . w 2XCXCXCXBXCXBXCXCXCXCXBXCXCXBXBXCXBXCXCXCXBXCXBXCXBXCXCXCXBXBXCXCXBXCXBXCXBXCXBXBXCXBXBXCXBXCXCXBXBXBXCXBXBXCXBXCXCXBXBXCXCXBXBXCXBXCXBXCXBXBXCXCXBXCXCXCXBXCXBXBXBXCXCXBXCXCXCXBXBXCXBXCXBXCXBXBX", | |||
"BXCXBXBXBXCXBXBXBXBXBXBXBXCXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXCXBXBXCXBXBXBXCXBXBXBXCXBXBXBXBXBXBXBXCXBXBXBXBXBXCXBXBXCXBXBXCXBXBXBXCXMX*X8 . . . . . . . . . . . 7 *XBXCXBXBXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXCXBXBXBXCXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXCXBX", | |||
"BXBXBXBXBXBXBXBXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXCXBXBXBXCXBXCXBXBXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXCXBXBXCXBXBXBXBXCXBXCXBXBX*X3 . . . . . . . . . . . . . . . 3 *XMXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXCXBXBXCXBXBXBXBXCXBXCXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXCXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXCXBXCXBXBXBXBXBXCXBXCXBXBXBXBXCXBXBXCXBXBXCXBXBXBXCXBXBXBXBXBXCXBXBX", | |||
"BXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXkXF.= . . . . . . . . . * ].zXBXMXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBX", | |||
"BXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXNXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXMXF.* . . . . . . . % F.zXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXNXBXBXBXBXBXBXNXBXBXBXBXNXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBX", | |||
"BXBXBXBXNXBXBXBXNXBXNXBXBXBXBXNXBXNXBXNXNXBXNXBXNXBXNXBXBXBXBXNXBXBXBXNXNXNXBXNXBXNXBXNXBXNXNXBXNXBXNXBXBXBXBXNXBXzXBXNXNXBXzXBXBXNXNXBXNXBXNXBXBXNXNXBXBXBXBXNXBXBXNXBXNXBXNXBXNXBXNXBXBXBXBXNXMXBXMXNXNXMXBXBXBXMXA.# . . . . . . . . . . . & A.kXBXBXzXBXBXNXNXBXNXBXzXBXBXBXBXBXBXzXBXBXBXNXBXNXBXBXNXNXBXNXBXBXBXNXBXBXNXBXNXNXBXBXBXNXBXBXBXBXzXNXBXzXBXBXBXBXNXBXBXzXBXBXBXBXNXNXBXBXzXNXBXNXBXBXNXNXBXNXBXBXNXNXNXBXNXBXNXNXBXNXBXNXNXBXNXNXBXBXNXNXBXNXBXNXBX", | |||
"NXBXNXBXBXBXBXNXBXNXBXBXBXBXBXBXBXNXBXNXBXBXBXNXBXNXBXNXBXBXBXBXBXBXNXBXBXBXNXBXBXBXNXBXBXNXNXBXNXBXBXBXNXBXNXBXNXBXBXBXBXzXzXBXBXNXBXNXBXBXBXNXNXBXNXBXNXBXBXBXNXBXBXNXNXBXBXNXBXNXBXBXBXBXBXBXBXBXzXBXBXBXNXBXNXBXBXhXA.# . . . . . . . . . . . . + A.kXBXBXBXNXBXNXBXBXBXBXzXzXBXBXBXBXBXBXBXBXBXzXBXBXBXBXNXNXBXNXBXNXBXNXNXBXBXBXNXBXBXNXBXNXBXBXBXNXBXBXBXNXBXBXBXzXBXzXBXBXNXBXBXzXBXBXBXBXBXNXBXBXNXBXNXNXBXBXNXBXNXBXBXBXBXNXBXNXBXNXNXBXNXBXBXNXBXBXNXBXBXNXBXNXBXNXBX", | |||
"NXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXBXNXNXNXNXBXNXNXBXNXzXBXBXBXBXBXNXBXNXBXzXBXBXNXBXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXzXNXBXBXNXNXNXNXNXBXNXNXBXhXR o . . . . # n.hXNXNXMXzXBXNXBXNXNXzXBXBXBXBXBXBXzXzXBXzXBXzXBXBXBXBXzXNXBXBXNXNXNXBXNXNXBXNXNXNXBXNXNXNXNXNXNXBXzXBXzXNXBXBXNXNXNXBXBXzXBXNXBXzXBXBXBXzXBXBXzXBXNXBXNXNXBXNXNXBXNXNXBXNXNXNXNXNXNXBXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNX", | |||
"NXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXzXBXzXBXzXBXNXNXNXNXNXNXzXBXNXNXNXBXNXNXNXNXBXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXBXzXBXNXBXNXNXNXNXNXNXNXNXNXNXiXR . . . . . . . . . R iXMXBXNXBXBXzXBXNXNXNXNXNXBXzXBXBXzXzXBXBXzXBXzXBXBXBXBXzXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXBXNXNXBXNXNXNXNXNXNXNXBXNXNXNXzXBXzXBXBXzXzXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXBXNXNXNXNXNXBXNXNXNXBXNXNXNXNX", | |||
"NXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXBXzXBXzXBXzXNXNXNXNXNXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXBXzXBXzXNXNXNXNXNXNXNXNXNXNXNXzXiXU . . . . . . . . . . . . . . . . . I iXNXBXMXzXBXzXNXBXzXNXNXNXNXNXNXNXzXBXzXBXBXzXBXBXzXzXzXzXzXBXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXNXzXBXzXNXNXNXNXNXNXBXzXNXBXzXBXzXBXzXBXzXBXzXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNX", | |||
"NXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXzXBXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXBXzXBXzXzXBXzXBXzXBXzXBXNXNXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXBXNXNXNXNXNXzXBXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXMXNXNXuXU . . . . . . . . . . I uXNXNXNXzXNXNXNXzXNXNXNXNXNXBXNXNXNXNXNXBXzXBXzXBXzXzXBXzXBXzXBXBXBXBXBXNXNXBXNXNXNXNXNXNXNXNXNXzXBXNXNXNXNXNXNXNXzXNXNXNXNXNXNXNXBXNXNXBXzXBXzXBXzXzXBXNXzXNXBXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXzXNXNXNXNXNXNXNXNXNXNXNXNX", | |||
"NXNXNXNXNXNXNXzXNXNXNXzXNXNXNXNXNXNXNXNXzXNXzXNXNXzXNXzXNXNXzXNXNXzXNXNXNXzXNXNXzXNXzXNXNXNXNXNXzXNXNXNXzXBXzXBXBXzXBXzXBXzXBXzXNXzXNXNXNXNXNXNXzXNXNXNXNXNXzXNXNXNXNXzXzXNXzXNXNXzXNXzXNXNXNXNXzXNXBXzXNXNXzXNXNXNXNXNXNXNXNXzXMXMXNXzXNX4XH . . . . . . . . . H uXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXzXNXzXNXBXzXzXBXzXBXzXBXBXzXBXzXBXzXzXzXzXzXNXNXzXNXzXNXzXNXzXNXNXNXNXzXNXNXzXNXNXNXNXNXNXNXNXzXzXBXNXzXNXzXzXBXzXBXzXBXBXzXNXBXzXzXNXBXzXNXNXNXNXNXzXNXzXNXzXNXNXNXNXzXNXNXNXNXzXBXNXzXNXNXNXNXNXNXNXNXNXlX", | |||
"NXNXlXNXNXzXzXNXNXzXzXNXNXzXNXNXNXNXNXzXNXNXNXzXBXzXzXNXzXNXNXNXzXNXzXNXNXNXNXNXzXNXNXzXNXNXzXNXzXNXzXzXzXzXzXBXzXzXzXzXzXBXBXzXNXNXzXNXNXNXzXNXzXNXzXNXNXzXNXlXNXzXzXNXNXNXNXzXzXBXzXNXNXzXNXNXzXBXzXzXzXNXNXNXNXNXzXNXNXzXzXNXNXzXzXNXzXNXNX5XA . . . . . . . I 4XNXzXNXNXNXNXNXNXzXNXzXNXzXNXzXNXNXzXNXzXBXzXzXzXzXzXzXzXBXzXBXzXzXzXBXzXzXBXzXzXNXNXNXzXNXNXzXNXNXzXzXNXNXNXNXNXzXNXzXNXzXNXNXzXzXNXNXzXBXzXNXBXzXzXBXzXBXzXBXzXNXBXzXzXNXBXzXzXzXNXNXzXNXNXzXNXNXzXNXNXNXzXzXzXzXNXzXzXNXzXNXNXNXNXNXlXNXNXNX", | |||
"zXlXNXzXzXNXzXzXzXNXzXzXNXzXzXzXzXzXNXzXzXzXzXzXzXNXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXNXzXzXzXNXzXzXzXNXzXzXBXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXNXzXNXzXNXzXzXNXlXNXNXzXNXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXNXzXzXzXzXzXNXzXzXNXzXzXzXNXzXzXNXzXNXNXzX4Xn . . . . . . . . . . n 2XzXzXzXNXzXNXlXNXfXlXNXNXzXzXNXNXzXzXzXNXzXzXzXNXzXBXzXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXNXzXzXNXzXzXzXzXzXzXNXzXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXzXzXzXNXzXzXzXNXzXzXzXzXNXzXNXzXNXzXzXNXzXNXlXNXlXNXNXNXlX", | |||
"zXzXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXNXzXzXzXNXzXzXzXzXzXzXzXNXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXNXzXNXNXlXNXlXNXzXNXzXzXzXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXNXzXNXzXzXNXlXNXNXzXNXNXzXzXNXzXNXNXzXNXzXzX2Xn . . . . . . r 4XzXzXMXzXzXzXNXzXNXzXNXNXNXlXNXzXNXzXNXzXMXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXNXzXzXBXzXzXzXNXzXzXzXzXzXBXzXzXzXzXzXzXzXNXzXzXlXNXlXNX", | |||
"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXNXNXlXNXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXNXlXNXfXNXlXzXzXzXzXzXzXzXzXzXzXzXzXNX*Xw . . . . . . . . 0 2XzXlXzXzXzXzXzXzXzXzXzXzXzXlXNXNXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXlXNXlX", | |||
"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXlXNXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXNXNXNXfXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlX[.7 . . . . . . . . . 0 *XlXzXzXzXzXzXzXzXzXzXzXzXzXNXlXlXNXfXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzX", | |||
"zXzXlXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXlXlXlXNXfXNXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXlXzXfXNXNXlXzXzXlXzXzXlXzXlXzXzXlXzXzXzXzXlXlX[.7 . . . . . . . . . . . . . . . 3 [.lXzXlXzXlXzXzXlXzXlXzXzXlXzXlXzXlXlXNXfXNXzXlXzXlXzXzXlXzXlXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXzXzXzXzXlXzXzXlX", | |||
"lXlXlXlXlXNXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXlXNXlXlXlXlXlXNXlXlXzXzXlXNXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXzXlXzXlXzXlXzXlXlXzXlXzXlXzXlXzXlXlXzXlXzXlXzXlXlXzXlXzXlXzXlXlXzXlXjXF.= . . . . . . . : F.jXlXzXlXlXlXzXlXlXzXlXlXzXlXlXzXlXlXlXzXlXlXzXzXlXlXzXlXlXlXzXlXlXzXlXlXlXNXlXlXNXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXlXlXlXlXNXlXlXlXNXNXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlX", | |||
"lXlXNXlXlXlXlXNXlXlXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXNXlXlXlXzXlXlXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXlXlXlXNXlXlXlXzXlXzXlXzXlXlXlXlXzXlXzXlXzXlXzXzXlXzXlXzXlXlXlXlXzXlXzXlXzXlXlXzXlXlXjXF.% . . . . . . . . . . * F.kXlXlXzXlXlXzXlXzXzXlXlXzXlXzXzXlXzXlXzXlXlXzXzXlXlXzXzXlXlXzXzXlXlXzXzXlXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXNXlXlXlXlXlXlXlXlXlXlXNXNXlXlXlXNXlXlXNXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXNXlXNXNXlXlXlXlXlXlXlXNXlXlXNXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlXNXNXlXNXlXNXlXlXNXlXlX", | |||
"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXdXA.# . . . . . # A.dXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXlXzXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX", | |||
"lXlXlXlXlXlXlXlXjXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXdXA.# . . . . . . . . . # A.dXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXfXzXlXlXlXlXlXlXlXlXzXzXfXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlX", | |||
"lXlXlXjXlXlXjXjXlXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXlXjXlXlXjXjXjXjXlXlXjXlXlXlXlXlXjXlXjXlXlXlXlXlXlXjXlXlXjXlXlXlXlXlXlXlXjXjXlXlXjXlXjXlXlXlXlXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXlXlXjXlXlXjXlXlXlXlXlXjXlXjXlXlXjXjXlXlXlXlXjXjXlXlXlXjXjXlXlXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXjXjXjXlXiXT . . . . . . + T iXjXlXlXjXlXlXjXlXlXlXjXlXlXlXlXlXlXjXzXlXfXfXfXlXlXlXjXlXlXfXlXlXfXzXfXlXlXzXlXlXjXlXlXjXlXlXlXlXfXlXlXlXlXlXjXlXlXjXlXlXlXjXlXjXlXjXjXlXlXlXlXjXjXlXlXlXlXjXlXlXlXlXlXlXlXjXlXjXlXlXlXjXlXlXlXlXlXjXlXjXjXlXlXjXlXjXjXlXlXlXlXlXlXjXlXlXjXjXlXjXjXlXlXlXjXlXlXjXlXjXlXlXlXjXlXjXlXlX", | |||
"lXjXlXlXjXlXlXlXlXjXlXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXjXlXjXlXlXjXlXlXjXlXlXjXjXlXjXlXlXjXlXlXjXlXlXjXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXjXlXlXlXjXlXjXlXjXjXlXjXlXlXjXlXjXlXjXlXlXlXjXlXjXlXlXlXjXjXlXlXlXlXjXjXlXlXlXjXlXlXlXlXjXlXlXjXlXlXjXjXlXjXlXlXlXlXjXjXlXiXT . . . . . . . . . . . + R iXjXlXlXlXjXlXjXlXjXlXjXlXlXlXjXlXlXjXlXlXfXzXzXlXzXzXfXlXjXlXlXlXlXlXlXlXzXzXfXfXjXlXjXlXjXlXlXjXjXlXlXlXlXlXjXlXjXlXlXlXjXjXlXlXlXlXlXlXlXlXjXlXlXlXlXlXjXlXlXlXlXjXjXlXjXjXlXlXlXlXlXjXlXlXlXjXjXjXlXlXlXlXlXlXlXlXlXlXlXlXjXjXlXjXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXjXjXlXlXlXlXlXjX", | |||
"jXlXjXlXjXlXjXlXlXjXjXjXlXlXjXjXlXjXjXjXlXjXlXjXlXjXjXjXjXlXjXlXjXlXjXlXlXjXlXlXjXlXjXlXlXjXjXlXjXlXlXjXjXlXjXlXjXlXlXjXjXlXjXlXlXjXlXjXlXjXlXlXjXlXjXjXjXlXjXjXjXlXjXlXjXlXjXlXlXjXlXjXlXlXjXlXjXlXjXjXlXlXjXlXjXlXjXlXjXlXlXjXjXlXlXjXlXjXjXlXjXlXjXlXlXjXjXlXjXlXlXjXjXlXjXlXjXlXlXjXlXjXwXI . . . . . . O I uXjXlXlXjXjXjXlXjXlXlXlXjXlXlXjXlXlXjXlXjXjXjXzXfXlXlXfXlXfXlXlXlXfXlXfXlXlXzXfXlXlXlXlXlXlXjXjXlXjXlXlXjXlXlXjXlXjXlXjXjXlXjXjXlXjXlXjXlXjXjXlXjXjXlXjXjXlXjXlXjXlXjXjXlXjXlXjXlXjXlXjXlXjXlXlXjXlXjXlXjXjXlXjXlXjXjXjXlXjXjXjXlXlXlXlXjXjXjXlXjXlXjXjXjXlXjXjXjXlXjXjXjXlXlXlXjXjXlXjXlXjXlX", | |||
"jXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXjXlXzXjXwXI . . . . . . . . . . . . I wXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXfXjXjXjXlXjXjXfXlXfXfXzXfXlXlXfXlXlXfXlXfXfXfXzXfXfXlXfXjXlXfXjXlXjXjXjXjXfXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXlXjXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXlXjXjXjXjXjX", | |||
"jXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjX5XM . . . . . A 5XjXjXjXjXjXfXjXjXjXjXjXfXjXjXjXjXjXjXfXfXfXlXjXjXjXjXjXfXlXfXfXlXfXfXfXzXzXfXfXzXlXfXfXfXfXfXzXfXzXfXlXfXfXlXfXlXjXjXlXfXfXlXlXfXlXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", | |||
"jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX4XM . . . . . . . . . . . M 5XjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXlXlXfXjXjXjXjXfXlXlXfXjXjXlXfXfXfXfXfXfXfXfXlXfXlXlXfXfXfXzXfXfXlXlXfXlXfXjXjXfXlXfXlXfXlXfXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", | |||
"jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXfXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXfXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXfXjXjXjXjXjXjXjX2Xv . . . . . . n 2XjXjXjXjXfXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXfXlXfXfXjXjXjXjXfXlXfXlXjXjXjXfXfXzXfXlXzXfXfXfXfXfXlXlXfXfXfXfXlXfXlXfXjXjXjXjXlXjXfXfXfXlXfXlXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXfXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjX", | |||
"jXfXfXjXfXjXfXfXfXjXfXjXfXjXfXjXfXjXfXjXjXfXjXfXfXjXfXjXfXjXjXfXjXjXjXfXfXfXjXfXjXsXjXjXfXjXsXjXjXjXfXjXfXjXfXfXjXfXfXjXfXfXfXjXfXjXjXfXfXfXjXfXjXfXjXjXjXfXfXjXjXfXjXfXfXjXjXfXfXjXfXjXfXfXjXfXjXjXfXjXjXfXjXfXjXfXjXjXjXfXfXjXjXjXfXjXfXjXfXjXjXfXfXjXfXfXjXfXjXjXfXjXfXjXfXjXjXfXfXjXfXjXjXfXjXjXfXjXjXjXjXjX2Xv . . . . . v 2XjXjXjXjXfXjXfXjXjXfXjXjXfXjXfXjXjXfXjXfXjXfXjXjXfXfXfXlXfXjXfXjXfXfXfXfXjXjXfXlXfXfXlXfXfXfXlXfXlXfXfXfXfXzXfXfXfXfXfXfXjXfXfXjXfXjXlXfXfXfXlXfXjXjXfXjXfXjXfXjXfXfXjXfXjXfXfXjXjXfXfXjXfXjXfXjXjXfXfXjXfXjXfXfXfXjXfXjXjXfXjXfXfXfXfXjXfXjXjXfXjXjXjXsXfXjXfXfXfXfXjXfXjXfXjXjXfXjXjXfXjXfXjXjXjXfXfXjXfXfXjXfX", | |||
"fXfXfXfXfXjXfXfXfXjXfXjXjXfXfXfXfXfXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXjXjXfXfXjXjXfXfXfXfXfXfXjXfXfXjXfXjXfXfXfXfXjXfXjXjXfXjXfXfXfXfXjXjXfXfXfXfXjXjXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXjXfXfXfXfXfXfXfXfXjXjXfXfXfXjXfXfXfXfXfXfXfXfXfXfXjXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfX*Xw . . . . . . . 0 *XsXfXfXjXjXfXfXfXfXjXfXfXjXjXjXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXfXfXjXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXjXfXfXfXjXfXfXfXjXjXfXfXfXfXjXfXjXfXjXsXjXfXfXjXfXfXjXfXjXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", | |||
"fXjXfXfXfXfXjXfXfXfXfXfXfXfXjXfXjXjXfXfXfXfXjXfXfXfXfXfXjXfXjXfXjXfXjXfXjXfXfXfXfXjXjXsXfXfXjXjXfXjXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXfXjXfXfXjXfXjXfXfXfXjXfXsXfXfXfXjXfXfXfXfXjXfXfXfXfXjXfXjXfXfXfXfXfXfXjXfXfXfXjXfXjXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXjXfXjXjXfXfXfXjXfXfXfXjXfXjXfXfXsXfX[.7 . . . . . . 8 [.fXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXjXfXfXjXfXjXfXfXjXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXlXfXfXfXfXlXfXfXfXlXfXfXfXfXfXjXfXjXfXjXfXfXjXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXjXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXjXfXjXjXfXfXfXjXfXfXfXjXjXfXfXfXfXjXfXjXfXfXjXfXjXfXjXfXfXjXfXjX", | |||
"fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXjXfXfXfXfXfXfXfXjXfXfXjXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX[.2 . . . . . . . . . . . 3 G.fXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXjXfXsXfXfXfXfXfXjXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", | |||
"fXfXfXfXfXsXfXfXfXsXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXfXsXfXfXfXsXfXsXfXfXfXfXsXsXfXfXsXfXfXfXsXfXsXjXfXfXfXsXfXfXfXfXsXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXsXfXfXfXfXfXsXfXfXfXfXfXfXfXfXfXsXfXfXfXfXfXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXsXfXsXS.: . . . . . : S.sXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXsXsXjXsXjXsXfXsXfXsXfXsXfXfXsXsXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfX", | |||
"fXfXsXfXsXfXfXfXsXfXsXfXsXsXfXsXfXfXsXfXfXsXfXsXfXfXfXsXfXsXfXfXsXsXfXsXfXsXfXfXfXsXfXsXfXfXfXsXfXsXfXfXsXfXfXsXfXjXsXsXsXfXsXsXsXsXfXsXsXfXsXsXfXsXfXfXsXsXfXsXfXsXfXfXfXsXfXsXfXfXsXfXfXsXfXfXfXfXsXfXfXsXfXfXfXsXfXsXfXfXsXfXsXfXfXfXsXfXfXsXfXfXsXfXfXsXfXfXfXfXsXfXfXsXfXfXsXfXfXsXfXsXfXsXfXfXsXsXfXfXsXfXsXfXsXfXsXfXsXfXfXsXS.% . . . . . . . X % S.sXsXfXfXfXsXfXfXfXsXfXsXfXfXsXfXsXfXfXsXfXsXfXsXfXsXfXfXsXsXfXsXfXsXfXsXsXfXsXfXfXfXsXfXfXfXfXsXsXfXfXfXsXfXfXsXfXfXsXfXfXsXfXfXfXsXfXfXsXsXfXfXsXfXsXfXsXfXfXfXsXsXsXfXfXfXsXfXfXfXfXfXfXfXsXfXsXfXfXfXfXfXsXfXfXsXfXsXfXjXsXsXfXsXfXfXsXfXsXfXsXfXsXfXsXsXfXsXfXfXsXfXsXfXfXsXfXsXfXsXsXfXfXsXsXsXfXfXfXsXfXfXsXfXsXfXfXsXfXfXsXfX", | |||
"sXsXsXsXsXsXsXsXsXsXfXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXsXfXsXsXsXsXsXfXsXfXfXsXsXsXfXsXsXfXsXsXsXfXfXsXsXsXsXsXsXfXsXsXsXsXfXsXsXfXsXfXsXfXfXsXsXfXfXsXsXfXsXfXsXfXsXsXsXsXfXsXsXfXsXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXsXfXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXfXsXfXsXsXsXfXsXsXfXsXfXsXsXsXfXsXfXsXfXsXsXpXm.+ . . . . . # n.pXfXsXsXsXsXsXfXsXsXfXsXsXfXsXsXsXsXfXsXfXsXsXfXsXfXsXfXsXsXsXfXsXfXsXfXsXfXsXfXfXsXsXsXfXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXfXsXsXsXsXfXsXsXfXsXfXsXsXsXsXsXsXfXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXfXsXfXsXsXsXfXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXsXfXsXsXsXfXsXsXsXsXfXsXsXsXfXsXsXsXfXsXsXsXfXsX", | |||
"fXsXfXsXsXsXsXsXfXsXfXsXsXfXsXsXsXsXsXsXsXsXfXsXsXsXsXfXsXsXsXsXfXsXsXfXsXsXsXsXsXsXfXsXfXsXsXfXsXsXsXsXfXsXsXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXfXsXsXfXsXsXsXsXsXfXsXsXsXsXsXsXfXsXsXsXsXfXfXsXsXfXsXsXsXfXsXsXsXsXsXsXsXfXsXfXfXsXsXsXsXsXfXsXfXsXsXsXsXfXsXsXsXsXfXsXsXfXsXfXfXsXsXfXsXsXfXsXsXfXsXsXsXsXsXfXsXfXsXfXsXsXsXsXsXsXsXsXfXsXsXiXm.& . . . . . & A.pXfXfXsXsXsXsXsXfXsXsXsXsXsXfXsXsXsXsXfXsXsXsXfXsXsXfXsXsXfXsXfXsXsXsXfXsXsXsXfXsXsXsXsXsXsXsXsXfXsXsXfXsXsXfXsXsXsXsXfXfXsXsXfXsXsXfXsXsXsXsXsXsXsXsXfXsXfXsXfXfXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXfXsXsXfXsXsXsXsXsXjXsXsXsXsXfXsXfXsXfXfXsXfXsXsXsXsXsXfXsXsXfXfXsXsXsXsXsXsXfXfXsXsXsXsXsXsXfXsXsXsXfXsXsXfXsXfXsXsXfXsXsX", | |||
"sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXwXT . . . . . . . X T wXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX", | |||
"sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXwXT + . . . . . . X T wXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX", | |||
"sXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXaXsXsXsXsXaXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXsXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXaXsXsXaXsX5XI . . . . . X I 5XaXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXaXaXsXsXsXsXsXaXsXsXsXaXsXsXaXsXsXsXsXsXaXsXsXsXaXsXaXsXsXsXsXsXsXsXaXsXaXsXsXsXaXsXsXaXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXaXsXaXsXsXsXsXaXsX", | |||
"sXsXaXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXaXsXsXaXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXaXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsX5XI O . . . . . . . . . I 5XsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXaXsXaXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXaXsXaXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXaXsXaXsXsXsXsXsXsXsXsXsX", | |||
"sXsXsXsXsXsXaXsXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXsXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXsXaXsXsXsXsXsXsXaXsXaXsXsXaXsXsXsXaXsXsXsXsXsXaXsXsXaXsXaXsXaXaXsXsXsXsXsXsXsXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXsXsXaXsXaXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXsXsXsXsXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXsXsXaXsXaXsXsXsXsXaXsXsXaXsXsXaXsXaXsXaXsXaXsXsXsXsXsXaXsXaXsXsXaXsXsXaXsXsX3XA . . . . . M 3XsXaXsXsXaXsXaXsXsXaXsXsXaXsXsXsXaXaXsXaXsXsXaXsXsXaXsXaXsXsXsXsXsXsXsXaXsXsXaXaXsXsXsXsXaXsXsXsXaXsXsXsXaXsXsXaXsXaXsXsXsXaXsXsXaXsXaXsXaXsXsXsXsXsXaXsXaXsXsXsXsXaXsXaXsXsXsXsXaXsXaXsXsXsXsXsXsXsXaXsXsXaXsXaXsXsXaXsXsXaXsXsXsXsXsXsXsXsXaXsXsXaXsXsXaXsXaXsXaXaXsXsXaXsXsXaXsXaXsXsXaXsXsXsXsXaXsXsXaXsXaXsXsXaXsXsXsXaXsXsXaXsXsXsXsXsXsXsXaXsXaXsXaXsXsX", | |||
"sXaXsXaXsXaXsXaXaXsXaXsXaXsXsXaXaXsXaXsXsXaXaXsXsXaXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXsXaXsXaXsXaXsXsXaXsXaXsXsXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXsXsXsXaXsXaXsXsXaXsXaXsXsXaXsXaXsXaXsXaXaXsXaXsXsXaXsXaXaXsXsXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXsXsXsXsXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXaXsXaXsXsXsXsXsXaXsXaXsXaXsXaXsXsXsXsXaXsX2XM . . . . . M 2XaXsXaXsXaXsXaXsXaXsXsXaXsXaXsXsXaXsXsXsXaXsXaXsXsXsXsXsXaXaXsXsXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXaXsXaXsXsXsXaXsXaXsXaXsXaXsXaXsXsXsXsXsXsXsXsXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXsXaXaXaXsXsXaXsXaXsXsXsXsXaXsXsXaXsXaXsXaXsXsXsXaXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXsXaXsXaXaXsXsXaXaXsXaXsXaXsXaXsX", | |||
"aXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXsXaXaXaXaXsXaXsXaXaXaXaXsXaXsXaXsXaXaXsXaXaXaXaXaXsXaXsXsXaXsXaXsXsXaXsXaXsXaXsXaXaXsXsXaXaXaXaXsXaXsXaXsXaXaXsXaXaXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXsXaXaXsXaXsXaXaXsXaXaXaXaXsXaXsXaXsXaXsXaXaXaXaXaXaXsXaXsXsXaXsXaXaXaXsXaXsXaXsXaXsXaXsXaXsXsXaXaXsXaXsXaXsXaXsXaXaXaXaXsXaXsXsXsXaXsXaXaXaXaXsXaXsXsX{.v . . . . . . . . v {.sXsXsXaXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXaXaXsXaXsXaXaXaXaXaXaXsXsXaXaXaXaXsXaXaXsXaXaXaXaXsXaXsXsXaXaXsXsXaXsXaXaXaXsXaXsXaXsXaXsXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXaXaXaXsXsXaXaXsXaXsXaXsXaXsXaXaXsXaXsXaXaXaXaXsXaXaXsXaXsXaXsXaXaXaXsXaXsXaXsXaXsXaXaXaXaXaXaXsXaXsXaXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaX", | |||
"aXsXsXaXsXaXsXaXaXsXsXsXsXaXaXsXaXsXsXaXaXaXsXsXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXsXsXsXaXaXsXaXsXaXaXsXsXaXsXsXaXsXaXaXsXaXsXaXsXaXaXaXaXsXaXsXaXsXaXaXsXsXaXsXsXaXsXaXaXsXsXsXaXsXsXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXaXsXaXaXaXsXsXaXaXsXsXaXaXsXaXaXsXaXsXaXaXsXaXsXaXsXaXsXaXaXsXaXsXsXaXaXsXaXsXaXsXaXaXsXsXsXaXsXsXaXsXaXsXaXaXaXaXsXaXsXaXsXsXaXaXaXsXsXsXaXsXaXsXaXaXsXsX{.r . . . r {.sXsXsXsXaXsXsXaXaXsXaXsXaXaXsXsXaXaXaXsXsXaXsXaXsXsXaXaXsXsXaXsXaXaXsXaXsXaXsXsXaXaXsXsXaXaXsXsXaXsXaXaXsXaXaXsXsXaXsXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXsXsXaXsXsXsXsXsXaXaXsXsXaXsXaXaXaXsXsXsXaXsXaXsXaXsXaXaXaXsXsXsXaXaXsXaXsXaXsXsXsXaXaXaXsXsXaXaXsXsXaXsXaXsXaXaXsXsXaXsXaXaXsXsXsXsXaXaXsXaXsXaXsXaXsXsXsXaXaXsXaXsXaXsXaXaXaXaXaXsXsXsXaXsXaXsXaXsXaXaXaXsXsXsXaXaXsX", | |||
"aXaXaXaXsXaXaXaXaXaXaXaXaXsXaXaXsXaXaXsXaXsXaXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXsXaXaXaXaXsXaXaXsXaXsXaXaXsXaXaXsXaXaXsXaXaXsXaXaXsXaXsXsXaXaXaXsXaXsXaXaXaXaXaXsXaXaXaXsXaXaXaXsXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXsXaXaXsXsXaXaXsXsXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXaXsXaXaXaXaXsXaXaXsXaX[.w . . . . w [.aXsXaXaXsXaXsXaXaXaXsXaXaXsXaXsXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXaXsXaXsXaXaXsXaXaXsXaXsXaXaXsXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXsXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXsXaXsXaXaXsXaXsXaXaXsXaXaXsXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXsXaXsXaXaXsXaXaXaXaXsXaXsXaXsXaXaXaXsXaXaX", | |||
"aXsXaXaXaXaXaXsXaXaXsXaXaXaXaXsXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXsXaXaXaXaXsXaXaXaXaXsXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXsXaXaXaXaXsXaXaXsXaXaXsXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXsXaXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXaXaXaXsXaXsXaXaXaXaXaXaXsXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXpX[.8 . . . . 8 [.aXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXaXaXsXaXaXsXsXaXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXsXaXaXsXaXaXaXaXaXsXaXaXaXaXsXaXsXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXsXaXaXaXsXaXaXaXaXsXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXsX", | |||
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXpXG.2 X . . 2 G.aXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaX", | |||
"aXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXpXm.% X . . . . . . 2 S.pXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaX", | |||
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXS.: . . . . . . : S.yXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX", | |||
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXeXn.# . . & n.wXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaX", | |||
"aXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXyXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXyXaXyXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXaXyXaXaXaXeXn.+ . . . . . + n.eXaXaXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXaXaXyXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXyXaXaXyXaXaXyXaXaXyXaXaXaXyXaXyXaXaXaXaXaXaXaXyXaXyXaXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyX", | |||
"aXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXyXaXaXyXaXyXyXaXaXaXaXyXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXwXU # . . . + T wXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaX", | |||
"aXyXaXyXyXaXyXaXyXaXaXaXyXaXyXaXyXaXyXaXaXaXyXaXyXaXyXaXaXaXaXyXaXyXaXyXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXyXyXaXaXaXyXaXyXaXaXaXaXyXaXyXaXaXaXaXyXyXaXaXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXaXaXaXyXyXaXyXaXaXyXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXyXaXaXaXaXyXyXaXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXaXaXaXaXaXaXyXwXU . . . . . X T 6XyXaXyXaXyXaXyXaXaXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXyXaXaXyXyXaXyXaXaXyXaXyXaXaXaXyXaXyXyXaXaXaXyXaXaXyXyXaXaXyXyXaXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXyXyXaXaXaXaXyXaXyXaXaXaXyXyXaXyXaXyXaXyXaXaXaXaXaXaXyXaXyXaXaXaXaXyXaXaXyXyXaXaXyXaXyXaXaXyXaXyXaXyXaXaXyXaXaXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXyXaXaXyX", | |||
"aXyXyXaXaXyXaXyXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXyXaXyXaXyXyXaXaXaXaXyXaXyXaXyXaXaXyXyXaXyXaXaXyXyXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXaXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXaXaXaXyXyXaXaXyXaXyXyXaXaXyXaXyXyXyXaXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXaXyXyXaXyXaXyXaXyXaXaXaXyXyXaXyXaXyXyXaXyXaXyXyXaXyX5XS . . . I 3XaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXaXyXyXaXyXaXaXaXaXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXyXaXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXyXaXaXyXaXaXyXyXaXyXaXyXaXyXaXyXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXaXyXaXyXyXaXaXaXaXaXyXaXyXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXyXaXaXaXyXaXaXyXaXyXaXyXaXaXaXaXaXyXaXaXyXaXaXaXyXaXyXaXyXaXyXaXyXaXyXaXaXaXyXaXyXaXyXaXaXaXaXaXyXaXaXyXaXaXaXaXaXaXaXyXaXyXaX", | |||
"yXaXyXaXyXaXyXaXaXyXyXyXaXyXaXaXaXyXyXaXyXaXyXaXaXyXaXaXyXaXyXyXyXaXyXaXaXyXaXyXaXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXyXyXaXyXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXaXyXyXyXyXaXyXaXaXyXaXyXyXaXyXaXyXyXyXaXaXyXaXyXaXyXaXyXyXaXyXyXaXyXaXaXyXaXyXaXaXyXyXyXaXyXyXaXyXyXyXaXyXyXyXaXyXaXaXyXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXaXaXyXyXaXyXyXyXaXyXyXaXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXyXaX6XI . . . . I 6XaXyXyXaXyXaXyXyXaXyXaXyXaXyXyXyXaXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXaXyXaXyXyXaXyXyXaXyXaXyXyXaXyXyXyXaXyXyXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXaXyXyXaXyXaXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXaXyXyXyXyXyXyXaXyXyXyXyXaXyXaXaXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXaXyXaXaXyXaXyXyXaXyXyXyXaXyXyXyXaXaXyXaXyXyXyXyXyXaXyXyXaXyXyXyXaXyXaXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXaXyXaXyX", | |||
"yXaXyXyXyXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXaXyXyXaXyXyXyXyXaXyXyXyXyXaXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXyXyXyXyXyXaXaXyXaXaXyXyXyXyXaXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyX3XM . M 3XyXaXyXaXaXyXyXyXaXyXyXyXyXaXyXyXaXyXyXaXyXyXaXaXyXyXaXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXaXyXaXyXaXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXaXyXyXyXyXyXaXaXyXaXaXyXaXaXyXaXaXyXyXyXyXyXyXaXaXyXaXaXyXyXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXaXyXyXaXyXyXyXyXaXyXyXyXaXyXaXyXyXyXaXyXyXyXaXyXyXaXaXyXyXaXyXyXyXyXaXyXyXyXyX", | |||
"yXyXyXaXyXaXyXyXyXyXyXyXaXyXaXyXyXaXaXyXyXaXyXaXaXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXyXaXyXaXyXyXyXaXaXyXaXyXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXaXyXaXyXyXaXaXyXyXaXyXaXyXyXyXyXaXyXyXyXaXyXyXaXyXaXaXyXyXyXyXyXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXaXyXyXyXyXaXaXyXyXyXyXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXyXyXyXaXaXyXyXaXyXyXyXaXyXaXyXyXaXaXyXaXyXaXyXaXyXyXyXaXaXyXyXyXaXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXyXaXyXyX3XM . . . . M 3XyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXaXyXaXyXyXyXaXaXyXyXyXyXyXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXyXyXyXyXyXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXyXyXyXyXyXaXyXaXyXaXyXaXaXyXyXaXyXaXaXyXaXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXaXyXyXyXyXyXyXyXaXaXyXyXyXyXyXyXyXaXaXyXaXyXaXyXyXyXyXaXaXyXaXyXaXyXyXyXyXyXaXyXyXyXaXaXyXyXyXaXyXyXaXaXyXyXyXaXyXyXaXaXyXyXyXaXyXyXyXyXaXyXyXyXyXaXyXaXaXyXyXyXaXyXyXyXyXaXyXyXaXaXyXyX", | |||
"yXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXaXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXaXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyX{.r . . . c {.yXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXaXyX", | |||
"yXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyX{.w . . . . w {.yXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyX", | |||
"yXyXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyX/.8 . 8 /.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX", | |||
"yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXG.7 . . . 7 G.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX", | |||
"yXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXrXyXtXyXyXtXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXtXyXyXtXyXyXtXyXyXyXyXyXtXyXyXyXyXtXyXyXyXtXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXtXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXtXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXrXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXtXyXyXtXyXyXyXtXyXyXyXyXyXtXyXtXyXtXyXyXtXyXyXyXyXyXyXtXyXyXyXyXG.3 . . 2 G.tXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXtXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXrXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXrXyXyXrXyXyXyXyXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXtXyXyXyXtXyXtXyXyXyXyXyXyXyX", | |||
"yXyXyXtXtXtXtXyXyXtXtXyXyXrXyXtXyXyXyXtXyXtXyXyXyXyXrXyXrXyXyXrXyXyXrXyXyXyXrXyXyXyXyXrXyXyXyXyXyXtXyXyXyXrXtXyXyXyXyXyXyXyXyXyXtXtXtXyXyXtXyXyXtXyXtXyXyXrXyXtXtXyXtXyXtXyXyXtXtXyXtXtXtXyXyXtXtXyXtXtXyXyXtXtXyXtXtXyXtXyXtXtXyXtXtXyXtXyXyXtXtXyXtXyXtXyXtXyXyXtXyXtXyXtXyXtXtXyXtXyXyXtXyXtXyXyXyXtXtXyXtXyXtXtXtXyXyXyXyXtXyXtXyXyXrXtXyXyXtXtXyXtXyXyXtXyXyXrXrXyXyXtXtXyXyXtXyXyXyXtXyXyXyXtXtXyXtXyXyXtXtXyXyXtXyXtXtXyXtXyXtXyXtXyXtXtXrXeXZ.3 . . 3 Z.tXyXyXtXyXtXyXtXtXyXtXyXyXtXtXyXtXtXyXyXtXtXyXyXtXyXtXyXrXyXrXyXtXyXyXyXtXyXyXyXtXyXtXyXtXyXyXtXtXyXtXyXtXyXtXtXtXyXtXtXtXyXyXyXyXtXtXyXtXtXtXyXtXyXyXyXtXyXyXtXtXtXyXtXtXyXtXtXtXyXtXyXtXyXyXyXtXyXtXtXyXyXyXyXtXtXtXyXtXtXyXyXtXtXyXtXtXtXyXtXyXrXtXyXtXyXyXtXtXyXtXtXyXyXyXtXtXtXyXyXrXyXrXyXyXyXyXyXyXyXyXtXyXyXrXyXrXyXrXyXyXrXyXyXrXyXrXyXrXyXrXyXyXyXyXyXyXrXyXyXyXyXyXyXyXrXtXyXtXyXtXyXyXtXtXyXyXyXyXtXtXyXtXyXyXtXtXyXyXtXyXyXtXtXyXtXyXrX", | |||
"tXyXtXyXtXtXtXtXrXtXtXtXtXyXrXyXtXtXtXtXtXyXrXyXrXyXyXrXrXyXyXrXyXrXyXyXrXyXyXrXrXyXyXrXyXrXrXyXrXtXyXtXtXyXtXyXrXyXyXrXrXyXyXrXtXtXtXtXtXtXyXtXtXtXtXtXtXrXyXyXtXyXtXyXtXtXtXyXtXyXtXyXtXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXyXtXyXtXyXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXyXtXtXyXtXrXyXyXrXrXyXtXtXtXtXtXyXtXyXrXtXyXtXtXtXyXtXtXtXyXtXtXtXtXtXtXtXtXyXtXtXtXyXtXtXtXtXyXtXtXtXyXtXyXtXtXtXtXrXm.% . . . % m.eXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXyXtXtXtXrXyXyXrXyXrXyXrXyXtXtXyXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXyXyXtXtXtXtXtXtXtXtXyXtXyXyXtXyXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXyXtXyXtXtXtXtXyXtXtXtXyXtXyXtXyXtXtXtXtXtXtXtXyXtXyXyXrXrXyXyXrXrXyXyXrXrXyXtXyXyXtXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXrXyXyXrXyXrXyXyXtXtXtXtXtXyXtXyXtXyXtXrXrXyXrXyXtXtXtXtXtXtXtXyXrXyXtXyXyXtXtXtX", | |||
"tXtXtXtXyXtXyXtXyXtXyXtXyXrXyXtXyXtXyXtXyXrXyXtXyXrXyXrXyXyXrXyXrXyXrXrXyXrXyXrXyXyXrXyXyXrXyXyXyXtXtXtXyXrXyXrXyXrXrXyXyXrXrXyXyXtXyXtXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXtXyXtXtXtXtXtXtXtXyXtXyXtXtXyXtXyXtXtXtXtXtXtXtXyXyXtXtXtXtXtXtXtXtXyXtXyXtXyXtXyXtXyXtXyXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXyXtXyXtXtXyXrXyXyXrXyXyXtXtXyXtXtXtXtXyXyXyXrXyXrXyXtXrXyXtXtXtXtXtXtXtXtXtXtXyXtXtXyXtXtXtXyXtXtXtXyXtXyXtXtXtXyXtXtXtXtXtXtXtXtXtXqXn.$ . . : m.qXtXtXtXtXtXtXtXtXtXtXyXtXyXyXtXyXtXyXtXtXyXtXtXtXtXtXtXtXyXyXtXtXyXtXyXtXtXtXtXyXrXtXyXtXtXtXyXtXyXtXtXtXtXyXtXyXtXyXrXtXyXtXyXtXyXtXtXyXtXyXtXtXtXtXtXtXyXtXtXyXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXyXtXtXyXtXyXtXyXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXyXtXtXyXyXtXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXrXyXyXrXyXyXyXyXrXyXyXrXtXyXrXyXyXyXyXyXrXyXrXyXrXyXyXrXyXyXyXyXrXyXyXyXrXyXyXrXyXrXyXyXrXyXrXyXyXtXyXtXtXtXtXtXyXrXtXyXyXtXyXrXyXtXyXtXyXtXtXtXtXtXtXyXrXyXrXyX", | |||
"yXrXrXyXyXrXyXrXtXtXrXyXtXtXyXrXtXtXtXtXyXrXyXtXtXtXyXrXyXyXrXtXyXrXyXrXyXrXyXyXrXrXyXrXrXyXrXrXyXrXyXrXrXyXyXrXrXyXyXrXyXrXrXyXtXtXyXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXyXrXrXyXrXrXyXrXyXrXyXtXtXtXtXrXyXyXrXyXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXeXn.+ . . # n.eXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXrXtXtXtXtXtXtXtXtXyXrXtXyXtXtXtXtXtXtXyXrXtXrXyXrXyXtXtXtXtXtXyXrXrXyXrXyXtXtXtXtXtXtXtXtXtXtXtXtXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXyXyXrXrXyXyXrXtXyXyXrXrXtXtXtXyXrXyXrXyXrXyXyXrXrXyXrX", | |||
"rXrXyXrXrXyXrXyXrXrXyXrXrXtXrXyXrXtXtXtXrXrXrXtXtXrXrXyXrXrXrXtXrXrXrXyXyXrXrXrXrXyXyXrXyXrXrXyXrXyXrXyXyXrXrXyXyXrXrXyXrXyXrXrXrXtXrXyXtXtXtXtXtXrXtXtXrXtXtXtXtXtXtXtXtXtXtXrXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXrXtXtXtXtXtXtXtXtXtXrXtXtXtXtXtXrXtXtXtXtXrXtXtXrXtXrXtXtXrXtXtXtXtXtXrXtXtXtXtXtXtXrXtXtXtXtXtXtXtXrXtXtXtXyXrXrXyXrXrXyXrXrXrXrXrXtXrXtXrXtXrXrXyXrXyXrXrXtXtXrXtXtXtXrXtXtXtXrXyXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXrXtXrXtXtXtXtXrXeXrXtX6XU + O U 6XtXrXtXrXyXtXtXtXtXtXrXtXtXtXtXtXtXtXtXtXtXrXtXtXtXtXtXtXrXtXrXtXtXtXrXtXrXtXtXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXrXtXtXtXrXtXtXrXtXrXtXtXtXtXrXtXrXtXrXtXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXtXtXrXtXrXtXtXtXrXtXtXtXtXrXtXtXtXtXrXtXtXtXrXyXtXrXtXrXrXyXtXrXtXrXrXyXyXrXrXrXrXtXrXtXrXyXrXrXrXrXtXtXrXtXrXtXtXtXtXrXtXtXyXrXrXyXyXrXyXrXrXyXyXrXyXrXrXyXrXyXrXrXyXrXrXyXyXrXrXyXrXrXrXyXtXtXtXrXrXrXrXyXyXrXrXrXrXyXyXrX", | |||
"rXyXrXyXrXrXrXrXtXrXyXrXtXrXrXrXrXtXrXtXrXyXrXrXrXrXrXrXyXrXtXrXrXyXrXrXrXyXrXyXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXyXtXrXrXrXrXrXtXrXtXrXtXrXtXrXtXrXrXtXrXtXtXrXrXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXrXrXrXtXrXtXrXtXrXrXtXrXtXrXtXtXtXrXtXrXtXtXtXtXtXrXrXtXrXtXrXtXrXtXrXrXrXrXtXrXtXrXtXrXrXrXtXrXtXyXrXrXrXyXyXrXrXyXrXyXrXtXtXrXtXrXrXrXrXrXtXrXyXrXtXrXtXrXtXrXtXrXrXrXrXrXrXtXrXrXtXrXtXrXtXtXtXtXrXtXrXtXrXtXrXtXtXtXrXrXtXrXtXtXtXrX6XU . . . O U 6XtXtXrXrXrXtXrXrXrXtXrXtXrXtXrXrXrXtXrXrXtXrXtXrXtXrXrXrXtXrXtXrXtXrXtXtXtXrXtXrXrXtXrXrXtXrXtXrXtXtXrXtXrXrXtXrXtXrXtXrXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXrXtXtXrXrXtXtXrXtXrXtXrXrXtXrXtXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXrXrXtXrXtXtXtXrXrXtXrXtXtXrXtXrXtXrXrXtXrXtXtXrXtXtXrXrXrXrXrXtXrXrXtXrXrXrXrXtXtXrXtXrXrXrXyXrXtXtXrXyXrXrXrXyXrXtXrXtXrXtXtXtXrXrXtXrXtXyXrXyXrXrXyXrXrXyXrXrXrXyXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXyXrXrXrXyXrXtXrXyXrXrXrXyXrXyXrXrXrXrX", | |||
"rXrXrXrXyXrXrXyXrXyXrXrXrXyXrXyXtXrXtXrXrXrXyXrXyXrXyXrXrXrXrXyXrXrXyXyXrXrXrXrXyXrXyXrXrXrXyXrXrXyXrXyXrXrXyXrXrXrXyXrXrXrXrXrXrXyXrXyXrXtXrXtXtXtXtXrXtXtXrXrXtXrXtXrXrXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXtXtXrXtXrXtXrXtXrXtXtXtXrXtXrXtXtXrXtXtXtXrXrXtXrXtXrXtXrXtXtXtXrXtXrXtXtXrXtXtXrXtXtXtXtXtXrXtXrXrXyXyXrXrXrXyXrXrXyXrXrXtXtXtXrXyXyXrXtXrXtXrXtXrXtXtXrXtXtXrXrXyXrXyXrXtXrXrXrXtXtXtXrXtXrXrXrXtXrXtXtXtXrXrXtXrXrXtXtXrXtXrXrXtXtXtXrX6XS . . S 6XrXrXtXrXtXtXrXrXtXrXtXrXrXtXtXtXrXtXtXrXrXtXrXtXrXtXrXtXrXrXtXtXtXtXtXrXtXrXtXtXtXtXtXrXtXtXrXtXrXtXtXrXrXrXtXtXrXtXrXtXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXtXtXtXtXtXrXtXrXtXtXtXrXtXtXrXtXrXtXtXrXtXrXrXtXtXrXtXrXtXrXrXtXrXtXrXtXrXtXtXrXtXrXrXtXtXtXrXtXtXrXtXrXtXrXrXtXrXyXrXtXtXrXrXtXrXtXrXyXrXtXtXrXyXrXyXrXrXtXtXtXrXtXtXrXtXrXrXtXrXrXyXyXrXrXtXtXrXrXtXrXrXtXtXrXtXrXrXrXrXrXrXrXrXyXrXrXyXrXrXrXyXrXrXyXrXrXyXrXyXrXyXrXyXrXrXrXrXyXrXrXtXrXrXrXyXrXrXrXrXrXyXrXyXrX", | |||
"rXrXrXyXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXtXrXrXtXrXrXrXtXrXtXrXrXtXrXrXrXrXrXrXrXtXrXrXrXtXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXtX|.S . X o S 3XrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXrXtXrXrXtXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXtXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXtXrXrXtXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXtXrXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX", | |||
"rXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXeXrXtX{.M . M {.rXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX", | |||
"rXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrX{.M . M {.tXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXqXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX", | |||
"qXrXqXrXqXrXqXrXqXrXqXrXrXrXqXrXrXrXrXqXrXrXqXrXrXrXqXrXqXrXrXrXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXqXqXrXrXrXrXrXqXqXrXqXrXrXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXqXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXrXrXqXqXrXqXrX0XrXrX0XrXrXrX0XqXrXqXrXqXqXrXrXrXqXrXrXqXrXqXrXrXqXrXqXqXrXqXrXrXqXrXqXrXrXqXrXqXrXqXrXrXrXqXqXrXrXqXrXqXrXqXrXqXrXqXrXrXqXrXrXqXrXqXrXqXrXrXrXrXqXrXqXrXqXrXrXrXrXqXrXqXrXrXrXqXrXqXrXrXrXrXrXrXqXrXqXqXrXrXqXrXqXrXqXqXrXqXrXrXqXrXrXrXrXqXrXqX/.c . . w {.rXrXrXqXrXrXqXrXqXrXqXqXrXqXrXrXrXqXrXrX0XrXrXrXrXrXqXrXqXrXrXqXrXrXrXqXrXqXrXrXrXqXqXrXqXrXqXrXrXrXqXqXrXrXrXrXrXrXqXqXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXqXrXrXrXqXrXqXqXrXrXrXrXrXqXrXrXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXrXqXrXrXrXqXrXqXrXrXrXrXqXrXrXrXrXqXrXqXrXqXqXrXqXrXqXrXqXrXqXrXrXqXrXqXrXrXqXrXqXrXqXrXrXrXrXqXqXrXrXrXqXqXrXqXrXqXrXqXrXrXrXrXrXrXrXqXrXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXqXrXrXrXqXrXqXrXrXrX", | |||
"rXqXrXqXrXqXrXrXrXrXqXrXqXrXrXqXqXrXqXrXrXrXrXrXqXrXrXrXqXrXqXrXrXrXqXrXqXrXrXqXqXrXqXrXrXqXqXrXrXqXqXrXrXrXrXqXqXrXrXrXrXqXqXrXrXqXrXqXrXrXrXqXrXqXrXrXrXqXrXrXqXrXqXrXqXrXqXrX0XrXqXrXrXrXqXrXrXrXqXrXqXrXrXrXrXrXrXrXrXqXrXqXrXqXrXqXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXqXrXrXqXrXqXrXrXrXrXqXrXqXrXqXrXqXrXrXqXrXqXrXrXrXqXrXqXrXrXrXqXqXrXqXrXqXrXrXqXrXqXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXqXqXrXqXrXqXrXqXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXqX9X{.c w /.rXqXrXqXrXqXrXqXrXqXrXrXqXrXqXrXqXqXrXrXrXrXqXrXrXqXqXrXrXrXrXqXrXqXrXqXrXqXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXrXqXrXqXrXrXrXrXrXqXrXqXrXrXrXrXrXrXrXqXrXqXrXqXrXqXrXrXrXqXrXrXqXqXrXrXqXrXrXrXrXrXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXqXrXrXrXrXrXrXqXqXrXrXrXqXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXqXrXqXrXrXrXqXrXqXrXrXqXqXrXqXrXrXqXrXqXqXrXrXqXrXqXrXrX", | |||
"rXqXqXrXqXrXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXqXqXrXqXqXrXqXrXqXqXqXqXrXqXrXqXrXqXrXqXrXqXqXrXqXrXqXrXrXqXqXqXrXqXqXqXqXqXqXrXrXqXqXrXrXqXqXqXqXrXrXqXqXqXqXrXqXrXqXrXqXrXrXrXqXrX0XrXrXqX0XrXrXqXqXrXrXqXrXqXqXrXqXqXqXqXqXrXqXrXrXqXrXqXqXqXqXrXqXrXrXqXrXqXrXqXqXqXqXrXrXqXqXqXqXrXqXrXqXqXqXrXrXqXrXrXrXqXrXqXrXqXrXqXqXqXqXrXrXqXqXqXqXrXrXqXrXqXrXqXqXrXqXrXqXqXqXrXqXrXqXqXrXqXqXqXrXqXqXrXqXqXqXrXqXrXqXqXrXqXqXqXrXqXrXqXrXqXrXrXrXqXrXrXqXrXrXqXqXqXrXqXqXqXqXrXqXqXqXrXqXqXqXqXqXrXqXrX0X/.7 8 /.qXqXrXrXqXqXqXrXqXrXqXrXrXqXrXqXrXqXrXrXqXqXqXrXqXqXrXqXrXqXqXqXrXrXqXrXrXrXqXrXrXqXrXrXqXqXqXrXqXqXrXqXrXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXrXqXqXqXrXqXqXrXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXqXrXqXrXqXqXqXrXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXrXqXrXqXqXrXqXqXqXqXrXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXqXrXqXqXqXqXrXqXrXqXqXrXqXqXqXqXqXqXrXrXqXqXqXqXqXqXrXrXqXqXqXrXqXrXrXqXrXqXrXqXqXrXqXqXqXrXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXrXqXqXqXqXrXqXqXqXrXqXrXqXrXrXqXrXqXrXqXqXqXrXqXrXqXqX", | |||
"qXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXrXqXqXqXqXqXrXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXrX0XrXrXqX0XrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqX0XrXqXqXqXqXqXqXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXrXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqX0XqXqXG.8 8 G.qX0XqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqX0XqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXrXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqX", | |||
"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXrX0X0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXZ.2 . > Z.rX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX", | |||
"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXrX0XqXqXqXqXqXqXqXqXqX0XrX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XZ.: : Z.9XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqX", | |||
"qXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqX0XqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XrXqXqXqXqXqXqXqXqX0XrX0XrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqX0XqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqX0Xm.% % m.0XqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqX", | |||
"0X0XqXqX0XqXqXqX0XqX0XqXqX0XqXqXqXqXqX0XqX0X0X0X0XqX0XqXqX0XqXqXqX0XqXqX0XqXqXqXqX0X0XqXqXqX0XqX0XqXqX0X0XqXqXqX0XqXqXqX0XqXqX0XqX0XqXqXqX0X0XqXqX0X0XqX0XqXqXqXqXqX0XqX0XqX0XqX0XqXqX0XrX0X0XrXqXqXqXqX0XqXqXqX0XqX0XqXqXqX0XqX0XqX0X0X0XqX0X0XqX0XqXqXqX0XqX0X0X0XqX0X0XqX0XqXqX0X0XqX0XqXqXqXqXqXqX0XqX0X0XqXqX0XqX0XqX0XqXqX0X0XqX0XqX0XqXqX0XqX0XqXqXqX0XqX0XqX0XqXqX0XqX0XqXqXqX0X0XqXqXqX0XqX0XqXqX0XqX0XqX0X0XqX0XqXqX0XqXqX0XqXqX0X0XqX0X0XqX0X0XqXqXqX0XqXqXqXqX0XqXqX0XqX0X0X0XqX0XqX0XqXqX0XqXqXqX9XqXqX9Xb.% : b.6XqXqXqX0XqXqX0XqX0XqXqXqXqX0X0XqX0XqXqX0X0XqXqXqX0XqX0XqXqX0XqXqX0XqXqX0XqX0XqXqXqXqXqX0X0XqXqX0X0XqX0X0XqX0X0XqXqXqXqXqX0X0XqX0XqX0X0XqXqXqXqXqXqXqX0XqXqXqXqXqX0XqX0XqXqX0XqX0X0XqX8XqXqXqXqXqXqXqX0XqXqX0XqXqX0XqXqX0XqXqXqX0XqX0X0XqXqX0XqX0XqX0XqXqX0XqXqXqXqXqXqXqXqXqX0XqXqXqX0XqX0XqXqXqX0XqXqXqX0XqXqXqXqX0XqXqX0X0X0X0XqXqXqXqXqXqX0X0XqXqXqXqX0XqXqXqX0X0XqXqX0X0X0XqX0XqXqXqX0XqXqXqX0XqX0XqXqX0X0XqXqX0XqXqXqX0X0XqXqXqX0XqX0X0XqX0XqXqX0XqXqXqX0XqXqX0XqXqXqX0X0XqX0XqX0XqX0XqXqXqX0XqX0XqXqXqXqXqXqXqX", | |||
"0XqX0XqX0XqX0X0XqX0X0X0XqX0XqXqX0X0X0XqXqX0X0X0X0X0XqX0X0XqX0X0X0X0X0X0X0X0X0X0X0XqXqXqX0XqX0XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0XqX0XqX0X0X0X0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0XqX0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0XqX0X0X0XqX0XqX0X0X0XrX0X0X0XqXqX0X0X0XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0X0X0X0X8XqX0X0X0XqX0XqX0X0XqX0X0XqX0XqX0X0XqX0X0XqX0X0X0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0X0X0XqX0X0X0XqX0X0XqX0X0XqX0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0XqX0X0XqX0X0X0XqXqXqX8XqX8XqX0XqX0X0X0XqXqX0X0X0XqX0XqX0X0X0XqX0X0X0X0X0X6Xb.# + b.9XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0X0XqX0XqX0X0X0X0X0XqX0X0X0XqX0X0XqX0X0X0XqX0XqX0X0XqX0X0X0X0X0XqX0XqX0X0X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0XqX0X0XqX0XqXqXqX8X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0XqX0X0X0XqXqX0X0X0X0X0X0XqX0X0X8XqXqX8XqX8X0X0X0X0X0XqX0X0X0X0X0XqX0X0X0XqX0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0XqX0X0XqXqX0X0X0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0XqX0XqX0X0X0XqX0X0XqX0X0X0X0XqX0X0X0XqX0X0XqX0X0X0X0X0X0X0X0X0XqXqX0X0X0X0X0XqX0X0XqX0X0XqXqXqX0XqX0XqX0X0X0X0X0X0X0X0X", | |||
"0X0XqX0X0X0X0XqX0X0X0X0XqXqX0X0X0XqX0XqX0X0X0X0XqX0X0X0X0X0XqX0XqX0X0X0XqX0XqX0XqX0XqX0XqX0X8XqXqX0X0XqX0X0X0X0X0X0X0X0XqX0XqX0X0X0X0XqX0XqX0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0XqX0X0XqX0XqX0XqXqX0X0X0X0XqX0X0X0X0XqX0X0X0X0XqX0X0X0X0X0XqX0X0X0X0X0X0XqX0X0X0X0XqX0X0XqX0X0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0X0XqX0X0X0XqX8XqXqX0XqX0XqX0X0X0XqX0X0X0X0X0X0X0X0X0XqX0X0X0XqX0X0X0XqX0X0X0X0XqX0X0XqX0XqX0XqX0XqX0X0X0XqX0X0X0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0X0XqX0XqX0X0X0X0XqX0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X6XS S |.0X0X0XqX0XqX0X0X0X0X0X0X0X0X0X0XqX0X0XqX0X0XqX0X0X0X0X0XqX0X0X0XqX0XqX0X0X0XqX0X0XqX0X0X0XqX0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0XqX0X0X0X0X0XqX0X0X0XqX0X0X0X0X0X0X0X0X0XqX0XqX0XqXqX0X0XqX0X0X0X0X0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0X0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0X0XqXqX0XqX0X0X0X0X0XqX0X0XqX", | |||
"0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8XqXqX8XqXqX8XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX8XqX0X8X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X7X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8XqX0X0X0X0X0X0X0X0X0X0X", | |||
"0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X8X8X0X8X8XqX8X0X0X0X8X0X0X0X0XqX0X8X0X8XqX8XqX0X8X8X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X", | |||
"0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X8X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X8X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X8X0X0X0X8X0X8X0X0X8X0X0X0X0X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8XqX8XqX8X0X0X8X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X8X0X8X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X8X0X8X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X8X0X0X8X0X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X0X8X0X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X8X0X8X0X8XqX8XqX0X0X8X0X8X0X0X8X", | |||
"8X0X0X0X8X0X0X8X8X0X0X0X8X0X0X8X0X0X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X8X0X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0XqX8X0X0X8XqX0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X8X0X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X0X8X0X0X0X8X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X8X0X8X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X0X8X0X8X0X0X8X0X0X8X0X0X0X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X8X0X0X0X8X0X0X8X8X0X0X0X0X0X0X8X0X0X8X0X8X0X8X0X0X8X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X8XqX0X0X8X0X", | |||
"8X8X8X0X8X8X0X0X0X0X8X0X0X8X8X0X8X0X8X8X8X0X8X0X0X8X0X8X8X8X8X0X8X8X0X8X8X0X0X8X8XqX8X0X8X8X8X8X8X8X8XqX0X8X8X0X8X8X0X0X8X0X0X8X0X8X0X8X8X0X8X8X8X8X0X0X0X8X0X8X0X0X8X8X8X0X8X8X0X8X8X8X8X0X8X8X8X8X8X0X0X8X8X0X8X8X8X8X8X0X0X8X0X0X0X8X8X8X8X8X8X0X0X0X0X8X8X0X8X0X0X0X8X8X8X0X0X0X8X0X8X8X0X8X8X0X8X8X8X0X7X0X8X8X0X8X8X8X8X0X8X8X0X8X8X8XqX8X8X0X8X0X8X8X8X8X0X8X8X0X0X8X8X0X8X8X0X0X8X8X8X0X8X0X0X8X8X0X8X8X0X8X0X8X8X8X8X0X8X8X0X0X8X0X0X8X8X0X8X0X8X0X8X0X0X8X8X0X8X0X0X8X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X0X0X8X0X0X8X0X0X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X0X8X8X0X0X8X8X0X8X8X0X8X0X8X0X8X8X0X8X0X8X0X8X8X0X0X8X0X0X8X8X0X8X8X0X8X0X8X8X8X8X8X0X8X0X8X0X0X8X0X0X0X8X8X0X8X0X8X0X0X0X8X8X0X8X0X0X8X0X8X0X8X8X8X0X8X8X8X8X0X0X8X0X0X8X8X8X0X0X8X8X8X0X8X0X8X0X0X0X0X8X8X0X8X0X0X8X0X8X8X0X8X0X8X8X0X8X8X0X8X0X0X8X8X0X0X8X8X8X8X0X8X0X0X8X8X0X8X0X8X8X0X8X8X0X8X0X0X8X8X0X8X0X0X8X0X8X8X0X8X8X0X8X8X0X8X0X0X8X0X8X8X0X0X8X0X0X0X0X8X0X8X8X8X0X0X0X0X8X0X8X0X0X8X0X0X8X8X0X0X0X8X8X8X0X8X0X8X0X8X0X8X0X8X0X8X0X0X8X8X0X8X8X0X8X8X8X0X8X0X8X0X8X", | |||
"8X0X8X8X8X0X8X8X8X8X0X8X8X8X8X0X0X8X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X9X8X0X8X0X8X8X8X8X8X8X8X8X8X0X8X0X8X8X8X8X0X8X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X0X8X8X8X0X8X8X0X8X8X8X8X8X0X8X8X8X0X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X8X7X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X0X8X0X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X8X0X8X8X8X0X8X8X0X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X0X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X0X8X8X0X8X8X0X8X8X0X0X8X8X8X0X8X8X0X8X8X8X8X0X8X0X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X0X8X8X8X8X0X8X0X8X8X8X8X0X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X0X8X0X8X0X8X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X0X8X8X0X8X0X8X8X8X8X0X8X8X8X8X0X8X8X0X8X8X8X8X8X8X8X0X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X8X8X8X0X8X0X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X0X8X8X8X0X8X8X0X8X0X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X8X8X8X8X8X", | |||
"8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X0X7X8X8X0X8X8X8X8X8X8X7X0X8X8X8X8X8X0X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8XoX0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X", | |||
"8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X7X8X8X8X8X7XoX8X8X8X8XoX8X8X8X8X8X8X8X7X8X8X7X8X8X7X7X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X7X8X8X7X8X8X7X8X8X7X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X7X8X8X8X7X8X7X8X8X7X8X8X8X8X8X8X7X8X8X7X0X7X0X7X8X8X8X8X8X8X8X0X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8XoX8X8X8X8X8X8XoX8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X8X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X0X8X8X8X8X8X8XoX8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X7X8X8X8X8X7X8X8X8X8X7X8X8X7X8XoX8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X7X8X8X7X8X8X8X7X0X7X0X7X0X7X7X0X0X7X7X0X7X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X", | |||
"8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X7X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X7X8X8X8X8X8X7X8X7X0X7X7X0X8X7X8X8X7X0X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X7X8X8X7X8X8X7X7X8X8X8X8X8X8XoX8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X7X7X8X8X0X0X8X0XoXoX8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X0X0X7X7X0X7X7X0X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8XoX8X", | |||
"7X8X7X8X7X8X8X8X7X8X8X8X7X8X7X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X7X7X8X7X8X8X7X8X8X7X8X8X8X8X7X7X8X7X8X7X8X8X8X8X8X8X8X8X7X7X8X8X7X7X8X7X7X8X8X7X7X7X8X7X8X8X7X8X7X7X8X7X7X7X7X7X8X8X7X7X8X7X7X7X8X8X8X7X8X7X8X8X8X8X8X7X8X8X7X7X8X7X7X7X7X8X8X8X7X8X8X8X7X7X7X8X7X8X7X7X8X0X7X7X8X7X7X8X8X7X8X8X7X7X0X7X8X8X8X7X8X7X8X7X8X7X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X8X8X8X7X8X8X7X8X7X7X7X8X7X8X8X7X8X7X8XoX8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X7X8X7X7X7X8X7X8X8X7X7X8X7X7X7X8X7X8X7X7X7X8X8X8X7X8X7X7X8X7X7X7X7X7X8X8X7X8X7X8X7X8X7X7X7X8X8X7X8X8X7X7X7X8X7X7X8X8X8X7X7X7X7X8X7X8X7X7X8X8X8X8X7X8X8X7X8XoX0XoXoX0XoX8XoX8X8X8X8X8X8X8X7X8X7X7X8X8X8X7X7X8X7X7X8X8X8X7X7X8X8X7X8X7X7X7X7X8X8X7X8X7X7X7X7X8X8X7X8X7X7X7X7X7X8X8X8X8X7X8X8X8X8X8XoX8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X7X8X7X7X8X8X7X8X8X7X7X7X7X8X7X8X8X7X7X8X7X8X7X7X7X7X8X8X7X7X8X8X8X8X7X8X7X8X7X7X8X8X7X8X8X8X7X8X8X7X7X8X8X7X7X7X7X8X8X8X7X8X8X8X7X8X8X7X8X8X7X7X8X8X7X7X8X7X8X8X7X8X7X8X7X8X8X8X7X8X7X8X7X8X7X8X7X0X7X7X7X7X7X7X8X7X7X8X8X8X7X8X7X8X8X7X8X8X7X8X8X7X7X8X7X8X8X8X8X7X8X7X8X8X8X8X8X8X8X8X", | |||
"7X7X8X7X7X7X7X7X7X7X7X7X8X7X7X7X8X7X7X7X7X7XoX8X8XoXoX8X8XoX8X8X7X8X7X7X8X7X7X7X7X7X7X7X7X7X7X7X8XoX8X7X8XoX7X7XoX8XoX8X7X8X8XoX8X7X7X7X7X8X7X7X8X7X8X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X9X7X8XoX8XoXoX8XoX8XoXoX8X8X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X8X7X8X7X7X8X8XoX8X8XoX8XoXoX8XoX8X8XoXoX8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X8X7X8X8XoX8X0XoX8X8XoX8XoX8X8XoX8XoX7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X7X7X7X7X8XoX8XoX8XoX8XoXoX8XoX8X8XoXoX8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X8X7X7X7X7X7X7X7X8X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X0X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X8XoX7X7X8X7X7X7X7X7XoX8XoX8X8XoX", | |||
"7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoXoX8XoX8XoX8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8XoX8X8XoX8XoX8X8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8XoXoX8X8XoX8XoX8XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8XoX8XoX8XoX8XoX8XoX8X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8X8XoX8XoX8X8XoX8XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X", | |||
"7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X8X8XoX8X8XoXoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8XoX8XoX8XoXoX8XoX8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8X8XoX8XoX8XoX8X8X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X0XoX8XoXoX8XoX8XoX8XoX8XoX8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8XoX8X8XoX8XoX8X8X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X", | |||
"7X7X7X7X7XoXoX7X7XoX7X7X7X7X7X7X7X7XoX7XoX7X8XoXoX8X8XoXoX8XoX8X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX8XoX7X7X7XoX7XoX7X7XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X.X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXXXX7X7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7XoX7X7X7XoXoX8X8XoXoX8X8X8X8XoXoXoX7XoX8XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8XoXoX8XoX8XoX8XoXoXoXoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoXoX8XoX8XoXoXoX8XoX8XoX8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoXoX8XoX8X8XoX8XoX8XoXoXoXoX8X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7XXX7X7X7X7X7X7X7XXXXX7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7X7X7XXX7XXXXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7XoX7X7X7X7X7XoX7XoX7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7XoX7X7X7X7X7XoX7XoX7X7X7X7X7XoX7X7X7XoX7X7X7XoX7XoX7X7X7XoX8XoX8X", | |||
"oXoX7XoX7XoX7X7XoX7XoX7XoX7XoXoX7XoX7X7X7XoXoX7XoXoX7XoXoX8XoXoXoX7XoX7X7XoXoX7XoX7XoXoX7XoXoX7X7XoX7XoX7XoX7X7X7XoX7XoX7XoXoXoXoX7XoXoX7XoXoX7XoXoX7XoXoX7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X.X7XXX7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7XXX7X7XXX7XXX7X7X7X7X7XXX7X7X7X7XoX7XoX7XoXoX7XoX7XoXoX7XoXoX7XoXoX7XoXoXoX7XoXoXoX7X7X7XoXoXoX8XoXoX8XoXoXoXoXoXoX8XoX7X7XoX7X7X7X7X7X7XXX7X7XXX7X7XXX7X7X7XoX8XoXoXoX8XoXoXoX8XoXoX8XoXoXoXoX7XoXoX7XoXoX7X7XoX7XoXoX7XoXoX7X7X7X7X.X7X7X7X7X.X7X7X7X7X7X7XoX7XoX7XoXoXoX7XoX7XoX7XoX7XoX7X7X7X7XoXoX7XoX7X7XoXoX7XoX7X7XoX7X7X7X7X.X7X7X7X7X.X7X7X7X7X7X7XoX8XoX0XoXoXoXoX8X8XoXoXoXoXoX8X7XoX7XoXoX7XoXoX7XoXoX7XoX7X7XoX7X7X7X7XXX7X7XXX7X7X7X7X7X7XXX7X7X7X7X7X7X7XXX7X7XXX7XXX7X7X7X7XoXoX8XoXoXoXoXoXoX8XoXoX8XoXoXoX7XoXoX7XoXoX7XoXoX7XoX7X7XoXoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7XXX7X7X7X7X7X7XXX7X7XXXoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7XXX7X7X7X7XoX7XoX7XoX7XoX7X7X7XoX7X7XoX7X7XoX7X7XoX7X7XoX7XoX7XoX7XoXoXoX7XoXoX7XoX7XoX7X7X7XoXoX7XoX7XoX7X7XoXoX7XoX7X7XoX7XoX7XoX7XoX7X7XoX7X7XoX7XoXoXoX", | |||
"oX7XoX7XoXoX7XoXoXoX7X7XoXoXoXoX7XoX7XoXoXoXoX7XoX8XoXoXoX8X8XoX7XoXoX7XoXoXoXoXoXoX7XoXoXoXoXoXoXoXoX7XoXoXoXoX7XoX7XoXoXoX7XoXoXoX7X7XoXoXoXoX7X7XoXoX7XoXoXoXoXoXoX7XoX7X7XoXoXoXoX7X7XoXoXoX7XXX7XXX7X7XXX7X7X.X7X7XXX7XXX7X7X.X7X.X7X.X7X7X7X7XXXXX7X7X7XXXoXoX7XoXoX7XoXoXoXoXoXoX7XoX7XoXoX7XoX7XoXoXoX7XoX7XoXoXoX7XoX7XoXoXoX7X7XoXoXoX7XoXoXoXoX7X7XoX7X7XXX7XoXoX7X7XoXoX7XoXoXoX7XXXoXoX7XoXoX9XoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X.X.X7X7X.X7X7XXX7X7XXX7X7X7X7XXX7X7X7XXX7X7XXXoXoX7X7XoXoXoXoX7XXXXX7XXX7X7X7XXX7X7X7XXX7X7X7X7X7X7X.X7X7X7X7X7X.X.X7X7X'.7X7X7XoXoX7XoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoX7X7XoXoX7XXXXX7X7X7XXX7X7X7XXX7X7XXX7X7X7X7X7X7X7X'..X7X7X'.7X7XoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoX9XoXoXoXoXXXXX7XXX.X7X7X.X7X7X7X7X.X7X7X'.7XXX7X7XXX7X7X7XXXXX7X7XoX7XoXoX'.7X7X7X.X7X7X7X7X7X7X7X'.7X7X7XoXoX7X7XoXoXoXoX7X7XXX7XoXoX7X7XoXoXoXoX7X7XoXoX7XoXoXoXoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7XoX7XoXoXoXoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7X", | |||
"oXoXoX7XoXoXoXoX7XoXoXoXoX7X7XoX7XoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoX7XoXoXoXoX7XoXoXoX7XoXoX7XoX7XoX7XoXoXoX7XoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7XoX7X7XoXoXoXoXoXoX7X7XoXoXoXoX7X7X7X7XXX7X7XXXXX7X7X7X7X7X.X7X7X7X7X7X7X7X7X7X.X7XXX7X7X7X7XXX7XXXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoX7XoX7XoXoXoXoXoX7XoXoXoX7X7X7XoXoXoXoX7X7XoXoX7X7XoXoXoX7XXX7XXX7X7XoXoXoXXX7XoXoX7XoX7X7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoX8XoXoXoXoXoXoX8XoXoXoXoXoX7X7X7X7X7X7X.X7X7X7XXX7X7XXXXX7X7XXXXX7X7XXX7X7X7XoXoXoXoX7X7XoXXX7X7X7X7X7XXXXX7X7XXXXX7X7XXXXX.X7X7X7X.X7X.X7X7X7X7X7X7X7X7X7XoXoXoXoX9XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXX7X7XoX7X7XoXXXXX7X7XXXXX7X7XXX7X7XXX.X7X.X7X7X7X7X7X7X7X7X7XoXoXoX8XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X7X7X7X7X7X7X7X.X7X7X.X7X7X7X7X7X7XXX7XXX7XXX7X7X7X7XXXoX7XoX7X7X7XXX7X7X7X7X.X7X.X7X7X7X7X7X7X7XoXoXoXoX7X7XoXoXoXXX7X7XoXoXoXoX7X7XoXoXoXoXoXoXoXoX7XoXoXoX7XoX7X7XoXoXoXoX7XoX7XoXoXoXoXoXoXoX7XoX7XoXoXoX7XoX7XoXoXoX9XoXoXoXoXoX7XoXoXoXoXoX7X7XoXoXoXoXoX", | |||
"oXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XXX7XXX7X7XXX7X.X7X.X7X7X7XXX7X7X.X7X7X.X7X7XXX7X7X7XXX7XXX7XoX7XoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X7X7XXXoXoXoXoX7X7XoXoXoXoXXX7XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X.X7X7X7X7X7X7X7XXX7XXX7X7XXX7X7X7XXX7X7XXXXX7XoXoXoXoXoX7XoXoX7XXX7XXXXX7X7X7XXX7XXX7XXX7XXX7X7X7X7X.X7X7X.X7X7X7X7X7X7X7X7X7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoX7XXXoXoXoXoX7XoX7XXX7XXX7XXX7XXX7X7XXX7X7X7X.X7X7X.X7X7X7X7X7X7XoXoXoXoXoXoXoX7XoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XXX7X.X7X7X7X7X7X7X7X7X7X7X7X7XXXXX7X7XXX7X7XXX7XXX7XoXoXoXoX7X7X7X7X7X7X7X7X7X7X.X.X7X.X'.7XoXoXoXoXoXoXoXoX7XoX7XXXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoX7XoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X", | |||
"oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XXX7XXXXX7XXX7X7X.X7X7X.X7X.X7X.X7X7X.X7X7X7X.X7XXXXXXX7XXX7XXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXXXX7XoXoXoXoXXXoXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX.X7X7X.X.X.X7X.XXX7XXX7XXXXX7XXXXXXX7XXXXX7XXXXXoXoXoXoXoXXXoXoXXX7XoXXX7XXXXXXX7XXX7XXX7XXX7XXX.X7X.X7X.X7X7X7X'.7X7X.X.X7X7X'.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XoXoXoXoXoXoXXX7XXX7XXX7XXX7XXXXX7XXX.X7X7X7X7X7X7X.X.X7X7X'.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XXX7XXX7X7X.X.X7X.X.X7X7X7X'.7XXX7XXX7XXX7XXXXX7XXX7XXXoXoXoXoX.X7X7X'..X7X.X.X.X7X7X7X7X7X7X7XoXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX", | |||
"oXoXoXoXoX.XoXoXoXoXXXXXXXoXoXoXoXoXoXoXXXXXoXoXoXoXoXoXoXoX.XoXoXXXoXoXXXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXXXoXXXoXXXoXXXoXXXXXoXoXoXoXoXoXXX7XXX7XoXXXoXoXXXoXoXoXXXoXoXoXoXoXXXoX.XoXoXXXoXoXXXXXXXXXXX7X7X7XXXXX7XXX.X7X.X7X.X7X7X7X.X7X.X7X.X7X.X7X7XXX7X7X.X7XoXoXoXoXoXXXoXoXoXoXXXoXoXXXXXoXoXXXXXoXoXoXoXXXoXXXoXoXoXoXoXXXXXXXoXoXXXoXoXXXoXoXXXoXXXoXXXoXXXXXoXoXXXoXoXoXXXoXoXoXXXoXXXoXoXoXXXXXoXoXoXXXoXoXoXoXXXoXXXoXoXoXoXXXoXXXoXoXoXoXoXoXoXoXXXoX.X7X.X7X7X7X.X7X7X.X7XXX7X.X7X.XXX7X7XXX7XXX7XXXXXoXoXoXoXXXXXXXXXoXXXoXXXXX7X7XXXXXXXXXXXXX7X7X7X.X.X7X.X7X7X.X.X7X.X7X7X.X7X.XXXoXoXXXoXoXXXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXXXXXoXoXoXoXXXoXoXoXXXoXXXoXoXXX7XoXXXXX7XXXXX7XXXXXXX7XXX7X'.7X7X.X.X7X.X7X7X.X7X.XoXoXXXoXXXoXoXoXoXoXoXoXoXXXoXXXoXoXoXoXXXoXoXoXoXoXoXoXXXoXoXoX'.7X7X7X7X.X.X7X7X.X7X7X.X7X.X7XXXXX7XXXXXXX.X7XXXXXXXoXoXXXXXoX7X.X.X7X.X7X7X7X7X.X.X7X.X7X.X7XoX.XoXoXoXoXoXoXoXXXoXoXoXXXoXXXoXoXoXoXoXoXoXoXXXoXoXoXXXoXoXXXoXoX.XoXoXoXoXoXoXoXXXXXoXoXoXXXoXoXoXoXoXoXoX.XoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX", | |||
"oX.XoXoXoXoXoXoXXXoXoXoXoXoXXXoXoX.XoXoXoXoXoXXX.XoXoX.XXXoXoXoXoXoXXXoXoXoXXXoXoXoXoXXXXXoXXXoXoXXXXXoXoXXXoXoXoXoXoXoXoXoXoXXXoXXXoXXXXXXXXXXXoXoXXXoXoXXXXXoXoXXXoXXXXXoXoXoXoXoXoXoXXXoXoXoX7X7XXXXXXXXXXX7X.X7X7X.X7X.X7X.X.X.X7X.X7X.X7X.X7X.X.X7X.X.X7X.XXXXXoXXXoXoXXXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX.XXXXXoXoXoXoXoXXXoXoXXXoXXXoXoXXXXX7X7XXXXX7XXXoXXXoXoXXXoXXXoXXXoXoXXXoXXXoXoXoXoXXXoXXXoXoXXXoXXXoXoXoXoXoXoXoXoXoXoXXXoXoXoXoXXXoXoXoX7X.X7X.X.X7X7X.X.X7X7XXX7X7X.X7XXXXXXXXXXXXX7XXXoXoXXXoXoXoXoX7X7XXXXXoX7XXXXXXXXX7XXX7X7X.XXXXX.X7X7X7X7X.X.X7X7X.X7X.X.X7X7X7XoXoXXXoXoXoXoXXXoXoXXXoXXXoXoXoXoXoXoXXXXXoXoXoXoXoXoXoXoXoXoXXXoXoXXXoXXX7XXXXX7XXXXXXXXX7XXX7XXXXXXX7X7X7X7X7X7X.X7X7X.X7X7X7XXXoXoXXXoXoXXXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXXXoX7X7X'.7X.X7X7X7X.X7X.X.X7X.X7X.X7XXXXXXXXX7X7X.X7XXXoXXXoXoXoXoX7X7X7X.X'.7X.X7X.X7X7X.X7X.X7X.XoXoXoXoXXXoXXXoXoXoXXXoXoXoXoXXXoXoX.XoX.XoX.XoXoXoXXXoXoXXXoXoX.XoXoXoXXX7XoX.XoXXXoXoXXXXXoXoX.XoXoXoX.XoXoXoXoX.XoXoXoXoXXXoXoXoX.XoX.XoXoXoXoX.XoXoXoX.XoXoX", | |||
"oX.X.XoXoX.X.XoXXXoXoXXXXXXX.XoXoX.XoXXXoXoXoX.XoXoX.XoXoX.XoXoXoXoXXXoXoXXXoXXXoXoXXXoXoXoXXXXXXXoXXXoXXXoXXXoXXXoXoXXXoXXXXXXX7XXXXXXXXX7X7XXX.XoXoXoXXXoXXXoXoXXXXXoXoXoXoXXXoXoX.XoXXXoXXXXX'.7XXX7XXX7XXXXX.X7X7X.X.X7X.X7X.X7X.X7X7X.X.X7X.X7X7X.X.X7X.X7XXXoXoXoXXXoXXXoXoXoXoXXX.XoXoXXXXXXXoXXXoXXXXXXXoXXX.XoXoX.XXXoXoXXXXXXXoXXXXXoXoXXXXXoXXXXXXXXXXXoXXXoXoXXXoXoXXXoXoXoXXXoXXXoXXXoXoXoXoXXXXXXX.XoXoXoXXXXXoXXXoX.X.XoXoXXXXXoXoXXXXXoXXXoXXXXX.X7X.X7X7X.X.X7X7X.X.X7XXX.X7X.XXXXXXX7XXXXXXXXXoXXXoXXXXXXXoXXXXXoXXXoXXXXXXXXXXX7XXXXX.X7X.X7X7X7X.X.X.X.X7X.X.X7X.X7X.X7X.X.XoXXXXXoXXXoXXXXXoXoXXXoXXXoXXXoXoXoXXXoXXXoXoXoXXXoXoXXXoXXXoXXXXXoXXXoXXXXXXX7XXXXX7XXXXXXXXX7XXX7XXXXX'.7X'.'..X7X7X.X.X7X'.7XXXoXoXXXXXXXXXXXXXoXXX.X.XoXoXoXXXoXXXoXoXXXoXXXoXoXXXoXoXXXoXXX'.'.7X7X7X7X.X7X7X.X7X7X7X7X.X7X7XXXXXXX7XXX.X7XXXXXXX7XXXoXXXoX'.'.7X7X7X7X.X.X7X'..X7X7X.X.X7XoXXXoXoXXXoXXXXX.XoXXXoXXXXXoXoX.XoX.XoXoXoXoXoXoXXXoXXXXXoXXXoXoXoXoXoXoXoXoX.XoXoXXXoXXXoXoXXXoXoX.XoXoXoX.XoX.XoX.XoXXXoXoXXX.XoXoXoXoXoX.XoX.XoX.XoXoXoX.XoX", | |||
".XoXoX.XoXoXoX.XXXXXXXXXoXXXoXXXXXoXXXXX.XXXoXXXoX.XoXoX.XoX.XoX.X.XoX.XXXoX.XoX.X.XoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXoX.X.XoXXXXXXXXX.XoXXX.X.XoX.XoX.XXXoX.XXXoXXXXX'.7XXXXXXXXXXXXX.X7X.X7X.X.X7X.X7X.X7X.X.X7X7X'.XXXXXXXX7X.X7X.XXXXXXXXXXXXXXXXX.XoX.XoXXXXXXXoXXXXXXXoX.XoXXXXXXXXXoXoX.XoXXXXXXXoXXXXXXXXXXXXXXXXXoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoX.X.XoXXXoX.XoXXXoXXXXXXXXXXXXXXXXXoX.XXXoXXXXX.X.X7X7X'.7X7X'..X7X.X.X7X.X.X7XXXXX.X7XXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXX7XXXXXXXXXXXXXXX7XXXXXXX'.7X.X7X.X7X.X7X.X.X7X.X7X.X.X7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XoX.XoXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7X7X7X7X7X'..X.X7X.X.X7XXXXXXXoXXXXXXXXXXXXXXXoXoX.X.XoXXXXXXXXXXXoX.XoX.X.XoX.XXXXXXXXX7X7X7X.X'.7X7X'.7X.X'.7X.X'.7X.XXXXXXXXXXXXX7X.XXXXXXXXXXXXXXXXX7X7X7X.X7X.X.X7X7X7X7X.X.X7X7X'.XXoX.X.XoX.XXXXXoXXXXXXXXXXXXXXX.XoXoXoX.X.XoX.XXXXXXXXXXXXXXXXXoX.XXXXX.XXXXXoXXXXXXXXXXXXXXXXX.X.XoX.XXXXXoXXXoXXXoX.XXXXXXXXXoX.X.XoX.XoXoX.X.XoXoXoX.X.XoX.X", | |||
"oXoX.XoXXX.XXXXXXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXXXXXXXoX.XoX.XXXXXXXXXXXXXXXXXXX.XoXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXX.XXXXXXXoX.XoXXXXXXXXXXX7X7XXXXXXXXX XXXXXXXXXXX.X.X7X7X'.7X.X.X.X7X.X.X.XXXXXXX.X7X.X.XXXXXXXXXXXXX.XXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXoXXX.XoX.XXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXX.XXXXXXXXXXX.XXXXXXXXXXX7X7X'.7XXXXXXXXXXXXXXX.X7X X.X.XXXXXXXXXXX.XXXXXXXXX.XXXXX.XXXXXXXXXXXXXXXXXXXXX.X.X7X7X.X.XXXXX7X.X.X.X7X.X.X X7X'.7X.X7X7X'.7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XoXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.XXX.X.X7X7X.XXX7X7X.X7X'.7X.X.X7X7X'..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XoX.XXXXXXXXXXXXXXXXXXX.XXX.X.X.X.X7X.X7X7X.X.X.X.X7X'.7X.X.X.XXXXXXXXXXX7X.XXXXXXXXXXXXX|..X7X.X7X.X7X.X.X.X'.7X.X.X7X7X'.7X.XXXXXXXXXXXXXXXXXXXXX.X.XXXXXXX.XoX.XoXXXXXXX.XXXXXXXXXXX.XXXXX.XXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXoX.XXXXX.XXXXXXXXXXXXX.XXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXX.XXXXX", | |||
".X.X.X.XXXXXXXXXXXXXXX.XXXXX.X.X.XXXXXXXXXXX.XXXXXXXXXXX.XoX.XoXXXXX.XoXXXXXXXXXXXXX.XXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXX.XXX.XXXXXXXXXXX.XXXXXXXXXXX.XoXXXXXoX.XXXXX.XoX.XXXoX.XXXXX7X'.XXXXXXXX7X XXXXXXXXX.X7X.X.X7X.X'.7XXXXX.X7X.X7X'.XX.X7X.X7XXXXXXXXXXXXXXXXXXXXX.XXXXXXXoX.XXXXXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XoX.XoXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXXoXXXXXXXXXXXXXXXXXXXXXXX.X.X7X.XXXXXXXXX.XXXXX7X.X.X7X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXX7X.X.X.X7X.X.X|..X.X7X7XXX.X7X7X7X7X'.7X.X.X7X.XXXXXXX.XXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXX.X.X.X.X X.X.X.X.X7X.X7X7X'..X7XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX7X7X.X.X.X.X X.X'.7X.X7X7X.X'.7XXXXXXXXXXXXX.X.XXXXXXXXXXXXX.X7X.X.X.X.X.X X7X7X7X.X7X.X.X.X7X.XXXoXXXXXXXXXXXXXXXXXXXoX.XXXXXXXoX.XoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXX.XoXXXXX", | |||
"XXXXoX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.X.XXX.XXXXX.XXXXX.XXXXXXX.XXXXX.XXXXXXX.XXXXXXX.XXX.XXXXXXX.XXXXX.XXXXX.X.XXXXX.XXXXXXX.X.XXXXXXX.XXXXXXX.XXXXXXXXX.XXX.XXXXX.XXXXX.X.XoX.X.XXXXX7X'.'.7X.X7X'.7X7X.XXX X.X.X.X.X7X'.7X.XXXXXXXXXXXXX7XXX X.X.X.XXXXX.XXXXXXXXXXXXXXX.X.XoX.X.XoX.XXXXX.XoX.XXX.X.XXXXXXXXXXXXXXX.XXX.XXXXXXX.XXXXXXXXXXX.XXX.XXX.XXX.XoXoX.XXX.X.XXXXXXX.XXXXX.XXXXXXXXX.XXX.XXX.XXXXXXXXX.XXXXXXX.XXXXXXX.X.XXXXXXXXXXXXXXXXX.X7X'.'.7XXX.X.XXX X7X XXX.X7X7X.X.XXXXX.X.XXXXX.XXXXX.XXXXXXXXXXXXXXX.XXXXX.X.XXX7X.X.X.X'..X7X.X.X.X.X.X X.X7X X'..X7X.XXXXX'.7XXXXXXX.X.XXXXXXXXX.XXXXX.XXXXX.X.XXX.XXX.XXXXX.XXXXX.XXXXX.XXXXXXXXX.XXXXX.X.XXX.X|..X.X.X.XXXXX.X7X.X7X.X7X.X7X7X.X.X'.XXXX7X'.XXXXXXXXXX.XXXXX.X.XXX.X.XXXXX.X.XXXXXoX.XXX.XXXXX.XXX.X.X.XXXXX.X.XXX X7X X.X7X7X7X'..X.X7X7X.XXXXXXXXX X7X X7X.XXXXX.X.XXX.X.X.X.X.X7X.X.X.X.X'..X7X.X'.7X'.7XXX.XXXXX.XXXXX.X.XXXXX.X.XXXXX.XXXXX.X.XXXXX.XXXXXXX.XXXXXXXXXXXXX.XXX.X.XXX.XXXXXXX.XXXXXXXXX.X.XXXXXXX.XXX.XXXXX.XXXXX.XXXXX.XXX.XXXXXXXXXXXXXXX.XoXXXXX.XXXXX", | |||
".XoX.X.X.XXX.X.X.XXX.X.XXX.X.X.X.X.XXX.X.XXX.XXXXXXX.X.X.X.X.X.XXX.X.X.XXX.XXXXX.XXX.X.XXX.X.XXXXX.X.XXX.XXX.X.XXX.X.XXXXXXX.XXX.XXX.XXX.X.X.XXXXX.X.XXX.XXX.X.X.XXX.XoX.X.XXX.XXX.X.X.X.XXX.XoX.X7X'.7X XXX7X.X.X XXXXX7X.X.X7X.X7X.X.X.XXX.X.X XXX XXX7X.X.X7X.X.XXX.X.XXX.X.X.X.XXX.X.XXX.X.XoX.X.X.X.XXX.X.XXXXX.X.XXX.X.X.X.XXXXX.X.X.XXX.X.XXX.X.X.XXXXX.XXX.X.XoX.X.X.XXXXX.X.X.X.XXX.XXX.XXX.X.X.XXXXX.X.XXX.XXX.XXX.XXX.XXX.XXX.XXXXX.X.XXX.X.XXX.X.XXX.X7X.X.X.XXXXX.X.X.X XXXXX.X XXXXX.XXXXXXXXX.XXX.X.XXX.X.XXX.X.X.XXXXX.X.XXXXX.X.X.X.X7X7X.X'.7X7X.X.X.X7X.X.XXX7X X'.7XXXXX.X.X.XXX.XXXXX.X.X.X.XXX.X.XXX.XXX.X.XXXXX.XXXXX.XXX.X.XXX.XXXXX.XXXXX.XXX.X.XXXXX.X.X7X.X.XXXXX.XXX7X'..X.X.X.X.X X'.7X.X7XXXXX X7X.XXX.X.X.XXXXX.XXXXXXX.XXXXXXX.XXX.X.X.XXXXX.X.XXXXXXX.XXXXX.XXX.X.X7X.X.X.X X7X.X.X7X.X.X'.7X.XXX.X.X.X.X.X.X.XXX.X.XXXXX.X.X7X.X7X.X.X.X7X.X7X7X.X'.7X7X.X.X.XXX.X.X.X.XXXXXXXXX.XXX.XXX.XXXXX.X.XXX.X.XXX.XXX.X.XXX.X.XXX.X.X.XXX.XXXXX.XXX.X.X.XXX.X.XXX.XXX.XoX.XXXXX.XXX.X.X.X.X.XXX.X.XXX.XXX.XXX.X.X.XXX.XXX.X.XXXXX.XXX", | |||
".X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.XXX.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.X7X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.X.X.X.X.X.XXX.XXX.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X'.7X.X.X.X.X.X.X.X.X.X.X X7X X.X.X.XXX.X.X.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.X7X.X.X.X7X.X.X.X.X.X.X.X7X.X.X.X.X'.7X XXX.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X XXX.X.X.X.X.X.X.XXX.X.XXX.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X X7X.X.XXX7X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.XXX", | |||
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X XXX.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX'. XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X.X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X", | |||
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.XXX.X.X.X.X.X7X.X.X.X.X.X7X.X7X.X.X.X.X.X.X.X.X.X7X.X.X.X7XXX.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X7X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X XXX.X.X7X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X", | |||
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X}..X.X}..X.X.X.X.X'.'.7X.X.X.X'..X'.'..X.X.X.X'..X.X.X'..X.X.X'. X XXX X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X.X}..X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X X.X.X.X.X.X.X.X.X'.'.7X.X.X.X'.XX XXX X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X XXX.X.X.X.X.X.X X.X.X X X.X.X.X.X.X.X X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X X.X}..X.X X.X.X.X.X.X.X.X'..X.X.X.X'..X.X.X.X X.X.X.X.X.X.X.X X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.XXX.X X XXX.X'..X.X.X.X.X.X X.X.X.X.X.XXX'..X.X.X.X.X.X.X'.'..X.X.X X.X.X.X X X.X.X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X X.X.X X.X.X.X X.X", | |||
" X.X X.X X.X.X X X.X.X}.}..X.X.X.X X X.X.X.X X.X.X.X.X.X.X.X}..X.X X.X X.X.X X.X.X.X X.X X.X.X X.X X.X X X.X X.X.X X.X X.X.X X.X.X}..X}..X.X.X.X X.X}..X.X X.X.X X.X.X.X}.}..X.X.X.X.X}..X.X.X.X X.X.X X.X X X.X X.X.X X X.X.X.X.X.X X.X X.X X.X X.X.X X X.X.X X.X X X.X.X.X X.X X.X.X X.X X XXX.X.X X.X X.X X.X.X X X.X}..X.X.X X.X.X X.X.X X X X.X X.X.X X.X X.X.X X.X.X X.X X.X X.X.X X.X X.X X.X X.X.X X.X X.X.X X.X.X X.X.X X X X.X X.X.X X X.X X.X.X X.X X.X.X X.X X.X X.X X.X.X X X.X.X X X.X.X X.X X.X.X.X.X X.X X.X X X X.X X.X.X.X X.X X.X.X.X}.}..X.X.X X.X X.X X.X.X X.X X.X X.X X.X.X.X X X.X X.X.X X.X X.X X X.X X.X.X X.X X.X.X X.X X.X X.X X.X.X.X.X X}. X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X X.X.X X.X X.X.X X.X.X X.X.X X X X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X.X.X.X.X.X.X.X.X.X X X X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X.X}.}..X.X.X.X.X.X}..X.X X.X X.X X.X.X X.X X.X.X}..X.X.X.X}..X X.X.X X.X X.X.X X.X.X X.X X X.X X.X.X X.X X.X.X X.X.X.X.X X X.X X.X.X X X X.X X.X.X X.X X.X.X X X X.X X X.X X.X X.X.X X.X.X X.X", | |||
" X X X X X X X X X X.X.X.X.X}..X X.X X X X X X X X.X}.}.}.}..X.X X X X X X X X X X X X X X X X X}..X X X.X X X X X X X X X X X X.X}..X X.X}..X}. X X X.X X X X X.X}.}..X.X.X.X}.}..X}..X.X}.}..X X X X.X X.X X X X X X.X X.X}.}. X X X X X X X X X X X X X X X X X.X X X X X X X X X X.X X X X X X X X X X X X X X.X X X.X.X}.}. X X X X X X.X X.X X X X X X X X X X X X X X X X.X X X X X X X X.X X X X X X X X X X X X X X X X.X X.X X X X X X.X X X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X X X X X X X X X X.X}.}..X.X.X.X}. X.X X X X X X X X X X X.X X X X X X.X X X X X X X X X.X X.X X X X X X X X X X.X X X X X X X X X.X X.X.X.X X X X X X X X}..X.X}.}. X X X X X X X X X X X X X X X X X X X X X X X.X X.X X X X X X X X X X X X.X X X X X X X X X X.X'..X'.'..X.X'. X.X X.X X X X X X X X X X X X X.X X X X X X X X}..X.X.X.X}.}..X}..X X.X X X X X.X X X X X X X X.X}..X}. X X.X.X X X X.X X X X X X X X.X X.X X X X X X.X X X X X X X X X X.X X X X X X.X X.X X X X X X X X X X.X X.X X X.X X X X X X X X X X X X", | |||
".X X.X X X.X X.X X.X}..X}..X}.}. X X X X X X.X X X X}..X.X.X.X}. X X.X X X X X X.X X X.X X X X.X X.X.X X X X X X X X.X X X X X X.X.X.X}..X X X X.X X X X.X X X.X X X X X.X.X.X}.}..X}..X.X}..X}. X X X X X X X X X.X X X X X.X.X X X X X.X X X X X.X X.X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X.X X X X.X.X X X.X X X X X X X X X X X X.X X X X X X X X X X X X X X.X X X X X X X X X X.X X X X X X X X X X X X X X X X X.X X X X X X X.X X X X X X.X X X X X.X X.X X X X X X X X X X X X X X X X X X.X X X.X X X X.X X X.X X X X X.X.X.X}. X X X X.X X X X.X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X.X X X X X X X X X X.X X X.X X.X}..X}..X}..X X X X X X X.X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X.X X X X X.X.X'..X.X.X.X'. X X X X.X X X X.X X X X X X X X X X X X.X X X X.X X X X.X.X.X.X}. X X}. X}. X X X.X X.X.X X X X.X.X.X}.}.}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X.X X.X X X.X X X.X X X.X.X X X X X X X X.X X X X X X", | |||
" X X X}. X X X X X X X X.X}. X X X X X X X X X X X X X X X X.X}. X X X X X X X X X X}. X X X X X X X}. X X X X X X X X X X X X X}..X}..X X X X X X X X X X X}. X}..X}..X}.}..X}..X}..X}. X X X X X X X X X X X X X}. X X X X}..X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}..X}.}..X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}. X}..X}..X}.}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}. X X X X X X X.X}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X'..X.X.X.X'..X.X X X X X X X X X X X X X X X X X X X X X X X X X}..X}..X}.}.}.}..X X X.X X X X X}. X X}.}. X X X}..X}..X.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}..X}.}. X X}. X X X}. X X X X X X X X X X X X X", | |||
"}. X}. X}. X}.}. X X X X X X}. X}. X X}.}. X X}. X X}. X}.}.}..X X X X X X X X}. X X}. X}. X X X}. X}..X}.}.}. X X X X X X X}. X}.}.}.}.'. X X X X'.}..X}.}.}. X X X}. X}.}.}..X.X}.}..X X X X X X X X}. X}. X}.}. X X}.}.}. X}. X X X}.}. X}.}. X X}. X X}. X X X X}. X X X X X X}. X X X}. X}. X X}. X X X X X}.}. X X X}..X}.}. X X}. X X}. X}. X X X}. X X}. X X X}. X X X X X}. X X X X X X X X}. X}.}.}. X X X X}. X X X X}. X}. X X X}. X}. X X}. X X X X X X X}.}. X}.}. X X}. X X}. X X X}. X}. X}. X}. X X X}. X}. X}. X'.}..X}.}.}. X X X}. X}.}.}..X X}. X}. X X X X X}. X}. X X X}. X X X X}. X}. X X X X X X X X}. X X}. X X}. X X X X X X X}.}. X X X}.}.}.}. X}. X}. X X}..X}.}. X}. X X}.}.}. X X}. X}. X X X X X X X}. X}. X X X X}. X X X X X X X}. X X X X X X X X X}. X X X X X X X'..X'..X}. X}. X X X X X}. X X}. X X X X X X}. X X X}. X}. X}. X X X X X X X.X}.}..X}. X}. X}. X}. X X}..X}.}.}. X}. X X X X X}. X}. X}. X X X}. X}. X X X X X}. X}. X}. X X X}. X}. X X X X X X X X}. X}. X}..X}. X X X}. X}..X}.}.}. X X X X X X}. X}.", | |||
"}. X X}. X X X X'. X}.}.}. X}. X X}.}. X X}.}. X}. X}.}. X}.}.}.}.}.}.}. X}. X}.}. X X}.}. X}.}.}.}. X}..X}. X X}.}.}.}. X}.}. X}. X}..X X X X'. X X}.}.}.}. X X}.}. X X}..X}. X}.}. X}.}.}.}. X X}. X}. X}.}. X X}. X}..X}.}. X X}.}. X X X X X}. X X}.}. X X}. X}.}. X}.}.}.}. X X X}. X}.}. X}. X}.}.}.}.}.}.}. X}.}. X}.}.}. X X}. X X}. X}. X}.}.}. X}. X X X}.}. X X}.}. X X X}.}.}.}.}.}.}. X X}. X.X}. X X}. X}.}.}.}. X X X}. X X}.}. X X}.}. X}.}.}.}. X}.}. X X X X X}. X X}.}. X}. X X X X X X}.}. X X X X}. X}.}. X X X}.}.}.}. X X}.}. X X}..X}. X X}.}. X}.}.}.}.}. X X}. X}.}. X}. X}. X}.}. X}.}.}.}.}. X}.}. X}. X X}.}. X}.}.}.}.}.}. X}. X X X}. X}..X}. X}.}. X X X}.}..X}.}. X X}..X}.}. X X X X}.}.}.}. X X}. X}.}. X}. X}.}. X}.}.}.}.}.}. X}. X}.}.}.}.}.}.}. X X}.}. X}.}.}. X.X'..X'. X X X}.}.}.}.}. X}. X}.}.}.}. X}.}. X X}. X X}. X X X}.}.}.}.}. X}.}.}.}. X X X X X}. X X}.}. X}.}.}..X}. X}.}. X}.}. X X}.}. X X}. X}. X}.}.}. X}. X}. X}.}. X X}.}. X X}.}.}.}.}.}.}.}. X X}.}..X X}.}. X}.}.}.}. X}.}. X X}.}.}.}.}. X X X X", | |||
"}. X X X X}.}.}.}.}. X}. X}. X}. X X X X X X X}.}.}. X}.}. X X X X}.}. X X}.}. X X}.}. X X}.}.}. X}..X}.}. X}. X X}. X}.}. X X}. X}. X X X X X X X}. X}..X}.}.}. X}. X}.}.}. X}.}.}.}. X}. X X X X}.}. X}. X X}.}.}.}..X X}. X}. X}. X}. X}. X}. X X}.}. X X X}.}. X X}.}. X}. X}. X}. X}. X X}.}. X X}. X X X X X}..X}.}.}.}. X}. X}. X X}.}.}.}. X X}. X}. X}.}. X X X}. X X}.}.}. X X X X X}. X}.}. X}.}. X}.}. X}. X}. X}. X}. X X}.}. X X}. X X X X X}. X}. X}. X}. X}. X}. X X}.}. X X X}. X X}. X X}. X}. X}.}. X X}.}. X X}. X}..X}.}.}. X}. X}.}.}. X}. X}.}. X X}.}. X}. X}. X}. X X X}. X X}. X X}. X}. X}. X}. X X}. X}.}. X X}. X}. X}. X X X X}.}.}. X}. X}.}. X X X}. X X X X}.}.}. X.X}.}.}. X}. X X}. X}. X X}.}. X X X X X X}. X}. X X X X X}. X}.}. X X}.}. X X}. X}. X X}.}.}. X X X'. X.X'. X}.}.}.}..X}. X}. X}. X X}. X X}. X X}.}. X X}.}.}.}.}.}. X}. X}. X}.}.}. X}.}.}.}. X}.}. X X X}.}.}. X X}. X X X}.}. X X}.}. X}. X}. X}.}.}.}. X X}. X X}. X}.}. X X}. X}. X}.}. X}. X}. X}.}. X}.}. X X}. X}. X}..X}. X X}. X X}. X}. X X}. X", | |||
"}.}.}. X}. X}.}.}.}.}.}.}. X'. X}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.'. X}. X X}.}.}.}.}.}.}. X X X}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.}.}. X}.}. X}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}..X}.}.}.}.}. X}.}. X}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}. X X X}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}. X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}. X}.}.}.}.}.}.}. X}.}.'. X X.X'. X}. X}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X X}.}.}.}. X}.}. X}.}.}.}.}.}. X X}.}.}.}.}.}. X X}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.", | |||
"}.}.}.}.}.}.}.}.'. X X'. X'. X X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}. X X'. X'. X X'.}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.'.}.}.}. X X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X X}.}. X}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}..X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}. X'.}.}.}.}.}.}.}.}.}.}.}. X}.}.}. X}.}. X X X X X}. X}.}. X X}. X X}.}.}.}.}.}.}.}.}.}.}.}. X'. X}.}.'. X}.}.'. X}.}. X'.}.}.}.}.}.}.}.}.}.}.}.}.}. X'. X X'. X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X'. X'.}.}.}.}.'.}.}.}.}.}.`.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.", | |||
"}.}.}.}.'.}.}.}. X'.'. X'. X'. X}.}.'.}.}.}.}.'.'. X'.}.'.}. X'.}.}.}.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.'. X X'. X'. X'.}.}.}.'.'.}.}.}.}.}.}.}. X'.'. X}.}. X'.'. X X'.}.}.}.}.}.'.}.}. X'.'. X}.}.'. X}.}.}.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.}.}.}.}.}.}.'.}.'.}.}.'.b.v.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.v.b.c.c.c.(.'. X'.}.}.}. X'.}.V.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.C.}.}.}.}.(.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.v.b.c.c.c.c.V.}.'.}.}.}.}.'.}.}. Xv.c.c.c.c.b.%.c.c.c.c.b.%.c.c.c.c.c.c.c.V.'.}.}.'.}.}.}.(.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.V.}.'. X'. X}.'..XP.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.b.c.V.V.V.M.C.C.C.C.L.L.L.P.(.(.).}.'.}.}.}.}.}. X}.'.}.}.'. X'. X'. X X'. X'.'. X'.'. X X}.}.}.'.}.}.}.}.`.}.}.}.'. X'. X X'. X'.'.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.'.'. X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.", | |||
"}.}.'.}.'.}.'.}.'. X X'. X X'.'.}.}.}.}.}.}.}.}. X'. X'. X X'.}.}.}.}.}.}.}.}.}.'.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}. X'.'. X'.'. X X'.}.}.}.}.}.}.'.}.}.}.}.'. X X'. X'.'. X X'.'. X}.}.}.'.}.}.}.'.}.}.'.}.}. X}.'.}.}.}. (.'.}.}.).}.}.'.}.}.}.P. P. X'.}.}.'. X'. X}.O d X}.}.}.}.. % }.}.}.}.'.}.}.}.'.(. V }.}.}.}.}.}.}.V. . : }.}.'.'.}.}. X'.V. : 8 c N $.V.L.).'.}.'. X'.'. X'. X'. X'. X X'.}.}. X'.'.}.}.}.}.}.}.}.}.}.}.}. X'.'. X'.'. X X}.}.}.'.}.}.}.'.}.}.}.}.}.}.}.}.'. X}.'. X'.'. X}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.'.}.'.}.'.}.}.}.}.}.}.}.}.}.'.}.}.'.}.}.}.}.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.", | |||
"}.}.}.'.}.}.}.'. X'.'. X'.'. X'.}.'.'.}.'.'.}.'.'.}.'. X'.'. X'.`.}.}.}.`.}.}.'.}.}.'.}.}.}.'.}.}.'.}.'.}.}.}.}.}.'.}.'.}.'.}.'.'.'. X'.'. X'.'.}.'.}.'.}.'.}.}.'.}.'.'. X'.'. X'. X'.'.'.'. X'.}.}.'.}.'.}.'.}.}.'.}.}.'.'.'.}.}.}.}. L.}.}.}.}.}.'.}.}.'.}.C.. P.'.}.'.}.}.'.}.'.}.+ 8 }.}.}.}.}.6 (.}.'.}.'.}.'.}.}.V. b.'.}.}.'.'.}.}.V. : }.}.'.}.}.'.}.'.M. 6 b.(.'. X'.'.'.}.'.'. X'.'. X}.'.'.}.}.'.}.'.}.}.}.}.`.}.}.`.'. X'.'.'. X'.'.}.'.}.'.}.'.}.}.'.'.}.}.'.}.'.}. X'.'. X'. X'.'.'.}.'.}.}.'.}.}.}.'.}.}.}.}.`.}.}.'.'.}.}.'.}.'.}.'.}.}.}.}.}.}.`.}.}.}.}.'.}.}.}.}.'.}.'.}.'.}.}.'.}.'.}.}.}.'.}.}.}.'.}.'.}.'.", | |||
"}.'.}.'.'.'.}.'. X'.'.'.'.'.'. X'.}.'.'.'.'.'.}.'.'.}.'.}.'.}.'.}.'.}.'.}.'.'.}.'.'.}.'.}.'.}.'.'.}.'.}.}.'.'.'.}.'.}.'.`.}.}.'.'.'.'.'.'. X'.'.'.}.'.}.'.'.}.'.'.}.'.}.'.'.}.'.'.'. X'.'.'. X'.'.}.'.'.'.}.'.'.}.'.'.}.'.'.'.'.}.'.}. v.'.}.'.'.}.'.'.}.'.}.c. P.'.'.}.'.'.}.}.'.'.# 6 '.}.}.}.`.Z C.'.}.'.'.'.'.}.'.Z L.}.}.'.'.}.'.}.N. : }.'.}.'.}.'.}.'.M. c P. X'.'. X'.'.'.'.'.'.'. X'.'.'.}.'.}.'.}.'.}.}.'.}.`.'.'.'. X'. X'.}.'.}.'.'.}.'.}.'.}.'.'.}.'.}.'.'.'.'.'. X'.'.'. X`.}.}.}.'.}.'.}.}.'.}.'.}.'.'.}.'.}.'.}.'.}.'.}.}.'.'.'.'.}.}.'.}.'.}.'.'.}.}.'.'.'.}.'.}.'.}.'.'.}.'.}.'.'.}.}.'.}.'.}.`.}.}.'.", | |||
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.}.).'.'.'.}.'.'.'.'.}.`.'.'.'.'.'. X'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.}.'.'.'.'.}. Z '.'.'.'.'.'.'.'.'.}.Z X P.'.'.'.'.'.'.'.'.'.X a '.'.`.}.}.B. Z '.'.'.'.'.'.'.'.c . '.'.'.'.'.'.'.}.V. : }.'.'.'.'.'.'.'.M. X Z '.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.}.`.`.'.'.}.`.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.", | |||
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.`.}.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`. c '.'.'.'.'.'.'.'.'.'.b L.'.'.'.'.'.'.'.'.'.+ 6 '.'.'.'.`.P. b '.'.'.'.'.'.'.).# 6 '.`.}.'.'.'.'.}.V. : '.'.'.'.'.'.'.'.M. c (.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.`.}.`.}.`.}.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.", | |||
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}. 2 '.'.'.'.'.'.'.'.'.'.8 X P.'.'.'.'.'.'.'.'.'.+ 6 '.'.'.'.}.}.% % '.'.'.'.'.'.'.(. V '.'.`.'.'.'.'.}.V. : '.'.'.'.'.'.'.'.M. 6 ).'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.}.`.}.`.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.).'.'.'.'.'.'.'.'.'.'.'.'.'.", | |||
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.`.}.}.`.`.}.`.}.}.`.}.}.`.}.`.}.`.`.}.`.}.`.}.}.`.`.`.}.`.`.}.`.}.`.}.}.`.}.}.`.`.`.}.`.}.`.}.'.'.'.'.`.'.'.`.}.}.`.'.}.`.}.}.}.`.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.`.}.`.}.`. . '.'.}.`.}.}.`.`.'.).$ P.'.'.'.'.`.'.'.'.`.+ 8 }.'.}.`.}.}.d (.'.'.'.'.'.'.B. v.'.`.}.'.'.'.`.'.V. : }.`.'.}.`.`.`.}.M. d '.}.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.`.`.}.`.}.`.}.}.`.`.}.'.`.`.}.`.}.`.}.}.`.`.`.}.`.`.}.`.}.`.}.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.`.'.'.'.'.", | |||
"`.'.'.`.'.'.`.'.`.'.'.'.`.'.`.'.'.'.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.}.`.`.}.`.`.`.`.`.}.}.`.}.`.`.`.`.`.`.`.`.`.`.}.`.}.`.`.`.`.`.`.'.`.'.'.`.'.'.`.`.'.`.`.'.`.`.`.`.}.`.`.`.'.`.`.'.`.`.`.'.`.`.'.'.'.'.`.'.`.'.`.'.`.'.`.'.`.`.}.`.`. P.).`.'.`.`.`.'.'.). P.`.'.`.'.`.'.'.`.}.+ 6 `.'.`.`.`.`.$. C.'.`.'.`.'.`.Z P.'.`.}.'.'.'.'.`.V. : '.'.`.`.}.}.`.}.:. $.}.`.'.`.`.'.'.'.'.'.'.`.'.'.`.'.'.'.`.'.`.'.'.`.'.'.`.'.'._.'.`.'.'.'.`.'.}.}.`.`.}.`.`.'.`.`.}.`.`.}.`.`.`.`.`.`.`.}.}.`.}.`.}.`.`.`.`.`.'.'.`.'.`.`.'.'.`.'.'.`.`.'.`.'.`.`.'.'.`.'.`.'.'.`.'.'.`.`.'.'.`.'.'.`.'.'.'.`.'.`.'.'.'.`.'.'.", | |||
"'.`.`.'.`.`.`.`.`.'._._.`.`.`.'.`.`.'.`.`.'.`.`.`.`.`.`.`.}.`.`.`.`.}.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'.`.'.`.`.`.'.`.'.`.'.`.'.`.`.`.`.'.`.'.`.'.'.`.`.`.}.`.'.`. C.'.`.`.`.`.`.}.`.P. P.'.`.`.`.`.`.'.'.`.+ 6 '.`.`.}.`.`.C. $.'.'.'.`.`.'.d O `.'.`.`.`.`.`.`.'.B. : `.`.`.`.`.`.}.`.M. C.`.'.`.'.'.`.`.'.'.`.`.'.`.`.`.`.'.`.`.`.'.`.`.`.`.`.'.`.`.`.`.'.'._._.'.`.`.}.`.`.`.`.`.`.`.`.`.`.'.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.'.`.'.'.`.`.`.'.`.`.'.`.`.`.`.'.'.`.`.'.'.`.`.`.'.`.'.`.`.`.`.`.`.`.'.`.`.'.`.`.`.`.`.'.`.`.", | |||
"`.`.'.`.'.`.'.`.'.`.'.'.`.}.`.`.'.`.`.`.`.`.`.}.`.`.}.`.`.'.`.`.`.`.`.`.`.`.`.`.}.`.`.}.`.`.}.`.`.`.}.`.`.`.`.}.`.`.}.`.`.`.}.`.`.'.`.`.`.'.'.`.`.`.}.`.'.`.`.`.}.`.`.'.`.`.`.`.`.'.`.'.`.`.'.`.`.`.`.'.'.`.`.`.`.`.`.`.}.`.`.`.`.'.`. %.}.`.'.}.`.`.`.`.C. P.`.`.'.'.'.`.`.`.`.+ a '.`.`.`.`.`.(. b '.'.`.'.'.).O 6 `.`.`.'.`.'.'.`.'.B. : `.`.'.'.`.`.`.`.:. 8 `.`.`.'.`.'.`.`.`.`.'.`.`.'.'.`.`.`.'.`.`.`.`.`.'.`.`.'.'.'.`.`.`.'.'.'.`.`.`.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.}.`.`.`.`.`.`.}.`.`.`.`.}.'.`.`.`.`.`.'.`.`.`.`.'.`.`.'.`.`.`.`.`.'.`.`.`.'.`.`.`.'.`.'.`.'.'.`.'.`.'.`.`.`.'.'.`.'.`.`.'.", | |||
"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. V `.`.`.`.`.`.`.`.%. P.`.`.`.`.`.`.`.`.`.+ 6 `.`.`.`.`.`.'.2 : _.`.`.`.`.P. C `.`.`.`.'._.'._._.N. : `._.'._.'.`.`.`.M. C.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'._.'._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.", | |||
"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. d `.`.`.`.`.`.`.).Z P.`.`.`.`.`.`.`.`.).+ 6 `.`.`.`.`.`._.b (.`.`.`.`.M. M.`.`.`.`._.'._.'.`.B. : `.`.`.`.`.`.`.`.:. b `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._.'.`.`._.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.", | |||
"`.`._._.`.`._._._.`._.`.`._._.`.`._.`.`.`.`.`.`.`.`.`._.`.`.`.`._.`.`._._.`.`._.`.`._.`.`._.`.`.`.`._._.`.`._._._.`._.`.`.`.`._.`._.`._._.`.`.`.`.`.`.`.`._.`.`.`.`.`._._.`.`._.`.`.`.`.`._._.`.`.`.`.`._.`.`.`.`.^.`.`.`.`.`.`.`.`.`. : _.`._.`.`.`.`.`.b L.`._._.`._.`.`.`.`.+ 6 `.`._._.`.`.`.%. C.`._._.`.C P._.`.`.`._.`._._._.B. : `._.`.'._.`._.`.:. ~._.`.`.`._.`._._.`._.`._._.`._.`.`.`.`._._.`._.`.`.`._._.`._._._._._.`._.`.`.`._.^.`.`.`.`.`.`.`.`.`.`.`.`._.`.`._.`._.`.`.`.`._.`.`.`.`.`.`.`._._.`.`.`.`.`.`.`.`.`.`._.`.`._.`.`.`._.`.`._.`._._.`.`._.`.`._.`.`._._.`._.`.`._._.`.", | |||
"_.`.`.`.`._.`.`.`._.`.`._.`._.`._.`._._.`._.^.`.`.`._.`.`._.^.`.`._.`.`.`.`._.`._._.`._._.`._._._.`.`.`.`._.`.`._.`.`.`._._.`.`.`._.`.`._.`._.`.`.`.`.^.`.`.`._.`.^.`.`.`.`._.`._._.`.`.`._.`.`.`._._.`.`._._.`.`.`.`.`.^._.`._.`.`.`. _.`._.`._.^.`.`.4 P.`._.`.`._.`._.`.`.+ 6 `.`.`.`._.`._.L. $.`._.`.`.6 + _.`._._.`._.`.'._.`.B. : `.'._._.`._.`._.M. v.`.`._.`.`._.`.`._.`._.`.`._.`.`.`.`.`._.`.`._.`._.`.`.`._.`._.'.'._.`.`.`.`.`.`.`.`._.`.`.`._.`._.`.`._._.`._.`.`._.`._._.`._.`.`._._.`._._.`.`.`.`.`._._.`.`._._.`.`.`.`._.`.`._._.`.`._.`.`._.`.`._.`.`._.`._._.`.`._.`.`._.`._.`.", | |||
"`.`._._._.`.`._._._.`._._.`._._.`._._.`.^.`.`.`.^.`._.`._.`._.`._._._.`._.`._.`.`._.`._.`._._.`.`._.`._._.`._._.`._._.`._.`._.`.`._.`._.`._._.`.`._._.`._._._.`._.`.^.`.`._.`._._._.`._.`._.`._._.`._.`._._.`._.`.^._.`._._.`._.`._.`. K.`.`._.`._.`.`.+ K.`._._.`._._.`._.`.+ 6 _._.`._.`._._.~.. b `._.`._.. d _.`.`.`._._._.`._.`.N. : _._._._._.^.`.`.M. N _._._.`._._.`._.`._._.`._.`._._.`._._._.`._.`._.`._.`._.`._._.`._.`.^.`._._._.`._.`.`._.`.`.^.`.^.`._.`._._.`._.`._._._._.`._.`._._._.`._.`._.`._._._._.`._._._.`._._._.`._._.`._._._.`._.`._.`._._._.`._._.`._.`._._._.`._._._.`._.", | |||
"_._._._._._._._._._._._._._._._._._._._.^.`.^.`.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.`.^.`._.^.`._._._._._._._._._._._._._._._._._.`._.`.`.^._._._._._._._. B.^.`._._._._.~. K._._._._._._._._._.O d _._._._._._._._.8 : _._.`.K. Z _.^.`.^.`._.`._._._.N. : _._._._._.`.`.^.:. X + : _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.^._._._._._._._._.^.`._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.", | |||
"_._._._._._._._._._._._._._._._._._._.`.`.^.`._.^.`._._._._._._._._._._._._._._._.^._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.^.^.`.^._._.`._._._._._._._._._._._._._._._._._.^.^.^.`.`._._._._._._.`. $.`._._.^.^.`.K. P.^.`._._._._._._._.O 6 _._._._._._._._.V ~._._.:. N._.`.^.^._._._._._._.N. : _._._._._.`.^.`.>. N._._.K.%.2 ).`._._._._._._._._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.^._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.", | |||
"_._._._._._._._._._._._._._._._._._._.^.^.`.^.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.^._._._._._._._._._._._._.^.`.`.^.`._.^.^._._._._._._._._._._._._._._._._._.`.`._.^.`.^._._._._._._. N _._.^.`.`.^.B. K._.`.^.`._._._._._.O 6 _._._._._._._._.:. C._.`.V P._.^.`.`._._._._._._.N. : `._._._._.^.`.^.M. N._._.`.`.~.b K.~._._._._._._._._._.^.^.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.", | |||
"^._._._._._.^._._._._._._._._._.`.^.`.`.^.`.^._.^._._._._._._._._._.^._.^._._._._.^._._.^._._._.^._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._.^._._.`.^._._.`.`.^._._.^._._.^._._._._._._._._._._._._._.^._._._._.^._._._. 6 ^._.`.`.^._.%. K._._._._._._.^._._.O 6 ^.`._._.^._._._.P. $._._.5 $ `.^.`.^._._._.^._._._.N. 5 b b b b b b b b b b b b b b b C ^._._._._._._._.:. N.~._.^._._.~.+ >._._._.^._._.^._._.^._._._._.^._._._.^._._.^._._._._._._._._._._.^._._.^._.^._._.^.`.^._._.^.`.^._.^._._._._._.^._._._._._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._.^._._.^._._._.^._._._._._.", | |||
"_.^.^.^._.^._.^.^.^._.^.^._.^.^.^.^.^.^.^.^._._._.^.^.^._.^.^.^.^.^._._._.^._.^._._.^._._._.^._._.^._.^.^._.^._.^.^.^._._.^.^.^.^._.^._.^.^.^._._.^.^.^._._.^._.^._.^._.^.^._.^._._.^._._._.^.^.^.^._.^.^._.^.^.^.^._._.^._.^._.^._.^. $ _._.^.^._.^.V P.^._.^.^.^.^._._.^.# 5 ^.^._.^._.^.^.^.^.+ b _.~.O d ^._._.^.^.`.^._.^._.^.N. %._.^.^.^._._._._._._.^._._._.^._._.^.^.^._.^.^._.:. N.^._._._.^.^.V $._.^._.^._._.^._.^._._.^.^.^._._.^._._.^._._._.^._.^.^._.^.^._.^._.^.^._._.^._.^._.^._.^._._.^._._._.^._.^._._._.^.^.^._.^.^._.^.^._.^.^.^.^.^._._._.^._.^._.^.^.^.^.^._._._.^.^.^.^._.^.^.^.^._._.^._.^._._.^._.^.^.^._._._.^.^.^.", | |||
"^._._.^.^._._.^.^._.^._._.^._.^.^.`.^._._.^.^._.^._._.^.^._._.^._.^._.^.^._.^.^.^.^.^._.^.^.^.^.^._.^.^._.^.^._._.^._.^.^._._.^._.^.^._._.^._.^.^._._.^.^.^.^._.^.^._.^.^._.^.^.^.^.^.^.^.^.^._.^.^.^.^._.^._.^.^._._.^._.^.^._._.^._. W._.^._.^.^.b K._.^._.^.^._._.^.^.+ 6 ^._.^._.^.^.^.^.^.d 2 ^.K. { ^.^.^.^._.^.^._.^._.^.N. %._._.^._.^.^.^._.^.^.^._.^.^.^._.^._.^._.^._.^._.:. N.^.^.^.^.^._.%. C ^._.^.^._.^._.^.^.^.^.^._.^.^.^.^.^.^.^._.^.^.^.^.^._.^.^._.^.^._.^._._.^.^._.^._._.^.^._.^.^._.^.^._.^.^.^.^._.^.^._.^._._.^._.^.^._._.^._.^._.^.^._.^.^.^._._.^._.^._.^.^._._.^._.^._.^.^._._.^._.^.^._.^._._.^.^._.^._.^._._.^.", | |||
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^._.^.^._.^.^._.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. K.^.^.^.^.^.> K.^.^.^.^.^.^.^.^.^.O 6 ^.^.^._.^._.^.^.^.Z Q.%. N.^._.^.^.^.^.^.^.^.^.^.N. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. >.^.^.^.^.^.^.C. V ^.^.^.^.^.^._.^._.^.^.^._.^._.^.^._.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.", | |||
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. :.^.^.^.^.^.+ K.^.^.^.^.^.^.^.^.^.O 6 ^.^.^.^.^.^.^.^.^.>. C.V W._.^.^.^.^.^.^.^.^.^.^.N. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. >.^.^.^.^.^.^.H. b ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.", | |||
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. $.^.^.^.^.W. K.^.^.^.^.^.^.^.^.^.O 5 ^.^.^.^.^.^.^.^.^.W. %.4 $ ^.^.^.^.^.^.^.^.^.^.^.^.>. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. N.^.^.^.^.^.^.K. f ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.", | |||
"^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.!.^.^.^.^.!.!.^.^.^.!.^.!.^.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.!.^.^.!.^.!.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^. B ^.!.^.^.H. K.^.^.!.^.!.^.^.^.^.O 5 ^.!.^.!.^.^.^.^.^.^.$ b b ^.^.!.^.^.!.^.^.^.^.^.^.>. %.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.!.!.^.^.^.^.^.^.;. >.^.^.!.^.^.^.J. d ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.!.^.^.!.^.!.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.", | |||
"^.^.^.!.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.!.^.!.^.!.^.^.!.^.!.^.^.!.^.^.^.^.^.^.!.^.!.^.!.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.!.^.^.^.^.!.^.^.^.!.^.^.^.^. 5 ^.^.^.^.>. J.^.^.^.^.^.^.^.!.^.O 5 ^.^.^.^.^.^.^.!.^.^.b . { ^.^.^.!.^.^.^.^.!.^.^.^.>. =.!.^.^.!.^.^.^.^.!.^.!.^.!.^.^.^.^.^.^.^.^.!.^.^.:. >.^.^.^.^.^.^.K. a ^.^.!.^.^.^.!.^.!.^.!.^.!.!.^.!.^.^.^.!.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.!.^.!.^.!.^.^.!.^.!.^.^.!.^.^.^.^.^.^.!.^.!.^.!.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.!.^.^.^.^.!.^.^.^.!.^.!.^.!.^.^.^.!.^.^.^.!.^.!.^.!.^.", | |||
"^.^.^.^.!.^.^.^.^.!.^.^.!.^.^.^.^.^.^.!.^.^.^.^.!.^.^.^.^.^.!.^.^.^.!.^.^.!.!.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.!.^.^.!.^.^.!.!.^.^.^.^.^.^.^.^.^.!.^.^.^.!.!.^.^.!.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.^.^.!.^.^.^.^.^.^.!.^. $ ^.^.!.^.%. K.^.^.^.^.^.^.!.^.^.O 5 ^.^.^.^.^.^.!.^.^.!.$. N.^.^.!.^.!.^.^.^.^.!.^.^.>. %.^.^.^.^.!.^.^.^.^.^.^.!.^.^.^.!.^.!.^.^.^.^.^.^.:. >.^.^.^.^.^.^.K. d ^.^.!.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.!.^.^.!.!.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.!.^.^.!.^.^.!.!.^.^.^.^.^.^.^.^.^.!.^.^.^.!.!.^.^.!.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.^.^.!.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.^.!.", | |||
"!.^.!.^.^.!.^.!.^.^.!.^.^.^.!.^.^.!.^.!.^.!.!.^.^.^.!.^.!.^.!.^.^.!.^.!.^.^.^.^.^.!.!.^.!.^.^.^.!.^.!.^.^.!.!.^.^.!.^.^.^.^.^.^.^.!.!.^.^.!.^.!.^.^.!.^.^.^.^.!.^.^.^.!.!.!.^.^.^.!.!.^.^.!.!.^.!.^.!.!.^.^.^.!.^.!.^.!.!.^.!.^.!.^.^. Q.^.^.^.B K.!.^.!.^.!.^.!.^.^.O d ^.^.!.^.!.^.!.^.^.^.H. Q.^.!.^.^.^.^.!.!.^.^.!.^.>. %.^.!.^.!.^.^.!.!.^.!.^.^.!.^.!.^.!.^.!.^.!.!.^.!.;. >.^.^.!.!.^.!.J. f !.!.^.^.!.^.^.^.!.^.^.!.^.^.!.^.!.^.!.^.!.^.^.^.^.^.!.!.^.!.^.^.^.!.^.!.^.^.!.!.^.^.!.^.^.^.^.^.^.^.!.!.^.^.!.^.!.^.^.!.^.^.^.^.!.^.^.^.!.!.!.^.^.^.!.!.^.^.!.!.^.!.^.!.!.^.^.^.!.^.!.^.!.!.^.!.^.^.!.!.^.!.^.^.^.^.^.^.^.^.!.!.^.", | |||
"^.!.^.!.!.^.!.!.^.!.!.^.!.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.!.^.!.^.!.^.^.!.!.^.!.^.!.!.^.^.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.!.!.^.^.!.!.^.^.!.^.^.!.^.!.!.^.^.!.!.^.^.!.^.!.!.!.^.^.!.!.^.^.!.^.!.^.^.!.!.^.!.^.^.!.!.^.^.!.^.^.!. J.^.!.!.d J.!.^.^.!.!.^.^.!.^.O 5 !.^.^.!.^.!.!.^.!.!.Q.. : !.^.^.!.^.!.^.^.!.^.!.^.^.>. %.^.!.^.^.!.!.^.^.^.^.!.!.^.!.^.^.!.!.^.!.^.^.!.^.;. >.!.!.^.!.^.^.J. f ^.^.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.^.^.!.!.^.!.^.!.!.^.^.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.!.!.^.^.!.!.^.^.!.^.^.!.^.!.!.^.^.!.!.^.^.!.^.!.!.!.^.^.!.!.^.^.!.^.!.^.^.!.!.^.!.^.^.!.!.^.^.!.!.!.^.^.^.^.!.!.!.^.^.!.!.^.^.!.", | |||
"^.!.!.!.^.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.!.^.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.^.!.!.^.!.!.^.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.^.!.!.^.!.!.!.!.!.!.!. >.!.^.!.2 J.!.!.!.^.!.!.^.!.!.+ 5 !.!.^.!.!.!.^.!.!.^.!.> b !.!.^.!.!.!.!.!.!.!.^.!.!.N. %.!.!.!.!.^.^.!.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.^.!.;. >.^.!.!.^.!.!.H. b ^.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.^.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.!.^.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.^.!.!.^.!.!.^.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.^.!.!.^.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.^.!.!.^.!.", | |||
"!.^.!.^.!.^.!.^.!.^.!.^.!.^.!.^.^.!.^.!.!.!.!.!.^.!.!.^.!.^.!.!.!.^.!.^.!.^.^.!.^.!.^.!.^.!.!.!.!.^.!.!.!.^.!.^.!.^.!.!.!.!.^.^.^.!.!.!.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.!.!.^.!.^.^.!.!.!.!.^.!.!.!.!.^.^.!.^.!.!.!.!.^.^.^.!.^. $.!.^.!.+ J.^.!.^.!.^.!.^.!.^.O 5 !.!.!.^.!.^.^.!.^.!.!.B ..!.^.!.^.!.^.^.!.^.!.!.^.!.>. %.!.^.!.!.^.!.^.!.^.^.!.!.!.!.^.!.!.^.!.!.^.!.^.!.;. >.^.!.!.^.!.^.C. B !.!.^.^.!.^.!.!.!.^.!.!.^.!.^.!.^.^.!.!.^.!.^.^.!.^.!.^.!.^.!.!.!.!.^.!.!.!.^.!.^.!.^.!.!.!.!.^.^.^.!.!.!.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.!.!.^.!.^.^.!.!.!.!.^.!.!.!.!.^.^.!.^.!.!.!.!.^.^.!.^.!.^.^.!.!.!.^.!.!.^.!.^.!.^.", | |||
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.^.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.!.!.!.!.^.!.^.!.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.!.!.!. N !.!.W. : J.!.!.!.!.!.!.!.!.!.O 5 !.^.!.!.!.^.!.!.!.^.!.%. C.!.!.!.!.!.!.!.!.!.!.!.^.!.>. =.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.^.!.!.!.;. >.!.^.!.!.!.!.-. { ^.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.!.!.!.!.^.!.^.!.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.!.", | |||
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^. + a !.!.H. a J.!.!.!.!.!.!.!.!.!.+ 5 !.!.!.!.!.!.!.!.!.!.!.H. Q.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.;. >.!.!.!.!.!.!.{ ;.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.", | |||
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. 4 $ !.!.;. B J.!.!.!.!.!.!.!.!.!.+ 5 !.!.!.!.!.!.!.!.!.!.!.!.O > !.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.;. >.E.!.!.!.!.!.f H.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.", | |||
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. b !.!.{ { J.!.!.!.!.!.!.!.!.!.O 5 !.!.!.!.!.!.!.!.!.!.!.!.a b !.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.=. >.!.!.!.!.!.Q.O I.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.", | |||
"!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.E.!. B @ J.!.B # %. J.!.!.!.!.!.E.!.!.!.+ 5 !.!.E.!.!.!.!.!.E.!.!.E.C ..!.!.!.E.!.!.!.E.!.E.!.!.!.!.>. X.!.E.!.!.!.!.!.!.!.!.!.!.Q.!.!.E.!.!.!.!.E.!.!.!.=. >.!.E.^.!.!.B $ !.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.E.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.", | |||
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. N a -.!.a 4 .. J.!.!.!.!.!.!.!.!.Q.O 5 !.!.!.!.!.E.!.!.!.!.!.!.>. H.!.!.!.!.!.!.!.!.!.!.!.!.!.E.>. N =.=.=.%.=.=.=.=.=.=.=.=.=.=.,.!.!.E.!.!.!.!.!.!.=. >.R.K.t.{ < b !.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.E.!.!.!.!.!.!.!.!.E.", | |||
"!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.!.!.E.!.E.!.!.!.!.E.!.E.!.E.!.!.E.!.E.!.E.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.!.!.!.E.!.!.!.!.E.!.E.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!. B b ..!.: f . J.!.E.!.E.!.E.!.E.!.O 5 E.!.E.!.!.!.E.!.E.!.!.!.J. Q.E.E.!.!.E.!.E.!.E.!.E.E.!.!.>. < !.E.!.!.!.!.E.!.!.=. =.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.!.!.!.E.!.!.!.!.E.E.!.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.!.!.E.E.!.!.!.!.E.!.E.!.E.!.!.", | |||
"E.!.!.!.E.!.!.!.!.!.E.!.!.!.E.!.E.!.!.E.!.!.E.!.!.E.E.!.!.!.E.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.E.!.!.!.E.!.E.!.!.E.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.!.E.E.!.!.!.E.!.!.!.!.!.E. B { V !. C . J.E.!.!.!.E.!.!.!.!.+ 5 !.!.E.!.!.E.!.!.E.!.!.E.!.@ 4 E.!.!.E.!.!.E.!.!.!.!.!.E.!.E.>. < !.!.!.!.!.E.!.!.!.;. R.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.E.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.E.!.!.!.!.E.!.E.!.!.E.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.E.!.!.!.!.E.!.!.!.E.", | |||
"!.!.E.E.!.!.E.E.E.E.!.!.E.E.!.!.!.E.!.!.E.!.!.E.E.!.!.!.E.!.E.!.!.!.E.!.!.E.E.!.!.E.!.E.!.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.!.E.!.E.!.!.E.!.E.!.!.E.!.!.E.!.E.!.E.E.!.E.!.!.E.!.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.E.E.!.!. B ;. a I. =. . i.!.!.E.E.!.!.E.E.E.O 5 E.!.!.E.!.E.E.!.E.!.!.E.!.a N !.!.E.!.!.E.!.!.E.!.E.!.!.E.!.>. < E.!.E.!.E.!.!.E.E.=. B !.E.!.!.E.!.E.!.!.E.!.E.!.!.E.!.E.E.!.!.!.E.!.!.E.E.!.!.E.!.E.!.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.E.E.!.E.!.!.E.!.E.!.!.E.!.!.E.!.E.!.E.E.!.E.!.!.E.!.!.E.!.E.!.E.!.!.!.E.E.!.!.E.E.E.E.!.!.E.E.!.!.E.!.!.E.E.!.!.E.!.E.!.E.!.E.E.!.", | |||
"E.!.E.!.E.E.E.!.!.E.!.E.!.E.!.E.E.!.E.E.E.!.E.!.!.!.E.E.!.E.E.!.!.E.E.!.E.E.!.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.E.E.!.E.E.!.E.!.!.E.E.E.!.E.E.!.E.!.E.E.E.!.!.E.!.E.E.E.!.E.E.!.E.!.E.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.!.E.!.E.!.E. B H. ; t. C. . J.E.!.E.!.E.!.E.!.!.O 5 E.!.E.E.!.!.E.!.E.!.E.!.!.{ %.E.E.E.!.E.!.!.E.E.!.E.!.E.!.!.-. 4 !.E.!.E.E.E.E.E.!.=. ; R.E.!.E.E.!.E.E.!.E.!.E.E.E.!.!.!.E.!.E.!.E.E.!.E.E.!.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.E.E.!.E.E.E.!.!.!.E.E.E.!.E.E.!.E.!.E.E.E.!.!.E.!.E.E.E.!.E.E.!.E.!.E.E.!.E.E.E.!.E.!.E.!.E.!.!.E.!.E.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.!.!.E.!.E.", | |||
"E.E.!.E.E.!.!.E.!.E.E.E.!.E.E.!.E.E.!.E.E.!.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.!.E.E.!.E.E.E.!.E.E.E.!.E.E.E.!.!.E.!.E.E.!.E.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.!.E.E.E.!.!.E.E.!.!.E.E.!.E.E.E.!.E.E.!.E.E.E.!.E.E.E.!. B R. =. I... J.E.E.!.E.E.E.!.E.E.O 5 !.E.E.!.E.E.!.E.E.E.!.E.E.,. t.E.!.E.E.E.E.E.E.!.E.!.E.E.E.E.-. < E.E.E.E.!.!.E.!.E.=. @ J.E.!.E.E.E.E.!.E.E.E.E.!.!.E.E.E.E.!.E.E.E.E.!.E.!.E.E.E.!.E.E.!.E.E.E.!.!.E.E.!.E.E.E.!.!.E.!.E.E.!.!.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.!.E.E.E.!.!.E.E.!.E.E.!.E.E.E.!.E.E.E.E.E.!.E.E.!.!.E.E.E.E.!.E.E.E.!.E.E.E.!.E.E.", | |||
"E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.!.!.E.E.E.E.E.!.E.E.E.E.!.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.!.E.E.!.E.E.E.!.E.E.E.E.E.!.E.!. B T.@ N . E. . i.E.E.E.E.E.E.E.E.E.O 5 E.E.E.E.E.E.E.E.E.E.E.E.!... X.E.E.E.!.E.E.!.E.E.E.E.E.E.E.!.-. < !.E.E.E.E.E.E.E.T.=. f I.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.!.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.!.", | |||
"E.!.!.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.!.E.E.!.E.E.E.E.E.!.!.E.E.E.E.E.!.E.E.E.E.E.!.E.!.E.E.!.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E. B E.5 % : E. . J.E.!.!.E.E.E.E.!.E.O 5 E.E.!.E.E.E.E.E.!.E.E.!.E.B N E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.-. < !.E.E.E.E.E.!.E.E.=. + f H.T.E.E.E.E.E.!.!.E.E.E.E.E.E.!.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.!.E.E.!.E.E.E.E.!.E.E.E.E.!.!.E.E.E.E.!.!.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.", | |||
"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E. B E.N a E... i.E.E.E.E.E.E.E.E.E.O 5 E.E.E.E.E.E.E.E.E.E.E.E.E.a $ E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.>. 4 E.E.E.E.E.E.E.E.T.=. > f C t.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.", | |||
"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E. l E.{ B E. . J.E.T.E.E.E.E.E.E.E.X 5 E.T.E.E.E.E.E.E.E.E.E.E.E.@ J.T.E.E.E.E.E.E.E.E.E.E.E.E.E.-. > T.E.E.E.E.E.E.E.T.=. ; B ,.R.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.", | |||
"E.E.E.E.T.T.E.E.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.T.E.E.E.T.E.E.E.E.T.E.E.E.T.T.E.E.E.T.E.T.E.E.E.E.E.E.E.E.T.T.E.E.E.T.E.E.E.E.T.E.E.T.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E. B T.-. ..E. . i.E.E.E.E.T.T.E.E.T.# 5 T.E.E.T.T.E.E.E.E.E.E.E.I. =.T.E.E.E.E.E.E.T.E.E.E.T.E.E.-. > E.E.E.T.E.T.E.E.E.=. + B i.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.E.E.E.E.T.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.T.E.E.E.E.T.E.E.E.T.E.T.E.E.E.T.E.E.E.E.T.E.E.E.T.T.E.E.E.T.E.T.E.E.E.E.E.E.E.E.T.T.E.E.E.T.E.E.E.E.E.E.E.E.T.T.E.E.T.E.E.E.T.E.T.E.E.T.T.E.E.T.T.E.E.E.E.T.E.E.E.T.", | |||
"T.E.T.E.E.E.E.T.T.E.E.E.T.E.E.E.T.T.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.E.Y.E.T.E.T.E.E.T.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.T.E.T.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.T.E.T.E.E.E.E.E.E.E.T.E.E.T.E.T.E.E.E.E.E. l E.i. -.T. . i.T.E.E.E.E.E.E.T.T.O 5 T.E.E.E.E.E.T.E.T.E.E.E.t. f E.E.E.T.E.T.E.E.E.T.E.E.E.T.-. 4 E.T.E.E.E.E.E.E.T.&. d i.R.T.E.T.E.T.E.E.E.T.E.E.E.T.E.T.E.T.E.E.E.E.T.E.E.Y.E.T.E.T.E.E.T.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.T.E.T.E.E.T.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.T.E.E.T.T.E.E.E.E.T.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.", | |||
"T.T.E.E.E.E.T.E.T.E.T.T.E.E.T.T.E.T.T.E.E.T.T.E.Y.E.T.E.E.T.T.T.E.T.E.E.T.T.E.E.Y.E.E.T.E.T.E.T.T.E.T.T.E.T.T.T.E.E.T.E.T.E.T.T.E.T.E.T.T.E.T.E.T.E.T.T.E.T.T.T.E.T.E.T.T.E.T.E.T.E.T.E.E.T.E.T.E.E.T.E.T.E.T.T.E.E.E.T.T.T.E.E.T.E.T. B E.U. i.T. . i.E.E.T.E.T.E.T.E.T.# 5 T.E.T.E.E.E.E.T.T.E.T.E.X. ; U.T.T.E.T.E.T.T.E.E.T.T.E.E.-. 4 T.E.E.T.T.E.T.E.T.=. . { T.T.E.T.E.E.T.E.E.T.T.E.E.T.E.T.E.E.T.E.T.E.E.T.E.E.T.T.E.E.T.E.E.T.T.T.E.T.T.E.E.T.E.T.T.T.E.E.T.E.T.E.T.E.E.T.E.T.T.E.T.E.T.E.T.T.E.T.T.T.E.T.E.T.T.E.T.E.T.E.T.E.E.T.E.T.T.T.E.E.T.E.T.E.E.T.T.T.T.T.E.E.T.T.E.T.T.T.E.T.E.E.T.T.T.E.T.T.", | |||
"T.E.T.T.T.T.T.T.T.E.T.T.T.T.T.E.T.T.T.E.T.T.T.E.E.T.E.Y.T.E.T.T.T.T.T.T.T.E.T.T.Y.E.T.T.E.T.T.T.T.T.T.E.T.T.E.T.T.T.T.T.T.T.T.E.T.E.T.T.T.E.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.T.T. l T.E.$ U.T. . i.T.T.T.T.T.T.T.T.T.O 5 T.T.T.T.T.T.T.T.E.T.T.T.B I.E.T.T.E.T.T.T.T.T.T.T.T.T.-. < T.T.T.E.T.T.T.T.T.=. B U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.E.Y.T.T.E.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.T.E.T.T.E.T.T.T.E.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.E.T.T.T.E.E.T.T.E.T.T.E.T.", | |||
"T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.Y.E.Y.E.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T. l T.T.a @ T.T. . i.T.T.T.T.T.T.T.T.T.O 5 Y.T.T.T.T.T.T.T.T.T.Y.E.i =.T.T.T.T.T.T.T.T.T.T.T.T.T.-. < T.T.T.T.T.T.T.T.T.+. { T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.Y.E.Y.Y.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.", | |||
"T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.E.Y.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T. B T.R.l 5 T.Y. . i.T.T.T.T.T.T.T.T.T.O 5 T.T.T.T.T.T.T.T.T.T.E.Y.+ l T.T.T.T.T.T.T.T.T.T.T.T.Y.-. < T.T.T.T.T.T.T.T.T.=. ; > @ t.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.E.Y.E.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.", | |||
"T.T.Y.T.T.T.Y.T.T.T.T.Y.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.E.Y.E.T.T.T.T.T.Y.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.Y.T.T.T.T.T.Y.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T. B T.T.{ f Y.T.} i.T.T.T.Y.Y.T.T.T.T.O 5 T.T.T.T.T.Y.Y.T.T.T.T.I. ; T.T.T.Y.T.T.T.T.Y.T.T.T.T.-. > T.T.T.Y.Y.T.T.Y.T.+. &.T.T.I.-.s < U.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.Y.T.Y.E.Y.E.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.Y.T.T.Y.Y.T.T.Y.", | |||
"T.Y.T.T.Y.Y.T.Y.Y.T.Y.T.Y.T.T.T.x.T.T.T.Y.T.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.T.Y.Y.Y.Y.T.Y.Y.T.Y.T.Y.T.Y.Y.T.Y.T.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.Y.T.T.Y.T.T.T.Y.x.T.T.Y.Y.T.T.Y.Y.T.T.Y.Y.T.Y.T.T.Y.Y.T.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.T. l Y.T.*. { Y.Y. . u.T.Y.T.Y.T.T.T.Y.Y.O 1 Y.T.Y.Y.T.Y.T.T.Y.T.Y.,. I.T.x.T.T.Y.Y.Y.T.T.Y.T.Y.-. 4 Y.Y.T.Y.T.T.Y.T.Y.+. &.T.Y.Y.T.T.B &.Y.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.T.T.T.Y.Y.T.Y.T.Y.Y.T.T.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.T.Y.Y.T.Y.T.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.Y.T.T.Y.T.T.T.Y.x.T.T.Y.Y.T.T.Y.Y.T.Y.Y.Y.T.Y.T.T.Y.Y.T.T.Y.T.Y.T.T.Y.T.T.Y.Y.Y.T.Y.T.Y.T.T.T.T.T.Y.Y.T.Y.Y.T.Y.T.T.Y.T.", | |||
"Y.T.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.T.x.T.x.T.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.Y.Y.T.T.Y. k Y.Y.i. +.Y.T.} i.Y.T.Y.Y.Y.Y.T.Y.T.O i Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.} +.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.&. < a a a d a s a a a s a a a a x Y.T.Y.Y.Y.Y.T.Y.Y.+. &.T.Y.T.Y.Y.I.O 4 Y.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.T.T.x.T.x.T.T.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.T.Y.Y.T.Y.T.Y.Y.Y.Y.T.x.x.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.", | |||
"Y.Y.T.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.T.Y.Y.Y.Y.T.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.T.x.T.x.x.T.Y.Y.Y.Y.x.T.T.Y.Y.T.Y.Y.Y.Y.Y.T.T.Y.Y.T.Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T. B Y.Y.Y. t.Y.Y.} i.Y.Y.Y.T.Y.Y.Y.Y.Y.O 4 Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.N B Y.Y.Y.Y.Y.Y.Y.Y.T.T.Y.T.&. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.T.=. &.Y.Y.Y.Y.Y.Y.i I.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.Y.Y.Y.Y.Y.T.T.Y.x.T.T.Y.Y.Y.Y.Y.Y.T.T.Y.x.T.x.T.T.Y.Y.T.Y.x.T.x.Y.Y.T.T.Y.T.T.T.Y.E.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.", | |||
"Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.T.Y.x.Y.Y.Y.Y.x.T.x.T.Y.Y.T.Y.Y.Y.x.T.Y.Y.Y.Y.Y.Y.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y. k Y.Y.Y.: g.T.Y... u.Y.Y.Y.Y.Y.Y.Y.Y.Y.O 4 Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.4 > x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.&. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.Y.x.+. &.Y.Y.Y.Y.Y.Y.B t.Y.Y.Y.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.x.Y.Y.Y.Y.T.x.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.T.Y.Y.Y.Y.Y.Y.x.T.T.x.Y.Y.T.x.Y.Y.Y.T.Y.Y.x.Y.Y.Y.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.", | |||
"Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.x.T.Y.Y.Y.Y.T.x.Y.Y.Y.Y.x.Y.Y.Y.T.x.Y.Y.T.x.Y.Y.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y. k Y.Y.Y.a O Y.Y.Y.} i.Y.Y.Y.Y.Y.z.Y.Y.Y.O 5 Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.+ I.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.*. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.x.x.=. &.Y.Y.x.Y.Y.Y.} | Y.Y.x.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.x.T.Y.x.Y.Y.T.x.x.T.x.Y.x.T.x.Y.Y.Y.Y.Y.T.x.T.x.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.", | |||
"Y.Y.Y.Y.Y.Y.x.Y.Y.x.x.Y.Y.Y.z.Y.Y.x.Y.Y.x.Y.x.Y.Y.Y.Y.Y.x.Y.Y.x.Y.x.Y.Y.x.Y.Y.x.x.Y.x.Y.Y.Y.Y.x.x.Y.x.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.x.Y.x.x.Y.Y.T.x.x.T.x.Y.Y.x.T.x.x.x.Y.x.Y.Y.Y.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.z.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.z.Y.Y.Y.Y.Y.x. k Y.Y.x.l > Y.Y.Y.} u.Y.Y.Y.Y.Y.Y.Y.Y.Y.O 4 Y.Y.x.Y.Y.x.x.Y.x.Y.l. @.Y.Y.Y.Y.x.Y.Y.x.Y.Y.x.&. X.Y.x.Y.Y.Y.Y.Y.Y.x.Y.Y.z.Y.Y.x.x.T.x.Y.Y.x.Y.Y.x.&. +.Y.x.Y.Y.Y.Y.+. { x.x.Y.Y.T.Y.x.Y.x.Y.Y.Y.x.Y.Y.x.Y.x.Y.Y.x.Y.Y.Y.x.Y.x.Y.x.x.Y.x.Y.x.T.x.Y.x.Y.Y.Y.Y.x.Y.Y.x.T.T.x.Y.Y.Y.x.T.x.x.x.Y.Y.x.Y.Y.x.T.x.Y.Y.Y.x.Y.Y.x.x.Y.Y.Y.x.Y.x.Y.Y.Y.Y.Y.Y.Y.z.Y.Y.x.Y.Y.Y.Y.x.Y.x.Y.Y.Y.x.Y.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.", | |||
"z.Y.z.Y.Y.z.Y.x.x.Y.x.Y.Y.Y.z.Y.x.Y.x.x.x.Y.x.x.Y.x.x.Y.x.x.x.Y.Y.x.x.x.x.x.x.Y.x.Y.x.x.Y.x.Y.x.x.T.Y.x.Y.x.x.x.Y.x.x.x.x.x.x.T.x.Y.x.x.x.x.Y.x.x.x.x.Y.x.x.x.T.Y.Y.x.x.x.x.Y.x.Y.x.x.Y.x.x.x.Y.Y.Y.z.Y.Y.Y.Y.z.z.Y.x.Y.Y.Y.z.Y.x.Y.Y. l Y.x.Y.} s x.x.Y.} u.z.Y.z.Y.Y.z.Y.z.Y.O i x.x.x.x.x.Y.x.Y.x.x.,. l x.Y.Y.Y.x.x.x.Y.x.x.x.&. X.x.Y.x.x.x.x.x.x.Y.Y.z.Y.Y.x.Y.x.x.Y.x.Y.x.x.x.Y.| &.Y.x.x.Y.x.x.*. x x.Y.x.x.x.x.Y.x.Y.x.x.x.Y.x.x.Y.x.x.x.x.Y.x.x.x.x.x.Y.x.Y.Y.x.x.x.x.T.x.x.Y.x.x.x.Y.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.T.x.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.Y.Y.x.x.Y.x.x.z.Y.z.Y.Y.Y.z.Y.Y.x.x.x.x.Y.x.Y.x.Y.x.Y.x.x.Y.x.x.x.x.Y.Y.Y.x.x.", | |||
"Y.Y.z.Y.x.Y.x.Y.Y.x.z.Y.Y.Y.Y.Y.Y.x.x.Y.Y.x.x.Y.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.Y.x.x.Y.Y.x.x.x.x.x.x.T.x.x.x.Y.x.Y.x.Y.Y.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.x.Y.x.Y.x.x.x.Y.x.Y.x.Y.Y.x.Y.x.x.Y.x.Y.Y.x.Y.z.z.Y.Y.z.Y.z.z.Y.Y.z.Y.z.Y.z.Y.x.Y. l x.Y.x.*. B x.Y.Y.} y.Y.Y.z.Y.z.Y.Y.Y.Y.. i Y.Y.Y.x.Y.x.Y.x.x.Y.} ; < Y.Y.x.Y.Y.x.Y.x.x.x.Y.@. X.Y.x.x.x.Y.Y.x.x.Y.Y.Y.x.Y.Y.x.Y.x.x.Y.x.Y.x.Y.x.+. @.x.x.Y.Y.x.Y.t. l Y.Y.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.Y.x.x.T.x.Y.Y.x.x.Y.Y.x.x.x.x.T.x.x.Y.x.x.Y.x.Y.x.x.T.x.x.x.x.x.T.x.x.Y.x.Y.x.x.Y.x.x.x.Y.x.x.Y.x.x.x.x.x.x.x.x.Y.x.x.x.Y.z.Y.z.z.Y.Y.z.Y.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.x.Y.Y.x.x.Y.Y.x.", | |||
"z.Y.Y.z.x.x.x.x.x.x.Y.x.z.z.Y.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.Y.Y.z.Y.Y.z.Y.Y.z.Y.Y.z.Y.Y.z.x.x.x. l x.x.x.u. } x.x.Y.} y.z.Y.Y.z.Y.z.z.Y.x.O 4 x.x.x.x.x.x.x.x.Y.x.l g O g.x.x.x.x.x.x.x.x.x.x.&. | x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.&. @.x.x.x.x.x.z.y. g Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.Y.x.Y.x.x.x.x.x.x.z.Y.Y.z.Y.Y.z.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.", | |||
"x.x.x.x.x.x.x.x.z.x.z.Y.z.z.z.Y.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.Y.z.z.z.z.Y.Y.z.z.Y.z.Y.z.Y.Y.x.x.x. k Y.x.x.x.. *.x.x.x.} y.x.x.x.x.x.x.x.x.x.O 5 x.x.x.x.z.x.x.x.x.x.4 x i @.x.x.x.x.x.x.x.x.x.z.&. X.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.+. @.x.x.x.x.z.x.y. f x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.Y.z.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.", | |||
"x.x.k.x.z.z.x.z.x.z.Y.z.z.Y.z.z.x.x.x.z.z.x.x.z.z.x.z.z.x.x.k.x.x.z.x.z.z.x.z.x.x.x.z.x.x.z.x.z.x.z.z.x.z.x.z.x.x.z.x.z.z.x.z.x.x.z.x.z.z.x.x.z.z.x.z.x.x.z.x.z.z.x.z.x.z.x.x.k.z.x.x.z.x.z.z.x.z.z.Y.z.Y.z.z.z.z.Y.z.z.z.z.z.z.z.x.x. k z.z.x.z.; u.x.x.x.} y.z.x.z.x.x.z.x.z.z.O 1 z.z.x.z.x.x.z.x.x.Y.O X.l l x.x.z.z.x.x.z.z.x.z.@. | x.x.x.x.z.x.x.x.z.x.z.x.z.x.z.z.x.z.x.z.z.x.z.z.+. @.x.x.z.x.x.x.u. g x.z.x.z.x.x.z.x.z.x.k.x.z.z.x.z.x.z.x.z.x.z.x.z.z.z.x.z.x.z.x.x.z.x.z.z.x.z.z.z.x.x.z.z.x.z.x.z.x.x.x.x.z.z.x.z.x.z.x.z.x.x.z.x.z.x.z.x.z.k.x.x.x.z.x.x.z.x.z.x.z.z.z.z.Y.x.x.k.x.x.z.x.z.x.z.z.x.z.x.z.x.x.z.x.z.x.z.x.z.z.x.x.z.", | |||
"x.z.x.z.x.x.x.x.z.z.Y.z.k.Y.Y.k.x.z.z.x.x.x.x.x.x.z.x.x.x.k.z.x.z.x.x.x.x.z.z.z.z.z.x.x.z.x.x.z.x.x.z.z.x.x.x.x.z.x.x.x.x.z.x.z.x.x.x.x.x.z.z.x.x.z.x.z.z.x.x.x.x.x.x.x.z.x.x.x.x.z.x.z.x.x.x.x.z.Y.z.z.Y.z.z.Y.z.Y.Y.z.z.Y.Y.z.x.z.x. k x.x.z.x.a l.x.z.z.} y.x.z.x.z.z.x.x.x.z.O 1 x.x.z.x.z.x.x.x.x.g. *.| < x.x.x.x.z.x.x.z.x.z.@. | x.x.z.z.x.x.z.z.z.z.x.x.z.x.x.z.z.x.x.x.x.z.x.x.o. @.z.z.x.z.z.z.y. s x.z.x.x.z.z.x.z.x.k.x.x.x.x.z.z.x.x.z.x.z.x.x.z.z.x.x.x.x.z.x.z.x.x.x.z.z.x.z.x.x.z.x.z.x.x.z.x.z.z.x.z.x.x.x.x.x.z.x.z.z.z.x.z.x.z.x.z.x.x.x.k.x.x.z.x.z.x.x.z.x.k.Y.z.z.x.x.z.x.x.x.z.x.x.x.z.x.x.x.x.z.z.x.z.x.x.x.x.x.x.z.z.x.", | |||
"x.k.x.z.z.z.z.z.z.x.z.z.Y.k.Y.z.z.x.z.z.z.z.z.z.z.z.x.k.x.x.x.z.z.z.z.z.x.z.z.z.z.x.z.z.x.z.x.z.z.x.z.z.z.z.z.z.z.z.z.z.x.z.x.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.k.x.z.x.x.k.x.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.x.z.x. k z.z.z.z.x ; z.x.z.x.} y.x.z.x.z.z.z.z.z.x.O 4 z.x.z.z.z.z.z.z.z.#. u.t. l.x.k.x.z.z.x.z.z.z.@. | z.z.x.z.z.z.x.z.z.x.z.x.z.z.z.z.z.z.z.z.x.z.z.z.+. @.x.z.z.z.z.z.u. s x.x.z.z.z.x.z.z.x.k.x.x.k.x.z.x.z.x.z.x.z.z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.x.z.z.z.z.x.z.z.x.z.z.x.z.z.x.z.z.z.z.x.z.z.z.z.x.z.x.x.z.z.x.k.x.k.x.x.z.z.z.z.z.z.x.Y.k.Y.z.k.x.z.x.z.z.z.z.z.z.x.z.z.z.z.x.z.z.z.z.z.z.z.z.k.x.z.z.", | |||
"x.x.z.z.z.z.z.z.z.x.k.x.k.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.x.k.x.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.x.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z. g z.z.z.z.} i x.z.z.z.} y.k.z.z.x.z.z.z.z.z.O 4 z.z.z.z.z.z.z.z.x.( l.l. @.k.z.z.x.z.z.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.| @.z.z.z.z.z.z.u. a z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.x.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.x.z.z.", | |||
"k.z.z.k.z.z.z.z.k.k.x.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.k.x.x.k.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.k.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.k.z.k.z.z.z.z.z.x.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.k.z.z. l z.z.z.x.#. g x.z.z.z.} e.z.z.z.k.z.z.z.z.z.O 1 z.z.z.z.z.z.z.z.x.g @ z.z.; x z.z.z.k.z.z.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.o. @.k.z.z.k.z.z.e. i z.z.z.z.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.k.k.x.x.k.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.k.z.z.", | |||
"z.z.z.z.z.z.z.z.x.k.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.k.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z. k z.z.z.z.f. ( z.z.k.z.} y.z.z.z.z.z.z.z.z.z.O 1 z.z.z.z.k.z.z.z.z.1 < z.z.a 1 z.z.z.z.z.k.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.| o.z.z.z.z.z.z.y. i x.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.k.k.x.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.", | |||
"k.z.k.z.z.k.z.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.z.k.k.x.k.z.k.z.k.k.z.k.z.z.k.z.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.z.k.z.k.z.k.z.k.z.z.z.z.z.k.z.k.z.k.z.k.z.z.k.z.z.k.z.k.k.z.k.z.z.k.k.z.z.k.z.k.k.z.k.z.k.z.z.k.z.k.k.z.k.k.k.z.k.z.k.z.z. k z.z.k.z.z. | k.z.z.k.} y.k.z.k.z.k.z.k.z.k.O i z.k.z.k.z.z.z.k.z.O s z.k.x l.z.k.z.z.z.k.k.j.@. | z.z.k.k.z.k.z.z.k.k.z.k.z.k.z.z.k.k.k.z.k.z.z.z.o. @.k.k.z.z.k.z.y. i z.k.z.k.z.k.z.k.z.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.z.k.z.z.k.z.k.z.k.z.z.k.z.k.z.z.k.z.z.z.k.k.z.k.z.k.z.k.z.k.z.k.k.k.z.k.z.z.k.k.z.k.z.z.k.z.z.k.z.k.z.z.k.z.k.z.k.z.k.z.k.k.z.k.x.z.k.x.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.k.z.k.z.k.", | |||
"z.k.z.k.z.k.k.z.k.z.k.z.k.k.k.x.k.k.z.k.k.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.k.z.k.z.z.k.k.z.k.z.z.k.k.z.z.k.z.k.z.k.x.k.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.k.z.k.z.k.k.z.k.z.k.k.z.z.k.k.x.k.k.z.k.k.z.z.k.z.k.k.z.k.x.z.k.k.z.k.z.k.z.k.z.k. g z.k.k.k.z.> t.k.k.k.z.} e.k.z.z.k.k.z.k.z.k.O 1 k.z.k.z.k.k.z.k.f. x z.z.@. #.z.k.k.z.k.z.k.z.@. | k.z.k.z.k.k.z.k.z.k.z.k.z.k.k.x.k.z.k.z.k.z.k.z.o. @.z.k.z.z.k.k.y. 1 z.z.k.z.k.z.k.z.k.z.k.k.z.k.z.k.x.z.k.k.z.k.z.k.k.k.z.k.z.k.k.k.z.k.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.k.z.z.k.z.k.k.z.k.z.k.z.k.x.k.k.z.k.k.z.k.k.x.k.z.k.z.z.k.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.k.z.k.z.k.z.k.z.z.k.", | |||
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k. l k.z.k.k.k.s g.k.k.k.k.) y.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.@. o.k.k.r. x z.k.k.k.k.k.k.k.O. | k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.o. O.k.k.k.k.k.k.e. 1 z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.", | |||
"k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.z.k. l k.k.k.k.k.x + k.k.k.k.k._ e.k.k.k.k.k.k.k.k.k.O 5 k.k.k.k.k.z.z.k.( 8.z.k.k.@ 4 k.z.k.k.k.k.k.k.@. | k.k.k.k.k.k.z.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.o. @.j.k.k.k.k.k.e. 1 k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.", | |||
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k. l k.k.k.k.k.} , k.k.k.k.k.} e.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.g g.k.k.k.a h.k.k.k.k.k.k.k.O. | k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.o. O.k.k.k.k.k.k.y. 1 k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.", | |||
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.j.k.j.k.k.k.k.k.k.k.k.k.k.k. h k.k.k.j.k.#. s k.k.k.k.k.} e.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.1 @ j.j.k.k.x #.k.k.k.j.k.k.k.O. | k.k.k.k.k.z.k.k.j.k.k.k.k.k.k.k.j.k.k.k.k.k.j.k.` O.k.k.k.k.k.k.e. i k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.j.k.k.k.k.k.k.k.j.k.k.j.k.j.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.j.k.j.k.k.k.j.k.k.j.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.", | |||
"j.j.k.j.k.j.j.k.j.k.j.k.j.k.j.j.j.j.k.k.k.j.j.j.k.j.j.k.j.k.j.k.j.j.k.k.k.j.j.j.k.k.j.k.k.j.k.j.j.k.j.j.j.k.k.j.j.k.k.j.j.j.j.k.k.j.k.j.j.j.k.j.k.k.j.j.j.k.j.k.k.k.j.k.j.k.j.k.j.k.j.k.j.k.j.k.j.k.k.j.k.j.j.k.k.j.j.j.j.k.j.j.k.j.k. k j.j.k.k.j.f. x j.j.j.j.j._ e.j.j.k.k.k.j.k.j.j.O 1 j.k.j.k.k.j.j.k.. 4 k.j.j.j.#. x k.k.k.j.j.k.j.@. s ( ( ( ( _ ( ( ( } ( ( ( _ ( ( ( } 8.k.j.k.j.k.j.o. O.k.j.k.j.k.j.e. 1 k.j.j.j.k.k.k.j.k.j.k.k.j.k.j.k.j.j.j.k.k.k.k.j.j.j.k.j.k.j.k.j.j.j.k.j.j.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.j.j.k.k.k.j.j.j.j.j.k.k.j.k.k.j.j.j.k.j.k.j.j.k.j.j.k.j.k.k.j.j.j.k.k.j.k.k.k.j.k.k.j.k.j.k.j.k.j.j.k.j.k.j.k.j.k.k.j.j.j.", | |||
"j.k.j.k.k.j.j.k.j.k.k.j.k.j.k.j.j.k.j.j.j.k.k.j.j.k.k.j.j.k.k.j.j.k.j.j.j.k.k.j.k.j.j.k.j.j.j.j.j.k.j.k.j.j.j.j.k.j.j.k.k.j.j.j.j.j.k.k.k.j.j.k.j.j.k.j.j.k.j.k.k.j.j.j.j.j.j.k.j.k.j.j.j.j.k.j.k.j.j.k.j.k.k.j.j.k.k.j.k.j.j.j.j.k.j. h j.j.j.j.j.k.. | k.k.j.k.j.} e.j.k.j.j.j.j.j.k.j.O 1 k.j.j.k.j.j.k.r. g j.k.j.k.f. i j.j.j.k.j.k.j.@. ( j.k.k.j.k.j.o. o.j.j.k.k.j.k.e. 1 j.j.k.j.k.k.j.k.j.k.j.j.k.j.j.k.j.j.k.k.j.j.k.k.j.j.k.k.j.k.j.j.j.j.j.j.k.k.j.j.j.k.j.j.k.j.k.k.j.k.j.j.k.k.k.j.j.k.j.j.k.k.j.j.k.j.j.j.j.j.k.j.j.k.j.k.k.j.k.j.j.j.j.k.j.j.j.j.j.j.k.k.j.j.k.k.j.j.j.k.j.j.j.k.j.j.k.k.j.j.k.k.j.", | |||
"k.j.k.j.j.j.k.j.j.k.j.j.k.j.j.k.j.j.k.j.k.j.j.k.j.k.j.j.k.j.j.j.j.j.k.j.k.j.j.k.j.j.k.j.j.k.j.j.k.j.k.j.k.k.j.k.j.j.k.j.k.j.k.j.j.k.j.j.j.k.k.j.j.k.j.k.j.j.k.j.j.j.k.k.j.k.j.k.k.j.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.j.k.j.j.j.k.k.j.j.k. k j.j.k.k.j.j.< #.j.j.k.j.j._ e.k.j.k.j.k.k.j.j.j.O 1 j.k.j.j.j.k.k.O. ( k.j.k.j.j.@ j.k.j.k.j.j.j.O. x k.j.j.k.j.k.` O.j.k.j.j.j.k.y. 1 k.k.j.j.k.j.j.k.j.j.k.j.j.j.k.j.k.k.j.j.k.j.j.j.k.j.k.j.j.k.j.j.j.j.k.k.j.j.k.j.k.j.k.j.j.k.j.j.j.j.k.k.j.j.j.k.j.j.k.j.k.j.j.k.j.k.j.k.k.j.j.k.j.j.k.j.j.k.j.j.k.k.k.j.k.k.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.k.j.j.k.k.j.j.j.k.j.j.k.", | |||
"j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j. g j.j.j.j.j.d.s r.j.j.j.j.j._ e.j.j.j.j.j.j.j.j.j.O 1 k.j.j.j.j.j.j.( o.j.j.j.j.j.a 8.h.j.j.j.j.j.O. ( j.j.j.j.j.d.o. O.k.j.j.j.j.j.e. 1 j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.", | |||
"j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j. l j.j.j.j.j.j.x h.j.j.j.j.j.} 0.j.j.j.j.j.j.j.j.j.O 1 j.j.j.j.j.j.j.g 0.j.j.j.j.d.( ( k.j.j.j.j.j.O. x j.j.j.j.j.j.` O.j.j.j.j.j.j.e. 1 j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.", | |||
"j.d.j.d.d.j.d.j.d.j.j.j.j.d.j.j.j.j.j.d.j.d.j.j.j.d.j.j.j.j.d.j.j.j.j.j.j.d.j.d.d.j.j.j.j.j.d.j.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.j.j.j.d.j.j.j.j.d.j.j.j.j.j.d.j.d.j.d.j.d.d.d.j.d.j.j.j.d.j.d.j.j.j.j.j.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.j. h j.j.j.j.d.d.| ; d.j.j.d.j.d._ e.j.d.j.d.d.j.d.j.d.O 1 j.j.d.j.j.j.j., h.j.j.d.j.j.8. 1 j.j.d.j.j.j.O. z d.j.j.j.d.d.o. O.j.j.d.j.j.j.9. i j.j.d.j.d.j.j.d.j.d.j.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.d.j.j.j.j.d.j.j.j.j.j.j.j.j.d.j.d.j.d.d.j.d.j.j.d.d.j.j.j.d.j.j.j.j.j.j.j.j.d.d.j.d.j.j.j.j.j.j.j.j.d.j.j.j.d.j.j.j.j.j.d.j.d.d.j.j.j.j.d.j.j.d.j.j.j.j.d.j.j.j.j.j.j.j.j.j.d.", | |||
"j.j.j.j.j.j.j.j.j.j.j.d.j.j.d.j.d.d.j.j.j.j.d.j.j.j.j.d.d.j.j.j.d.d.j.j.j.d.j.j.j.j.d.j.d.j.j.j.d.d.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.d.j.j.j.j.j.j.d.j.j.j.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.d.j.d.j.j.j.d.j.j.d.j.j.j.j.d.j.j.j. l d.d.j.j.j.d.8. i j.j.d.j.j.j._ e.j.j.j.j.j.j.j.j.j.O 1 d.j.j.j.d.j.j.. ; d.d.j.j.j.d.h.. h.j.j.d.j.j.O. x j.j.d.j.j.d.o. O.j.j.j.d.d.j.e. 1 j.j.j.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.d.d.j.j.j.d.j.j.j.d.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.d.j.j.j.j.j.d.j.d.d.j.j.j.j.j.j.j.d.d.j.d.j.j.j.d.j.j.j.j.d.d.j.j.j.j.j.j.j.d.j.j.j.j.d.j.j.j.d.j.j.d.j.j.j.d.j.d.d.j.j.", | |||
"d.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.d.j.d.j.d.j.d.j.j.j.d.j.d.j.j.d.j.j.d.j.d.j.d.j.d.j.d.j.j.d.d.d.j.d.d.j.d.d.d.j.j.d.d.j.d.j.j.d.j.j.d.j.d.j.j.j.d.j.j.d.j.j.j.d.d.j.d.j.j.d.d.j.d.d.j.d.d.j.j.j.d. h d.j.d.j.d.d.f. g j.j.j.d.j.j._ 0.d.d.d.j.d.j.j.d.d.O 1 d.j.d.j.j.d.r. i j.j.j.d.d.j.d.1 8.d.j.d.d.d.O. x d.d.d.d.j.d.` O.d.d.j.j.j.s.e. 1 d.d.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.d.j.j.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.j.d.j.d.d.j.d.d.d.j.d.j.j.d.d.d.j.d.d.j.d.d.d.j.j.j.j.j.d.j.j.j.d.d.d.j.j.d.j.j.d.j.d.j.d.d.j.j.d.j.d.j.d.j.d.j.d.d.j.j.d.j.d.j.d.j.j.d.j.j.j.d.d.j.j.j.d.j.", | |||
"d.j.j.d.d.d.d.j.d.d.d.j.d.d.d.d.j.d.j.d.d.d.d.d.d.d.d.j.j.d.d.j.j.d.j.d.d.d.j.d.d.d.d.d.d.d.d.j.j.d.d.d.d.d.d.j.d.d.j.d.d.d.d.j.d.j.j.d.j.d.d.j.d.d.d.j.d.d.d.d.d.j.d.d.j.d.d.j.d.d.d.d.d.j.d.d.d.j.d.d.d.d.d.d.d.j.d.j.d.j.d.d.d.d.j. h d.j.d.d.j.j.d.. ( d.d.d.d.d.d._ 0.d.j.j.d.d.d.d.j.d.O 1 d.d.d.d.d.j.O. j d.d.d.d.j.j.d.x ( d.d.d.j.d.O. ( d.d.d.d.j.d.o. O.j.d.d.s.j.s.e. 1 d.j.d.j.d.d.d.d.j.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.j.j.d.d.j.d.d.d.d.d.j.j.d.j.d.j.d.d.d.d.j.d.j.j.d.j.d.d.j.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.j.d.d.d.d.d.j.d.j.d.d.d.d.d.d.d.d.j.d.d.j.d.d.d.j.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.", | |||
"d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.j.d.d.d.d. g d.d.d.d.d.d.d., O.d.d.d.d.d.d._ 0.d.d.d.d.d.d.d.d.d.O 1 d.d.d.d.d.d.( _ d.d.d.d.d.d.d.O. i d.d.d.d.d.O. x d.d.d.d.d.d.' ] d.d.d.d.d.s.e. 1 d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.", | |||
"d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d. l d.d.d.d.d.d.d.p 9.d.d.d.d.d.d._ 0.d.d.d.d.d.d.d.d.d.O 1 d.d.d.d.d.d.p #.d.d.d.d.d.d.d.q. . d.d.d.d.d.O. x d.d.d.d.d.d.` O.d.d.d.d.d.d.9. 1 d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.", | |||
"d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.d.s.d.s.s.d.s.d.d.d.s.d.d.d.d.d.s.j.j.s.d.d.d.d.d.s.s.j.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.s.d.d.d.d.d.d.d.d.d.d.s.d.s.d.d.d.d.d.d.d.d.d. l s.j.s.s.d.d.d.z p.j.s.d.d.d.d._ 9.d.d.s.d.d.d.d.d.d.O 1 s.d.d.d.d.s., q.d.d.d.d.d.d.d.d.; 8.j.d.d.d.O. x j.d.d.s.d.s.` ] d.d.d.s.d.j.9. i d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.s.d.d.d.d.s.d.d.d.d.d.d.d.d.d.d.s.d.d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.", | |||
"s.d.s.d.d.s.d.s.d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.d.d.s.d.d.s.s.s.d.s.d.s.d.s.j.s.s.d.d.s.d.s.d.s.d.s.d.s.d.d.s.d.d.d.s.d.s.d.d.s.d.d.d.d.s.s.d.s.d.d.s.d.s.d.s.s.d.d.s.d.d.s.d.s.d.d.d.d.s.d.s.s.d.s.d.d.d.d.d.d.s.s.d.s.d.d.s.d.. h j.d.s.d.d.d.s.` + d.d.d.d.d.s.d.) 9.s.d.d.d.d.s.d.d.s.O i d.d.s.d.s.s.. . d.d.d.d.d.s.s.d.s.h ( d.d.s.s.O. ( d.d.d.d.d.d.' O.s.s.d.s.d.s.9. 1 d.d.d.d.d.s.d.s.d.s.d.s.d.s.d.s.d.s.d.s.d.s.s.d.d.d.s.d.s.s.d.s.d.s.d.s.d.d.s.d.d.d.s.d.d.s.d.s.d.d.s.s.d.s.d.d.s.d.s.s.d.s.d.d.s.d.d.s.d.s.d.d.d.d.s.s.d.d.d.d.s.d.s.s.d.s.d.d.d.d.d.d.d.d.d.s.d.d.s.d.s.d.s.s.d.d.s.d.d.s.d.d.d.", | |||
"d.s.s.s.s.s.s.d.s.s.s.d.s.s.s.s.s.d.s.d.s.d.s.d.s.d.s.d.s.s.d.s.s.j.s.d.s.s.s.d.s.j.s.d.s.s.s.d.s.d.d.s.d.s.s.s.s.s.s.s.s.s.s.d.d.s.d.s.d.s.s.s.s.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.s.d.d.s.s.d.s.s.s.d.s.d.s.d.s.s.d.s.d.s.s.s.d.s.s.d.d. g s.s.s.s.d.s.s.8. , d.s.s.d.s.s.s.) 9.s.d.s.d.s.s.d.s.s.O 1 s.d.d.s.s.9. , s.d.s.s.s.d.s.s.s.O. i s.s.d.d.] z s.s.s.d.s.s.' ] s.d.s.s.d.s.0. 1 s.s.d.s.d.d.s.d.s.d.s.d.s.s.d.d.s.s.d.d.s.d.s.s.s.s.s.s.d.d.s.d.s.s.d.d.s.s.s.d.s.s.s.d.s.s.d.d.s.d.s.s.d.d.s.s.d.s.s.d.d.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.d.s.d.s.d.s.d.s.d.d.s.s.d.d.s.s.d.s.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.s.s.s.s.", | |||
"d.s.d.s.d.s.d.s.s.d.s.d.s.d.d.s.s.s.d.s.d.s.s.s.d.s.s.d.s.d.s.s.s.s.s.s.s.j.s.s.s.s.d.s.s.d.s.d.s.s.s.s.d.s.d.s.d.s.d.s.s.d.s.d.s.s.d.s.s.s.d.d.d.s.s.d.d.d.s.d.s.d.s.s.s.d.d.s.d.s.d.s.d.s.d.d.d.s.d.s.d.s.s.d.s.d.s.d.d.s.s.d.s.s.j. h d.s.d.d.s.d.d.p. p s.d.d.s.s.s.s._ 9.d.s.s.d.s.d.s.s.s.O 1 d.s.s.d.s.' p s.s.s.d.s.d.s.s.s.q. . s.d.s.d.] z s.s.d.s.d.s.' O.s.s.s.d.s.s.0. 1 s.d.s.d.s.s.d.s.s.s.d.s.d.s.s.s.s.d.s.s.s.d.s.d.s.s.d.d.s.s.d.s.s.d.s.s.d.s.d.s.s.s.d.s.d.s.s.s.s.s.s.d.s.s.s.d.s.s.d.s.s.s.s.s.d.d.s.d.s.s.s.s.d.d.d.s.s.s.d.s.s.d.s.d.s.s.d.s.s.s.s.d.s.s.d.s.d.d.d.s.d.s.d.s.s.s.d.d.s.d.d.s.d.", | |||
"s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.d.s. h s.s.s.s.s.s.s.s.O x s.s.s.s.s.s.s.) 9.s.s.s.s.s.s.s.s.s.. 1 s.s.s.s.s.( ( s.s.s.s.s.s.s.s.s.a., 8.s.s.s.] z s.s.s.s.s.s.` ] s.s.s.s.s.a.9. 5 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.", | |||
"s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.s.s.s.s.s.s.d. g s.s.s.s.s.s.s.s.< ) s.s.s.s.s.s.s._ 9.s.s.s.s.s.s.s.s.s.O 1 s.s.s.s.s.p | s.s.s.s.s.s.s.s.s.p.( ) s.s.s.] z s.s.s.s.s.s.' ] a.s.s.s.s.s.9. 1 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.", | |||
"s.s.a.s.a.s.s.s.s.a.s.a.a.s.s.s.a.s.s.s.s.s.a.s.s.s.s.a.s.s.s.s.a.s.a.s.s.s.s.a.a.s.a.s.s.a.s.s.a.s.s.s.a.s.s.s.s.s.s.a.s.a.s.s.s.s.s.s.a.s.a.a.s.a.a.s.s.s.a.s.s.s.a.s.a.s.s.s.s.s.a.s.s.s.a.a.s.s.s.a.s.a.s.s.s.s.a.s.a.s.s.s.s.a.s. h s.a.s.s.s.a.a.s.g <.p.s.s.a.s.a.s.) 9.s.s.s.a.s.a.s.s.a.. 1 s.s.s.s.s., 8.s.s.s.w.s.s.w.s.s.s.<. p s.a.a.] z s.s.a.a.s.s.' ] a.s.s.a.s.s.9. i a.s.s.a.s.s.s.a.s.s.a.s.s.s.s.a.s.s.w.s.s.s.a.s.a.a.s.s.s.s.s.a.s.s.s.s.a.a.s.s.s.s.a.s.s.s.s.a.s.s.s.s.s.a.a.s.s.a.s.s.s.a.s.s.s.s.s.s.a.s.s.s.a.s.s.a.a.s.a.s.s.s.s.s.a.s.a.s.s.a.s.s.s.s.a.s.a.s.a.s.s.s.s.a.a.s.s.s.a.s.s.s.s.", | |||
"a.a.s.s.s.s.a.a.s.s.s.s.s.s.a.a.s.s.s.a.a.s.s.s.a.a.s.s.a.s.a.s.s.s.a.s.s.a.s.s.s.s.a.s.s.a.s.a.s.s.a.s.s.s.a.s.a.a.s.s.s.s.a.a.s.a.a.s.s.s.s.s.s.s.s.s.a.a.s.s.a.s.s.s.a.s.s.a.a.s.s.a.a.s.s.s.s.a.s.a.s.s.s.a.a.s.s.s.a.s.a.s.a.s.s. h s.s.a.a.s.s.s.w.( q.s.s.s.s.s.s.a.) e.a.a.s.s.s.s.a.a.s.O 1 w.s.s.s.s. p.s.s.s.s.s.s.s.s.s.s.p.. O s.a.s.] z a.a.s.s.a.p.' ] s.a.s.a.s.s.9. . . 1 s.a.a.s.s.a.s.s.s.a.s.s.a.a.s.s.s.s.s.s.s.s.a.s.s.s.s.a.s.a.s.s.s.a.a.s.s.s.s.a.a.s.s.s.a.a.s.s.s.a.s.a.s.s.s.s.a.s.s.a.s.s.s.a.s.a.s.s.s.s.a.s.s.a.s.s.s.s.s.s.a.s.a.s.a.s.s.s.a.s.s.a.a.s.s.s.s.s.s.s.a.a.s.s.s.s.a.s.s.a.a.s.s.", | |||
"s.a.a.s.a.a.s.a.s.a.s.s.a.s.a.s.a.a.a.s.a.s.a.s.s.a.s.a.s.a.s.a.a.s.s.a.s.s.s.a.a.s.a.s.a.s.s.s.a.s.s.s.a.s.s.a.a.a.s.s.a.s.s.s.a.s.s.a.s.s.a.s.a.s.s.a.s.s.a.s.a.a.s.s.a.s.s.s.s.a.a.s.a.s.s.a.a.s.a.s.a.s.a.s.a.a.s.a.a.s.a.s.a.s.s.j j j j j j j j j j j j j j j j j j j j j ] a.a.s.s.a.a.a.a.<.j j j j j j j j j j j j j j j w.s.s.s.a.s.s.a.<.j j j j j j j j j j j j j j j j j j j j j q.s.a.s.a.s.s.a.s.s.( h g h h h h h h h h h h h h j h h h h h h h h ) s.s.s.s.q.j j j j j j j j j j j j j j j j j j j j j j j z s.s.a.s.s.s.s.a.s.s.a.s.) j j j j j j j j j j j j j j j j j j j j j j q.s.a.0.h h h h h h h h h h h h h j h h h h h h h h h h h h h h h h j h h h h h h h h h h h [ a.s.a.s.s.a.9.j j j j j j j j j j j j j j j j j j j j j j j j 9.a.a.a.s.a.a.q.j j j j j j j j j j j j j j j j z j j j j j ) s.a.s.s.a.s.a.s.a.a.a.s.s.a.s.s.a.s.w.a.s.a.s.a.s.s.a.s.s.a.a.s.a.s.a.s.a.s.a.s.a.a.s.a.s.a.s.s.a.s.a.a.s.a.s.s.s.a.a.s.a.s.s.a.s.s.a.s.s.a.s.s.a.s.s.a.s.s.a.a.s.a.s.a.s.s.a.s.s.a.s.a.s.s.a.s.a.s.a.s.s.w.s.s.a.a.s.a.s.a.s.a.s.", | |||
"a.a.s.a.a.s.s.a.a.a.a.a.a.a.s.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.s.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.s.s.w.w.w.s.w.a.a.a.p.a.s.s.s.w.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.a.s.a.s.s.s.w.w.s.a.w.a.a.a.a.a.s.a.a.a.a.p.a.w.s.a.w.a.a.s.a.a.a.s.a.s.s.a.s.a.a.w.s.a.a.a.a.a.a.a.a.w.s.w.a.a.a.a.s.a.a.w.s.s.w.w.s.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.s.w.w.s.s.a.7.s.w.s.a.w.a.a.a.s.s.w.s.a.a.a.a.a.s.s.s.w.w.s.a.w.w.s.s.w.a.a.a.a.s.a.a.a.a.a.a.a.p.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.s.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.a.a.a.a.a.a.s.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.w.s.s.s.w.s.s.w.s.a.a.a.a.a.", | |||
"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.s.s.w.a.a.a.a.a.a.w.w.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.s.w.a.a.a.a.a.a.a.a.s.w.a.a.w.a.a.a.a.s.w.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.w.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.a.a.a.a.a.w.w.s.s.a.a.a.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.a.a.w.w.s.s.a.a.a.a.", | |||
"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.w.s.w.a.a.a.a.a.a.s.s.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.w.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.w.a.w.a.a.a.a.w.a.a.a.a.a.a.s.w.a.a.a.a.a.a.a.w.a.a.w.w.s.w.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.w.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.a.a.a.a.a.w.s.w.w.a.a.a.a.w.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.w.s.w.w.a.a.w.s.w.w.a.a.w.a.", | |||
"a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.s.w.w.s.w.a.a.a.w.w.s.w.w.s.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.s.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.s.w.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.a.a.w.s.w.a.s.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.s.s.w.w.s.w.a.a.w.s.w.s.a.a.a.a.", | |||
"w.a.w.a.w.w.a.w.a.a.a.w.w.a.w.a.a.a.7.a.a.w.w.a.a.a.7.a.w.a.w.a.w.a.w.a.a.a.w.a.w.a.w.a.a.w.w.a.a.w.a.a.a.a.a.w.w.a.a.a.w.a.w.a.a.a.w.a.a.a.a.w.w.a.w.a.a.w.a.w.a.a.w.a.a.w.w.a.w.a.w.w.a.a.w.a.w.a.w.a.a.w.a.w.a.a.a.w.w.a.w.a.a.a.w.a.a.a.7.a.a.a.w.a.w.a.a.w.a.a.w.a.a.w.a.a.w.w.a.w.a.a.w.a.a.w.w.a.a.w.w.a.w.a.a.a.a.w.w.a.w.w.w.s.w.a.w.a.w.s.w.w.w.s.w.w.a.a.a.w.a.w.a.a.a.w.w.a.a.a.7.a.a.w.a.a.w.a.a.w.w.a.w.a.7.a.w.a.a.w.a.a.w.a.a.w.a.a.a.w.a.a.w.a.w.a.w.a.w.a.a.w.a.a.a.w.w.a.w.a.w.a.a.a.w.a.a.w.w.a.a.a.w.a.w.a.w.a.a.w.w.a.a.7.w.a.w.a.w.w.w.a.a.w.w.a.w.w.a.w.a.a.w.a.a.a.w.a.s.w.w.a.a.w.w.a.a.w.a.a.a.w.7.a.w.w.a.w.a.w.w.a.a.w.a.a.w.a.a.w.w.s.w.w.w.a.w.a.a.w.a.w.a.a.a.w.a.a.w.a.a.w.a.w.a.a.a.w.w.a.w.a.a.a.a.w.a.a.7.a.w.a.w.a.w.a.a.w.a.w.w.w.w.a.w.a.a.a.a.a.w.a.a.a.w.a.w.a.w.a.a.w.w.a.w.a.w.w.a.w.a.w.a.a.a.a.a.w.a.a.w.a.a.w.a.a.w.a.w.w.w.a.w.a.w.a.w.w.a.w.a.a.w.a.a.w.a.a.a.w.a.w.w.a.a.w.a.w.w.a.w.w.w.a.w.a.w.w.a.w.w.a.w.a.w.a.a.w.a.w.w.a.7.a.w.a.a.a.w.w.a.w.a.a.w.w.a.a.a.w.w.a.w.a.w.a.w.w.s.w.w.a.a.w.w.w.w.a.w.a.w.w.", | |||
"w.w.w.w.w.a.w.w.w.w.w.a.w.w.a.w.w.a.a.a.a.a.w.a.a.w.w.a.w.a.w.a.w.w.a.w.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.a.w.w.w.w.a.w.w.w.a.w.a.w.w.a.a.w.a.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.w.a.w.w.w.w.a.w.w.w.s.w.w.a.a.a.a.7.a.a.w.a.w.w.a.a.w.w.a.w.w.w.w.a.w.w.w.a.a.a.a.a.a.a.w.w.w.w.w.a.w.w.w.a.w.a.w.w.w.a.a.w.a.w.a.w.a.w.w.w.w.w.a.w.w.a.w.w.a.a.7.7.a.w.w.a.w.w.w.w.a.w.w.a.w.w.w.a.a.a.a.w.a.w.a.w.a.w.w.w.a.w.w.w.a.a.a.a.a.w.a.a.7.7.a.7.w.w.a.w.w.w.a.w.w.w.w.7.a.a.a.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.w.a.w.w.w.a.w.a.w.w.7.a.7.a.a.w.w.w.w.a.a.w.w.w.w.w.w.a.w.a.w.w.w.w.a.w.w.w.a.w.w.w.w.a.a.w.a.w.7.a.w.a.w.w.w.a.w.a.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.a.w.a.w.w.w.a.w.a.w.w.w.w.w.w.w.a.w.a.w.w.w.a.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.a.w.w.a.w.w.w.w.a.w.w.a.w.w.w.w.w.w.a.w.w.w.w.a.a.w.w.w.w.a.", | |||
"w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.7.a.7.7.a.7.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.w.w.7.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.a.7.a.a.w.w.w.w.w.w.w.w.w.w.w.w.a.7.7.a.7.w.w.w.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.", | |||
"w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.a.w.w.7.a.7.a.7.a.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.a.a.7.7.a.a.a.w.w.w.w.w.7.a.7.a.7.a.w.w.w.a.w.w.a.7.a.7.w.w.w.w.a.7.a.7.a.7.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.a.7.a.a.7.a.7.a.7.w.w.w.w.w.w.w.w.w.w.7.a.a.w.w.w.w.w.w.w.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.7.a.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.", | |||
"w.w.w.w.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.7.w.w.w.w.7.w.w.w.w.w.w.w.w.7.w.w.7.w.w.7.w.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.w.w.w.7.w.w.w.a.7.a.7.w.7.w.w.7.w.w.7.w.w.7.w.w.w.w.w.w.7.7.w.7.w.w.w.w.w.7.w.w.w.w.w.w.w.7.w.7.w.a.7.7.a.7.a.7.a.w.7.7.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.7.w.w.7.w.w.w.7.7.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.w.w.7.w.w.w.7.w.w.7.a.7.a.7.a.w.7.7.w.a.7.7.w.7.w.7.w.7.a.7.a.7.7.7.a.7.w.w.w.a.7.a.7.w.7.w.w.7.w.w.7.7.a.7.a.w.w.w.7.7.a.7.a.7.a.w.w.w.7.w.7.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.7.7.a.7.w.w.7.w.7.7.a.7.a.7.a.7.w.w.w.7.w.w.w.w.w.7.w.7.w.a.7.7.w.7.w.a.7.a.7.a.7.w.w.w.7.w.w.7.w.w.w.w.7.7.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.7.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.7.w.w.w.7.w.w.w.w.7.w.w.7.w.w.7.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.7.w.w.7.w.w.w.7.w.w.w.w.7.w.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.w.w.7.", | |||
"7.w.w.w.w.7.7.7.w.7.w.w.w.7.7.w.w.7.7.w.w.w.7.7.7.w.w.7.7.w.7.7.w.w.7.w.w.7.7.7.w.w.7.w.7.w.w.7.w.7.7.w.7.w.7.w.w.7.7.w.7.w.7.w.7.7.w.w.w.7.7.7.7.a.a.7.7.a.7.w.w.w.7.w.7.w.w.7.w.7.w.w.7.w.w.w.w.7.7.w.7.w.7.w.7.7.w.7.7.w.w.w.7.w.7.7.w.7.w.7.7.a.7.a.w.w.7.w.w.7.7.w.7.w.7.7.w.w.7.w.w.w.w.7.7.w.7.w.w.7.w.7.w.7.7.w.w.7.w.7.7.w.w.w.w.w.7.w.w.7.7.w.7.w.w.w.7.w.7.7.w.7.7.a.7.a.a.7.7.w.7.w.7.w.w.7.7.7.7.7.7.w.7.7.7.w.7.7.7.a.7.w.7.a.7.w.w.w.7.w.a.7.7.w.7.w.w.7.7.7.7.7.7.7.w.w.7.w.w.7.w.7.7.w.7.w.7.w.w.7.7.w.7.w.7.w.7.7.w.w.w.7.7.w.w.7.7.w.w.w.7.7.7.w.7.7.7.w.7.w.w.7.w.7.7.a.7.a.7.a.w.7.7.a.a.7.7.w.w.w.7.7.w.7.7.w.w.7.w.w.w.7.w.w.7.a.w.7.7.7.w.7.7.w.7.w.w.w.w.w.7.w.w.w.w.w.7.w.7.w.7.7.w.7.7.7.w.7.7.w.w.w.7.7.w.w.w.7.7.w.w.7.7.w.7.w.7.7.7.w.w.w.w.7.w.7.w.7.w.7.7.w.w.w.7.w.7.7.w.w.w.7.7.w.w.w.w.7.w.7.w.7.w.7.7.w.7.w.w.7.7.w.w.7.7.w.w.7.w.w.7.w.w.7.7.w.w.w.w.w.7.w.7.w.7.w.7.w.7.w.7.w.7.w.w.7.w.7.7.w.7.w.7.w.7.7.w.7.a.7.7.7.w.w.w.w.7.7.7.w.w.7.7.w.7.w.7.w.7.w.w.7.w.7.w.7.w.7.7.7.w.7.7.w.w.w.w.w.w.w.w.7.7.w.w.w.7.7.7.w.w.7.", | |||
"7.7.7.w.7.w.7.7.w.w.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.w.7.w.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.a.7.7.w.7.7.w.w.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.a.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.w.7.7.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.w.w.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.", | |||
"7.w.w.7.7.w.7.7.7.w.7.w.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.w.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.w.7.7.w.w.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.7.7.7.w.7.w.7.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.w.7.w.7.7.w.7.7.7.w.7.7.7.w.7.w.7.7.7.7.7.w.7.7.7.w.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.w.", | |||
"7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.w.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.", | |||
"7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.", | |||
"7.7.5.7.5.7.7.7.5.7.7.5.7.5.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.6.7.6.7.6.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.6.7.6.6.7.7.7.7.6.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.6.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.5.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.6.7.6.7.6.7.6.7.7.7.6.7.7.7.7.6.7.6.7.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.6.7.7.7.7.6.7.7.6.7.6.7.6.7.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.7.7.6.6.7.7.6.6.7.6.7.6.7.7.7.7.7.6.6.7.7.6.7.7.7.7.7.7.7.6.6.7.7.6.7.7.7.6.7.6.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.6.7.6.7.7.7.7.7.7.6.7.7.7.7.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.6.7.6.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.7.6.7.7.7.7.7.6.7.6.7.6.", | |||
"7.7.7.6.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.5.7.7.5.7.6.7.7.6.7.6.7.6.7.6.7.6.7.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.6.6.7.7.7.6.7.7.6.7.6.7.7.7.7.7.6.7.6.7.6.7.7.7.7.6.7.6.6.7.6.7.6.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.5.7.7.7.7.6.7.7.7.6.7.7.6.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.6.7.6.6.7.6.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.6.7.7.7.7.6.7.7.7.7.7.6.7.6.7.7.6.7.6.7.6.7.6.7.6.7.7.6.6.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.6.7.6.7.7.7.7.6.7.7.7.7.7.7.7.6.7.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.7.7.6.7.6.7.7.6.7.6.7.7.6.7.6.7.6.7.7.7.6.6.7.7.6.7.7.7.7.7.6.7.6.7.6.7.7.6.7.6.7.6.7.6.6.6.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.6.7.7.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.6.7.7.6.7.6.7.7.7.6.7.6.7.7.6.7.6.7.7.7.7.7.7.6.7.7.7.6.", | |||
"6.6.7.7.7.7.6.7.7.7.7.7.5.7.7.5.6.7.6.7.7.6.6.7.7.7.6.6.6.6.6.7.6.7.6.6.7.7.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.7.6.7.6.7.7.6.6.7.6.7.7.6.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.7.7.6.7.6.7.7.6.6.7.7.6.6.7.7.7.6.7.6.7.6.6.7.6.7.7.7.7.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.7.6.7.7.7.7.5.7.7.6.7.6.7.6.7.7.6.6.6.7.6.6.7.7.6.6.7.7.7.6.6.6.7.7.6.7.7.6.7.6.6.7.6.6.7.6.7.7.7.6.7.6.6.7.7.7.6.7.7.7.7.7.7.6.7.6.7.7.6.6.7.7.7.6.7.6.6.6.7.6.6.7.7.7.7.6.7.6.7.5.7.7.6.6.7.6.7.7.6.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.7.6.7.7.6.7.6.6.7.6.6.7.6.7.6.7.7.6.6.7.7.6.7.6.7.6.6.6.7.6.6.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.6.7.7.6.6.7.7.7.6.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.7.7.6.7.7.6.6.7.7.7.7.7.6.7.6.7.7.6.6.7.7.7.7.7.7.6.7.6.7.7.6.7.7.6.6.6.6.7.6.6.7.7.6.7.6.6.7.7.7.7.7.6.7.6.6.7.7.6.7.6.6.6.7.6.6.6.6.7.6.7.6.6.7.7.6.7.6.6.7.7.7.6.6.7.6.6.7.6.6.7.6.7.7.6.6.7.7.7.6.7.6.6.6.7.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.6.7.6.7.7.6.6.7.7.6.7.6.7.6.7.7.6.7.7.6.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.6.7.6.6.7.6.7.", | |||
"6.6.7.6.6.6.6.6.5.7.7.5.6.7.7.5.7.6.6.6.6.6.7.6.6.6.6.7.6.7.7.6.6.6.6.7.6.6.6.6.5.7.6.7.6.7.6.7.7.6.6.6.6.7.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.6.7.6.6.6.7.6.6.6.6.7.6.6.6.6.7.7.6.6.7.6.7.6.6.7.6.6.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.6.6.5.7.7.7.6.7.6.7.6.6.7.6.6.7.6.6.7.6.7.6.6.7.7.6.6.6.6.7.7.6.6.6.6.7.6.6.6.6.7.6.7.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.7.6.7.7.5.7.7.6.6.6.6.6.7.6.6.6.6.6.6.7.7.6.6.6.7.6.6.6.6.6.7.6.6.7.7.7.6.7.7.6.6.6.6.7.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.6.6.7.6.7.6.6.6.7.6.6.6.6.7.6.7.6.7.6.6.6.7.6.6.7.6.6.7.6.6.7.6.6.6.6.6.6.7.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.7.7.6.6.6.6.7.6.7.6.6.6.6.6.7.6.6.7.6.6.6.7.6.6.7.6.6.6.7.6.6.6.6.6.7.7.6.6.6.7.6.6.6.6.6.7.6.6.6.6.7.7.6.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.7.6.7.6.6.7.6.6.7.6.7.7.6.6.6.6.7.6.6.6.6.6.7.7.6.6.6.7.6.6.7.6.6.7.6.6.6.6.6.7.6.6.6.6.6.6.7.7.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.7.6.6.5.7.7.7.6.7.5.7.6.6.7.6.6.7.6.6.6.6.7.6.6.6.6.6.5.7.6.7.6.7.6.7.", | |||
"6.6.6.6.6.6.6.6.7.5.5.7.6.6.6.7.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.7.5.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.7.6.6.5.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.", | |||
"6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.5.5.6.5.6.6.6.6.6.6.6.6.6.6.5.6.7.5.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.5.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.5.6.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.5.6.5.6.6.6.6.6.6.6.", | |||
"6.6.5.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.6.6.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.5.7.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.5.5.6.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.5.6.6.6.6.6.6.5.6.6.6.6.6.5.6.6.5.6.5.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.", | |||
"6.5.6.5.6.6.6.5.5.5.6.5.5.6.5.6.5.6.6.6.6.5.6.5.6.6.5.6.6.6.5.6.5.6.5.6.6.6.5.6.5.6.6.5.6.6.6.5.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.6.6.6.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.6.5.5.5.6.5.6.6.6.6.5.5.6.5.5.6.5.6.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.5.6.6.6.5.6.6.5.6.5.6.6.6.6.6.6.5.6.5.6.6.6.5.6.5.6.6.6.5.6.5.6.5.6.5.5.6.5.6.5.6.6.5.5.5.6.6.5.6.5.6.5.6.6.5.6.5.6.5.5.6.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.5.6.6.6.5.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.6.5.6.5.5.6.5.6.5.5.6.5.5.6.5.6.5.5.6.6.5.6.5.5.6.5.6.5.5.6.5.6.5.6.6.6.6.6.6.5.6.5.5.6.5.6.6.6.6.5.5.5.5.6.5.6.5.5.6.5.6.6.5.6.5.6.6.6.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.5.6.5.5.6.6.5.6.5.5.6.6.6.5.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.5.6.5.5.6.5.6.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.6.6.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.6.6.6.6.5.6.5.6.6.6.5.6.5.6.5.6.5.6.5.5.6.5.6.6.6.6.6.5.6.5.6.5.6.5.6.5.5.6.5.5.5.6.5.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.5.5.6.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.", | |||
"5.6.5.6.5.5.6.6.5.6.6.5.6.5.6.5.6.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.6.5.5.5.6.5.6.5.5.5.5.6.5.5.6.6.5.5.5.5.6.5.6.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.5.5.5.6.5.6.6.5.6.5.5.6.5.6.5.5.6.5.5.5.6.5.5.6.5.6.5.5.5.6.5.6.5.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.5.5.6.5.6.5.5.5.5.6.6.5.5.5.5.6.5.5.5.6.5.6.6.5.6.5.6.5.5.6.5.6.6.5.5.6.6.5.6.5.5.6.5.6.5.6.6.5.6.5.5.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.6.5.5.5.6.5.5.6.5.6.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.6.5.5.5.6.5.6.5.5.5.5.6.5.5.6.6.5.6.5.6.6.5.6.5.6.6.5.6.5.6.6.5.5.6.6.5.6.5.6.6.5.6.5.6.6.5.6.5.5.5.5.5.5.5.6.5.5.6.6.5.6.5.5.6.5.6.5.6.6.5.6.5.6.6.5.6.5.5.6.5.6.5.5.5.6.5.5.6.5.6.5.5.6.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.5.5.6.5.6.5.6.5.5.5.5.5.5.5.5.5.6.5.6.5.6.5.6.6.5.6.5.5.6.5.6.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.6.5.6.5.6.5.5.6.5.6.5.6.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.5.5.6.5.6.6.5.6.5.5.5.5.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.", | |||
"5.5.5.6.5.5.5.6.5.5.5.5.5.6.6.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.6.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.6.6.5.5.6.5.5.5.6.5.5.5.6.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.6.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.5.6.5.5.5.5.5.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.", | |||
"5.6.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.6.5.5.5.5.6.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.6.5.5.6.5.6.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.5.5.5.6.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.", | |||
"5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", | |||
"5.5.5.4.5.5.5.5.5.4.5.5.5.5.5.4.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.4.5.5.5.5.4.5.4.5.5.5.5.4.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.5.4.5.4.5.5.5.5.5.5.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.4.5.4.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.4.5.4.5.5.5.4.5.4.5.5.5.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.4.5.4.5.4.5.5.5.4.5.5.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.5.4.5.4.5.5.5.5.5.5.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.3.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", | |||
"5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.5.4.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.5.4.5.5.5.5.3.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.4.5.4.4.4.5.5.4.5.5.5.3.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.4.5.4.4.5.4.4.5.4.5.4.4.4.5.5.4.5.4.4.4.4.5.4.4.5.5.5.4.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.5.4.5.5.4.5.5.4.5.5.4.5.5.4.4.5.5.4.5.4.4.5.4.5.5.4.5.5.3.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.4.3.5.5.4.5.5.5.5.5.5.5.3.5.5.5.3.5.3.5.3.5.5.3.5.", | |||
"4.4.5.4.4.5.5.4.4.5.5.4.4.4.5.4.4.5.4.5.5.4.4.4.4.3.5.5.4.5.5.4.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.4.4.5.5.4.4.4.4.4.5.4.5.3.5.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.4.5.4.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.5.3.4.5.5.4.5.4.4.3.5.5.3.5.5.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.5.5.4.4.5.4.5.5.4.4.4.5.5.4.4.4.5.5.4.5.4.4.4.5.5.5.3.3.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.5.4.4.5.4.4.4.4.4.4.4.4.5.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.3.5.4.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.4.5.4.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.5.5.4.4.5.5.4.4.5.3.3.5.3.5.3.5.5.3.5.5.5.5.5.5.5.3.5.5.5.", | |||
"4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.4.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.5.5.4.3.5.4.5.4.4.5.3.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.5.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.4.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.5.5.5.5.5.5.3.5.3.5.3.5.3.3.5.3.5.3.5.3.5.", | |||
"4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.4.3.5.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.3.4.4.4.3.4.5.3.4.3.5.5.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.3.4.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.4.5.3.3.3.5.3.5.3.5.3.5.3.5.4.3.5.3.5.5.3.3.", | |||
"4.4.3.4.3.4.4.4.3.3.4.4.4.4.3.3.3.4.4.4.4.4.4.3.3.3.3.4.4.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.3.3.4.4.3.4.4.4.3.3.4.4.4.4.3.3.3.4.4.4.4.4.4.3.3.4.3.4.4.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.3.4.4.4.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.4.3.4.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.4.4.3.4.4.3.4.3.3.4.3.4.4.3.3.3.3.3.5.3.3.3.5.3.4.3.5.3.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.3.4.4.4.3.4.4.4.4.3.4.3.4.3.3.4.4.4.3.4.3.3.4.3.4.4.3.4.4.4.3.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.3.4.4.3.4.3.4.4.4.4.3.4.3.4.4.4.4.4.4.3.4.3.3.4.4.3.4.3.4.4.4.3.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.3.4.4.4.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.4.3.4.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.3.4.3.5.3.3.5.3.3.3.5.5.3.3.3.5.3.3.3.5.3.3.3.3.4.3.3.4.4.4.3.", | |||
"4.3.3.4.4.4.3.4.4.4.4.3.3.4.4.4.4.4.3.3.3.3.4.3.4.4.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.4.3.4.3.3.4.4.4.4.3.3.4.4.4.4.4.3.3.3.3.4.3.4.3.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.2.4.4.3.4.3.3.4.3.4.4.4.4.3.4.4.3.4.3.4.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.3.3.4.4.4.4.3.4.4.3.4.3.4.4.4.5.5.3.3.5.5.3.3.4.3.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.4.3.4.3.4.3.3.4.3.4.4.4.4.4.3.3.4.4.4.4.4.3.3.4.3.5.4.3.4.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.3.3.4.3.4.4.3.3.4.3.4.4.4.3.4.3.3.4.4.4.4.4.3.3.4.3.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.2.4.4.3.4.3.3.4.3.4.4.4.4.3.4.4.3.4.3.4.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.3.4.3.3.5.3.3.5.3.3.3.5.5.3.3.3.5.5.3.3.5.5.4.3.5.3.4.3.4.4.", | |||
"3.4.4.3.3.3.3.3.4.3.3.3.4.3.3.3.3.4.4.4.4.3.3.3.3.5.3.3.3.5.3.4.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.3.4.3.4.3.3.4.3.3.3.4.3.3.3.3.4.4.4.4.3.3.3.3.5.3.3.3.5.4.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.3.4.4.3.3.4.4.3.3.4.3.4.3.4.4.3.3.4.3.4.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.4.3.4.2.3.4.4.4.4.4.4.3.4.3.3.3.5.3.3.3.3.3.3.5.3.3.3.5.4.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.4.3.3.3.3.4.3.3.3.4.3.4.4.3.3.3.3.4.3.4.3.3.3.3.3.3.4.3.3.5.3.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.4.3.3.4.3.3.3.4.3.4.3.3.3.3.3.4.4.3.3.3.3.3.4.3.4.4.4.3.3.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.3.4.4.3.3.4.4.3.3.4.3.4.3.4.4.3.3.4.3.4.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.4.4.4.4.3.5.3.3.3.3.3.5.3.3.3.3.3.3.3.3.3.3.3.3.3.3.5.3.5.3.3.3.", | |||
"3.3.4.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.4.3.3.4.3.3.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.4.3.4.3.3.4.2.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.4.3.3.4.3.3.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.5.3.3.3.3.3.4.3.3.3.4.3.3.", | |||
"3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.", | |||
"3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.3.2.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.2.4.2.3.2.2.3.3.2.3.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.3.2.3.2.3.2.2.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.2.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.2.4.2.3.2.2.3.3.2.3.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.2.3.2.3.2.3.", | |||
"3.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.4.2.3.3.3.3.3.3.2.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.2.2.3.3.2.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.4.2.3.3.3.3.3.3.2.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.2.3.3.3.3.2.2.3.3.2.3.3.3.3.3.3.", | |||
"3.3.3.3.2.3.3.2.3.3.2.3.3.2.2.3.2.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.3.3.2.3.3.2.3.3.2.3.2.2.2.3.2.2.3.3.3.2.2.3.2.2.2.3.2.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.2.3.2.2.2.2.2.3.3.2.2.3.2.2.2.3.2.3.3.2.2.3.2.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.2.2.2.2.2.2.3.2.2.2.3.2.3.3.2.2.2.3.2.2.3.2.2.3.2.3.2.3.3.2.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.2.2.3.2.2.3.3.2.3.2.2.2.3.2.2.3.3.2.3.2.2.3.2.3.2.3.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.2.3.3.2.2.2.3.3.2.3.2.2.3.2.3.2.3.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.2.3.2.2.2.2.2.3.3.2.2.3.2.2.2.3.2.3.3.2.2.3.2.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.3.3.2.2.3.3.3.3.2.2.3.3.2.3.3.2.3.3.2.3.3.2.3.2.3.2.2.3.2.", | |||
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.3.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.2.3.", | |||
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", | |||
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.", | |||
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.", | |||
"2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.1.", | |||
"1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.2.2.1.1.1.2.2.1.1.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.2.1.2.1.2.2.1.1.1.2.1.2.1.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.2.2.2.2.1.1.2.2.2.1.2.1.2.1.2.", | |||
"2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.1.2.2.1.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.1.2.2.1.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.2.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.2.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.", | |||
"1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.1.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.2.1.2.1.1.1.1.1.2.1.1.2.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.", | |||
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1." | |||
}; |
@@ -1,155 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Created with Inkscape (http://www.inkscape.org/) --> | |||
<svg | |||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
xmlns:cc="http://creativecommons.org/ns#" | |||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
xmlns:xlink="http://www.w3.org/1999/xlink" | |||
version="1.1" | |||
width="512" | |||
height="512" | |||
id="svg3137"> | |||
<defs | |||
id="defs3139"> | |||
<linearGradient | |||
x1="0" | |||
y1="150" | |||
x2="300" | |||
y2="150" | |||
id="linearGradient3813" | |||
xlink:href="#SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
gradientTransform="translate(-5.5328369e-8,-300.00001)" /> | |||
<linearGradient | |||
x1="149.9995" | |||
y1="4" | |||
x2="149.9995" | |||
y2="304" | |||
id="SVGID_1_" | |||
gradientUnits="userSpaceOnUse"> | |||
<stop | |||
id="stop6" | |||
style="stop-color:#fffdf7;stop-opacity:1" | |||
offset="0.3398" /> | |||
<stop | |||
id="stop22" | |||
style="stop-color:#20fb00;stop-opacity:1" | |||
offset="0.99440002" /> | |||
</linearGradient> | |||
<linearGradient | |||
x1="0" | |||
y1="150" | |||
x2="300" | |||
y2="150" | |||
id="linearGradient3135" | |||
xlink:href="#SVGID_1_" | |||
gradientUnits="userSpaceOnUse" | |||
gradientTransform="matrix(1.7066667,0,0,1.7066667,-186.78068,-642.00002)" /> | |||
</defs> | |||
<metadata | |||
id="metadata3142"> | |||
<rdf:RDF> | |||
<cc:Work | |||
rdf:about=""> | |||
<dc:format>image/svg+xml</dc:format> | |||
<dc:type | |||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||
<dc:title></dc:title> | |||
</cc:Work> | |||
</rdf:RDF> | |||
</metadata> | |||
<g | |||
transform="translate(-130,186.78068)" | |||
id="layer1"> | |||
<rect | |||
width="512" | |||
height="512" | |||
x="-186.78067" | |||
y="-642" | |||
transform="matrix(0,1,-1,0,0,0)" | |||
id="rect24" | |||
style="fill:url(#linearGradient3135);fill-opacity:1" /> | |||
<rect | |||
width="435.42188" | |||
height="65.710075" | |||
x="173.40906" | |||
y="196.90019" | |||
id="rect28" | |||
style="fill:none" /> | |||
<g | |||
id="g3571"> | |||
<path | |||
d="m 321.16035,174.86778 0,94.91448 -21.57414,0 0,-64.07754 -8.61793,64.07754 -15.30122,0 -9.08693,-62.6119 0,62.6119 -21.57414,0 0,-94.91448 31.95083,0 c 0.93797,5.70629 1.9346,12.42866 2.98989,20.16713 l 3.40028,24.15365 5.62803,-44.32078 32.18533,0" | |||
id="path3531" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 355.74932,174.86778 0,94.91448 -24.68128,0 0,-94.91448 24.68128,0" | |||
id="path3533" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 415.78171,174.86778 -8.61793,41.97576 13.01483,52.93872 -22.86389,0 c -2.73589,-9.45822 -5.23724,-20.96832 -7.50405,-34.53035 -0.62537,5.97982 -1.48521,12.33089 -2.57952,19.05325 l -2.34501,15.4771 -24.03641,0 8.91106,-52.93872 -8.91106,-41.97576 23.86053,0 c 0.4299,2.61869 1.28973,6.9765 2.57952,13.07345 1.01614,4.65103 1.85644,8.91113 2.52089,12.78034 l 5.27628,-25.85379 20.69476,0" | |||
id="path3535" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 423.69613,174.86778 41.15501,0 0,18.99462 -16.47373,0 0,17.99799 15.41848,0 0,18.05661 -15.41848,0 0,20.87064 18.11524,0 0,18.99462 -42.79652,0 0,-94.91448" | |||
id="path3537" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
<path | |||
d="m 343.65625,361.65625 0,94.90625 24.65625,0 0,-42.78125 c 3.40023,5e-5 5.49954,0.60095 6.28125,1.8125 0.82072,1.21163 1.24997,4.35667 1.25,9.4375 l 0,31.53125 22.90625,0 0,-25.03125 c -7e-5,-7.66035 -0.22639,-12.31937 -0.65625,-14 -0.3909,-1.71964 -1.41321,-3.62386 -3.09375,-5.65625 -1.68065,-2.0323 -4.95836,-3.63211 -9.84375,-4.84375 5.39348,-0.50804 9.00677,-2.05327 10.84375,-4.59375 1.83687,-2.54038 2.74993,-7.48814 2.75,-14.875 -7e-5,-8.09022 -1.31895,-13.98231 -3.9375,-17.65625 -2.57957,-3.71285 -5.91969,-6.00723 -10.0625,-6.90625 -4.10382,-0.89883 -11.97812,-1.34366 -23.625,-1.34375 l -17.46875,0 z M 368.3125,377.875 c 2.85307,7e-5 4.81971,0.46833 5.875,1.40625 1.09431,0.93809 1.65622,2.92814 1.65625,5.9375 l 0,5.21875 c -3e-5,4.182 -0.58536,6.65589 -1.71875,7.4375 -1.09438,0.74264 -3.0376,1.12506 -5.8125,1.125 l 0,-21.125 z" | |||
transform="translate(130,-186.78068)" | |||
id="path3560" | |||
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" /> | |||
</g> | |||
<polygon | |||
points="300,0 300,110.426 150,188 0,110.426 0,0 " | |||
transform="matrix(1.7066667,0,0,1.7066667,130,-186.78068)" | |||
id="polygon26" | |||
style="fill:#000200" /> | |||
<g | |||
id="g3518"> | |||
<path | |||
d="m 247.89101,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85043,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04083,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336" | |||
id="path3502" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 261.59539,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02391,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27208,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599" | |||
id="path3500" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 316.23944,-32.523683 c -1.3e-4,4.510316 -1.33009,8.44237 -3.98989,11.796175 -3.23828,4.279007 -7.97987,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16336,11.96965 l 0,82.226277" | |||
id="path3489" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 363.27506,-32.523683 c -5e-5,2.775586 0.80949,4.972911 2.42862,6.59198 1.61904,1.619093 3.81636,2.428634 6.59198,2.428625 1.27208,9e-6 2.37075,0.462603 3.29599,1.387785 0.92513,0.925197 1.38773,2.023859 1.38779,3.29599 -6e-5,1.156491 -0.46266,2.197329 -1.38779,3.122517 -0.92524,0.92519 -2.02391,1.387785 -3.29599,1.387785 l -27.40876,0 c -4.51032,0 -8.44237,-1.32996 -11.79617,-3.989883 -4.27902,-3.238158 -6.41852,-7.979753 -6.41851,-14.224799 l 0,-82.226277 c -10e-6,-4.5102 1.32995,-8.44225 3.98988,-11.79618 3.23815,-4.27888 7.97975,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04084,0 0.69389,0.34694 c 1.96598,0.92531 2.94899,2.3131 2.94905,4.16336 -6e-5,1.1566 -0.40483,2.19744 -1.21432,3.12252 -0.80959,0.9253 -1.85043,1.38789 -3.12251,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98989,0.69389 -3.58515,1.3879 -5.37771,4.22129 -5.37766,8.50019 l 0,82.226277" | |||
id="path3510" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 390.68381,-128.45434 c -6e-5,1.27225 -0.46266,2.37091 -1.38778,3.29599 -0.92526,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19739,-0.46249 -3.12252,-1.38779 -0.92525,-0.92508 -1.38784,-2.02374 -1.38778,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37073,0.40489 3.29599,1.21431 0.92512,0.80966 1.38772,1.90832 1.38778,3.29599" | |||
id="path3508" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 390.68381,-18.819303 c -6e-5,1.156491 -0.46266,2.197329 -1.38778,3.122517 -0.92526,0.92519 -2.02392,1.387785 -3.29599,1.387785 -1.2722,0 -2.37086,-0.40477 -3.29599,-1.214312 -0.8096,-0.925188 -1.21437,-2.02385 -1.21431,-3.29599 -6e-5,-1.272131 0.40471,-2.370793 1.21431,-3.29599 0.80948,-0.925182 1.90814,-1.387776 3.29599,-1.387785 1.27207,9e-6 2.37073,0.462603 3.29599,1.387785 0.92512,0.925197 1.38772,2.023859 1.38778,3.29599" | |||
id="path3506" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 445.32786,-32.523683 c -1.2e-4,6.129397 -2.0818,10.813168 -6.24503,14.051326 -3.46958,2.775572 -7.45946,4.163356 -11.96965,4.163356 l -27.40876,0 c -1.27221,0 -2.37088,-0.40477 -3.29599,-1.214312 -0.80962,-0.925188 -1.21439,-2.02385 -1.21431,-3.29599 -8e-5,-1.272131 0.40469,-2.370793 1.21431,-3.29599 0.80946,-0.925182 1.90813,-1.387776 3.29599,-1.387785 3.46938,9e-6 6.01365,-1.214302 7.63282,-3.642937 1.04075,-1.50342 1.56117,-3.295974 1.56126,-5.377668 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42863,-6.59198 -1.61916,-1.61897 -3.87431,-2.42852 -6.76545,-2.42862 -1.15657,1e-4 -2.1974,-0.46249 -3.12252,-1.38779 -0.92526,-0.92508 -1.38786,-2.02374 -1.38778,-3.29599 -8e-5,-1.27202 0.40469,-2.31286 1.21431,-3.12252 0.92511,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01362,1.2e-4 10.69739,2.08179 14.05132,6.24503 2.77545,3.46957 4.16324,7.45945 4.16336,11.96965 l 0,82.226277" | |||
id="path3491" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 506.06786,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85044,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40875,0 1.04084,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336" | |||
id="path3516" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 519.77224,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599" | |||
id="path3514" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
<path | |||
d="m 574.41628,-32.523683 c -1.2e-4,4.510316 -1.33008,8.44237 -3.98988,11.796175 -3.23828,4.279007 -7.97988,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16335,11.96965 l 0,82.226277" | |||
id="path3493" | |||
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" /> | |||
</g> | |||
</g> | |||
</svg> |
@@ -1 +0,0 @@ | |||
icon-large.svg |
@@ -1,9 +0,0 @@ | |||
[Desktop Entry] | |||
Name=Non Mixer | |||
Comment=Modular Digital Audio Workstation - Mixer | |||
Comment[fr]=Station de travail audio-numérique modulaire - Mixeur | |||
Exec=@BIN_PATH@/non-mixer | |||
Terminal=false | |||
Type=Application | |||
Icon=non-mixer | |||
Categories=AudioVideo;Audio; |
@@ -1,206 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <FL/fl_draw.H> | |||
#include "AUX_Module.H" | |||
#include "dsp.h" | |||
/* The purpose of this module is to provide auxiliary outputs, with | |||
* gain. This allows one to create a 'send' type topology without | |||
* having to use an extra strip to control the 'send' gain. */ | |||
AUX_Module::AUX_Module ( ) : JACK_Module ( false ) | |||
{ | |||
is_default( false ); | |||
_number = 0; | |||
{ | |||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" ); | |||
p.hints.type = Port::Hints::LINEAR; | |||
p.hints.ranged = true; | |||
p.hints.minimum = -70.0f; | |||
p.hints.maximum = 6.0f; | |||
p.hints.default_value = 0.0f; | |||
p.connect_to( new float ); | |||
p.control_value( p.hints.default_value ); | |||
add_port( p ); | |||
} | |||
log_create(); | |||
color( FL_DARK1 ); | |||
copy_label( "Aux" ); | |||
smoothing.sample_rate( sample_rate() ); | |||
} | |||
AUX_Module::~AUX_Module ( ) | |||
{ | |||
configure_outputs(0); | |||
delete (float*)control_input[0].buffer(); | |||
} | |||
void | |||
AUX_Module::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":number", number() ); | |||
JACK_Module::get(e); | |||
} | |||
void | |||
AUX_Module::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! ( strcmp( s, ":number" ) ) ) | |||
{ | |||
number( atoi(v) ); | |||
} | |||
} | |||
JACK_Module::set(e); | |||
} | |||
void | |||
AUX_Module::number ( int n ) | |||
{ | |||
_number = n; | |||
char s[10]; | |||
snprintf( s, sizeof(s), "aux-%c", 'A' + n ); | |||
prefix( s ); | |||
snprintf( s, sizeof(s), "Aux (%c)", 'A' + n ); | |||
copy_label( s ); | |||
} | |||
void | |||
AUX_Module::handle_sample_rate_change ( nframes_t n ) | |||
{ | |||
smoothing.sample_rate( n ); | |||
} | |||
void | |||
AUX_Module::process ( nframes_t nframes ) | |||
{ | |||
if ( unlikely( bypass() ) ) | |||
{ | |||
for ( unsigned int i = 0; i < audio_input.size(); ++i ) | |||
{ | |||
if ( audio_input[i].connected() ) | |||
buffer_fill_with_silence( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), nframes ); | |||
} | |||
} | |||
else | |||
{ | |||
float gt = DB_CO( control_input[0].control_value() ); | |||
sample_t gainbuf[nframes]; | |||
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt ); | |||
if ( unlikely( use_gainbuf ) ) | |||
{ | |||
for ( unsigned int i = 0; i < audio_input.size(); ++i ) | |||
{ | |||
if ( audio_input[i].connected() ) | |||
buffer_copy_and_apply_gain_buffer( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), gainbuf, nframes ); | |||
} | |||
} | |||
else | |||
{ | |||
for ( unsigned int i = 0; i < audio_input.size(); ++i ) | |||
{ | |||
if ( audio_input[i].connected() ) | |||
buffer_copy_and_apply_gain( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), nframes, gt ); | |||
} | |||
} | |||
} | |||
} | |||
void | |||
AUX_Module::draw ( void ) | |||
{ | |||
int W = 5; | |||
child(0)->size( w() - W, h() ); | |||
Module::draw_box(x(),y(),w() - W,h()); | |||
Module::draw_label(x(),y(),w() - W,h()); | |||
Module *m = this; | |||
fl_color( fl_darker( FL_FOREGROUND_COLOR ) ); | |||
int spacing, offset; | |||
spacing = h() / m->ninputs(); | |||
offset = spacing / 2; | |||
for ( int i = m->ninputs(); i--; ) | |||
{ | |||
int xi = offset + ( spacing * i ); | |||
fl_rectf( m->x() + m->w() - W, m->y() + xi, W, 2 ); | |||
} | |||
} | |||
bool | |||
AUX_Module::configure_outputs ( int n ) | |||
{ | |||
int on = audio_output.size(); | |||
if ( n > on ) | |||
{ | |||
for ( int i = on; i < n; ++i ) | |||
{ | |||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) ); | |||
} | |||
} | |||
else | |||
{ | |||
for ( int i = on; i > n; --i ) | |||
{ | |||
audio_output.back().disconnect(); | |||
audio_output.pop_back(); | |||
} | |||
} | |||
return true; | |||
} | |||
bool | |||
AUX_Module::configure_inputs ( int n ) | |||
{ | |||
bool b = JACK_Module::configure_inputs( n ); | |||
if ( b ) | |||
{ | |||
return configure_outputs( n ); | |||
} | |||
return false; | |||
} |
@@ -1,61 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "JACK_Module.H" | |||
#include "dsp.h" | |||
class AUX_Module : public JACK_Module | |||
{ | |||
int _number; | |||
Value_Smoothing_Filter smoothing; | |||
protected: | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
public: | |||
virtual const char *name ( void ) const { return "AUX"; } | |||
int can_support_inputs ( int n ) { return n > 0 ? n : -1; } | |||
virtual bool configure_outputs ( int n ); | |||
virtual bool configure_inputs ( int n ); | |||
void number ( int n ); | |||
int number ( void ) const { return _number; } | |||
AUX_Module ( ); | |||
virtual ~AUX_Module ( ); | |||
LOG_CREATE_FUNC( AUX_Module ); | |||
virtual void handle_sample_rate_change ( nframes_t n ); | |||
protected: | |||
virtual void draw ( void ); | |||
virtual void process ( nframes_t nframes ); | |||
}; | |||
@@ -1,991 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Filter chain. This would all be much simpler if we chose not to | |||
* allow non 1:1 plugins to be mixed in a single chain... | |||
* | |||
* Supporting the mixture requires duplicating some inputs (to satisfy | |||
* stereo input plugins reading mono outputs) and duplicating some | |||
* plugins (to satisfy mono input plugins reading stereo outputs). | |||
* | |||
* Basically, what this means is that the intermediate number of | |||
* buffers need not have any relation to the starting and ending | |||
* buffer count. (Picture an ambisonic panner going into an ambisonic | |||
* decoder (1:6:2). | |||
* | |||
* The chain will allocate enough buffers to hold data from the | |||
* maximum number of channels used by a contained module. | |||
* | |||
* The process thread goes as follows: | |||
* | |||
* 1. Copy inputs to chain buffers. | |||
* | |||
* 2. process() each module in turn (reusing buffers in-place) (inputs | |||
* will be copied or plugins duplicated as necessary) | |||
* | |||
* 3. Copy chain buffers to outputs. | |||
* | |||
* For chains where the number of channels never exceeds the maximum | |||
* of the number of inputs and outputs, the first copy can be | |||
* optimized out. | |||
*/ | |||
#include "const.h" | |||
#include <stdlib.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include "Chain.H" | |||
#include "Module.H" | |||
#include "Meter_Module.H" | |||
#include "JACK_Module.H" | |||
#include "Gain_Module.H" | |||
#include "Plugin_Module.H" | |||
#include "Controller_Module.H" | |||
#include <FL/Fl_Box.H> | |||
#include <FL/Fl_Menu.H> | |||
#include <FL/fl_ask.H> | |||
#include <FL/Fl_Flip_Button.H> | |||
#include <FL/Fl_Tabs.H> | |||
#include "FL/Fl_Flowpack.H" | |||
#include "FL/Fl_Scroll.H" | |||
#include "FL/Fl_Packscroller.H" | |||
#include <FL/fl_draw.H> | |||
#include "FL/menu_popup.H" | |||
#include "FL/test_press.H" | |||
#include "debug.h" | |||
#include "Group.H" | |||
#include "Mixer_Strip.H" | |||
#include <dsp.h> | |||
#include "Mixer.H" | |||
extern char *instance_name; | |||
/* Chain::Chain ( int X, int Y, int W, int H, const char *L ) : */ | |||
/* Fl_Group( X, Y, W, H, L) */ | |||
Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "") | |||
{ | |||
/* not really deleting here, but reusing this variable */ | |||
_deleting = true; | |||
int X = 0; | |||
int Y = 0; | |||
int W = 100; | |||
int H = 100; | |||
/* _outs = 1; */ | |||
/* _ins = 1; */ | |||
_configure_outputs_callback = NULL; | |||
_strip = NULL; | |||
_name = NULL; | |||
labelsize( 10 ); | |||
align( FL_ALIGN_TOP ); | |||
{ Fl_Flip_Button* o = tab_button = new Fl_Flip_Button( X, Y, W, 16, "chain/controls"); | |||
o->type(1); | |||
o->labelsize( 12 ); | |||
o->callback( cb_handle, this ); | |||
} | |||
Y += 18; | |||
H -= 18; | |||
{ Fl_Group *o = chain_tab = new Fl_Group( X, Y, W, H, "" ); | |||
o->labeltype( FL_NO_LABEL ); | |||
o->box( FL_FLAT_BOX ); | |||
// o->color( fl_darker( FL_BACKGROUND_COLOR ) ); | |||
// o->color( FL_BACKGROUND_COLOR ); | |||
// o->box( FL_NO_BOX ); | |||
{ Fl_Packscroller *o = new Fl_Packscroller( X, Y, W, H ); | |||
o->color( FL_BACKGROUND_COLOR ); | |||
// o->box( FL_FLAT_BOX ); | |||
o->box( FL_THIN_UP_BOX ); | |||
o->type( Fl_Scroll::VERTICAL ); | |||
{ Fl_Pack *o = modules_pack = new Fl_Pack( X, Y, W, H ); | |||
o->type( Fl_Pack::VERTICAL ); | |||
o->spacing( 6 ); | |||
o->end(); | |||
Fl_Group::current()->resizable( o ); | |||
} | |||
o->end(); | |||
} | |||
o->end(); | |||
} | |||
{ Fl_Group *o = control_tab = new Fl_Group( X, Y, W, H, "" ); | |||
o->box( FL_FLAT_BOX ); | |||
o->color( FL_BACKGROUND_COLOR ); | |||
o->labeltype( FL_NO_LABEL ); | |||
o->hide(); | |||
{ Fl_Scroll *o = new Fl_Scroll( X, Y, W, H ); | |||
o->color( FL_BACKGROUND_COLOR ); | |||
o->box( FL_NO_BOX ); | |||
o->type( Fl_Scroll::VERTICAL ); | |||
{ Fl_Pack *o = controls_pack = new Fl_Pack( X, Y, W, H ); | |||
o->type( Fl_Pack::VERTICAL ); | |||
o->spacing( 5 ); | |||
// o->color( FL_RED ); | |||
o->end(); | |||
Fl_Group::current()->resizable( o ); | |||
} | |||
o->end(); | |||
Fl_Group::current()->resizable( o ); | |||
} | |||
o->end(); | |||
o->hide(); | |||
Fl_Group::current()->resizable( o ); | |||
} | |||
end(); | |||
log_create(); | |||
_deleting = false; | |||
} | |||
Chain::~Chain ( ) | |||
{ | |||
DMESSAGE( "Destroying chain" ); | |||
log_destroy(); | |||
_deleting = true; | |||
client()->lock(); | |||
for ( unsigned int i = scratch_port.size(); i--; ) | |||
free( (sample_t*)scratch_port[i].buffer() ); | |||
/* if we leave this up to FLTK, it will happen after we've | |||
already destroyed the client */ | |||
modules_pack->clear(); | |||
controls_pack->clear(); | |||
client()->unlock(); | |||
} | |||
Group * | |||
Chain::client ( void ) | |||
{ | |||
return strip()->group(); | |||
} | |||
void | |||
Chain::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":strip", strip() ); | |||
e.add( ":tab", tab_button->value() ? "controls" : "chain" ); | |||
} | |||
void | |||
Chain::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":tab" ) ) | |||
{ | |||
tab_button->value( strcmp( v, "controls" ) == 0 ); | |||
tab_button->do_callback(); | |||
} | |||
else if ( ! strcmp( s, ":strip" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Mixer_Strip *t = (Mixer_Strip*)Loggable::find( i ); | |||
assert( t ); | |||
t->chain( this ); | |||
} | |||
} | |||
} | |||
void | |||
Chain::log_children ( void ) const | |||
{ | |||
log_create(); | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
module(i)->log_create(); | |||
} | |||
for ( int i = 0; i < controls_pack->children(); ++i ) | |||
{ | |||
Controller_Module *cm = (Controller_Module*)controls_pack->child( i ); | |||
cm->log_create(); | |||
} | |||
} | |||
/* Fill this chain with JACK I/O, Gain, and Meter modules. */ | |||
void | |||
Chain::initialize_with_default ( void ) | |||
{ | |||
{ JACK_Module *m = new JACK_Module(); | |||
m->is_default( true ); | |||
m->chain( this ); | |||
m->configure_outputs( 1 ); | |||
add( m ); | |||
} | |||
{ Module *m = new Gain_Module(); | |||
m->is_default( true ); | |||
m->chain(this); | |||
add( m ); | |||
} | |||
{ Module *m = new Meter_Module(); | |||
m->is_default( true ); | |||
add( m ); | |||
} | |||
{ JACK_Module *m = new JACK_Module(); | |||
m->is_default( true ); | |||
m->chain( this ); | |||
add( m ); | |||
} | |||
} | |||
void Chain::cb_handle(Fl_Widget* o) { | |||
if ( o == tab_button ) | |||
{ | |||
Fl_Flip_Button *fb = (Fl_Flip_Button*)o; | |||
if ( fb->value() == 0 ) | |||
{ | |||
control_tab->hide(); | |||
chain_tab->show(); | |||
} | |||
else | |||
{ | |||
chain_tab->hide(); | |||
control_tab->show(); | |||
} | |||
} | |||
} | |||
void Chain::cb_handle(Fl_Widget* o, void* v) { | |||
((Chain*)(v))->cb_handle(o); | |||
} | |||
void | |||
Chain::remove ( Controller_Module *m ) | |||
{ | |||
DMESSAGE( "Removing controller module from chain" ); | |||
client()->lock(); | |||
m->disconnect(); | |||
controls_pack->remove( m ); | |||
modules_pack->remove( m ); | |||
build_process_queue(); | |||
client()->unlock(); | |||
redraw(); | |||
} | |||
void | |||
Chain::send_feedback ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
module(i)->send_feedback(); | |||
} | |||
/* remove a module from the chain. this isn't guaranteed to succeed, | |||
* because removing the module might result in an invalid routing */ | |||
void | |||
Chain::remove ( Module *m ) | |||
{ | |||
int i = modules_pack->find( m ); | |||
int ins = 0; | |||
if ( i != 0 ) | |||
ins = module( i - 1 )->noutputs(); | |||
if ( ! can_configure_outputs( m, ins ) ) | |||
{ | |||
fl_alert( "Can't remove module at this point because the resultant chain is invalid" ); | |||
} | |||
client()->lock(); | |||
strip()->handle_module_removed( m ); | |||
modules_pack->remove( m ); | |||
configure_ports(); | |||
client()->unlock(); | |||
} | |||
/* determine number of output ports, signal if changed. */ | |||
void | |||
Chain::configure_ports ( void ) | |||
{ | |||
int nouts = 0; | |||
client()->lock(); | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
module( i )->configure_inputs( nouts ); | |||
nouts = module( i )->noutputs(); | |||
} | |||
unsigned int req_buffers = required_buffers(); | |||
DMESSAGE( "required_buffers = %i", req_buffers ); | |||
if ( scratch_port.size() < req_buffers ) | |||
{ | |||
for ( unsigned int i = scratch_port.size(); i--; ) | |||
free(scratch_port[i].buffer()); | |||
scratch_port.clear(); | |||
for ( unsigned int i = 0; i < req_buffers; ++i ) | |||
{ | |||
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO ); | |||
p.set_buffer( buffer_alloc( client()->nframes() ) ); | |||
buffer_fill_with_silence( (sample_t*)p.buffer(), client()->nframes() ); | |||
scratch_port.push_back( p ); | |||
} | |||
} | |||
build_process_queue(); | |||
client()->unlock(); | |||
parent()->redraw(); | |||
} | |||
/** invoked from the JACK latency callback... We need to update the latency values on this chains ports */ | |||
void | |||
Chain::set_latency ( JACK::Port::direction_e dir ) | |||
{ | |||
nframes_t tmax = 0; | |||
nframes_t tmin = 0; | |||
nframes_t added_min = 0; | |||
nframes_t added_max = 0; | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m; | |||
if ( dir == JACK::Port::Input ) | |||
m = module( i ); | |||
else | |||
m = module( (modules() - 1) - i ); | |||
nframes_t min,max; | |||
min = max = 0; | |||
nframes_t a = m->get_module_latency(); | |||
added_min += a; | |||
added_max += a; | |||
if ( dir == JACK::Port::Input ? m->aux_audio_input.size() : m->aux_audio_output.size() ) | |||
{ | |||
m->get_latency( dir, &min, &max ); | |||
tmin = 0; | |||
added_min = 0; | |||
} | |||
if ( min > tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
m->set_latency( dir, tmin + added_min, tmax + added_max ); | |||
} | |||
} | |||
int | |||
Chain::get_module_instance_number ( Module *m ) | |||
{ | |||
int n = 0; | |||
for ( int i = 0; i < modules() && module(i) != m; ++i ) | |||
if ( ! strcmp( module(i)->label(), m->label() ) ) | |||
n++; | |||
return n; | |||
} | |||
/* calculate the minimum number of buffers required to satisfy this chain */ | |||
int | |||
Chain::required_buffers ( void ) | |||
{ | |||
int buffers = 0; | |||
int outs = 0; | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
outs = module( i )->can_support_inputs( outs ); | |||
if ( outs > buffers ) | |||
buffers = outs; | |||
} | |||
return buffers; | |||
} | |||
/* called by a module when it wants to alter the number of its | |||
* outputs. Also used to test for chain validity when inserting / | |||
* removing modules */ | |||
bool | |||
Chain::can_configure_outputs ( Module *m, int n ) const | |||
{ | |||
/* start at the requesting module */ | |||
int outs = n; | |||
int i = modules_pack->find( m ); | |||
if ( modules() - 1 == i ) | |||
/* last module */ | |||
return true; | |||
for ( i++ ; i < modules(); ++i ) | |||
{ | |||
outs = module( i )->can_support_inputs( outs ); | |||
if ( outs < 0 ) | |||
return false; | |||
} | |||
return true; | |||
} | |||
unsigned int | |||
Chain::maximum_name_length ( void ) | |||
{ | |||
return JACK::Client::maximum_name_length() - ( strlen( instance_name ) + 1 ); | |||
} | |||
void | |||
Chain::freeze_ports ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m = module(i); | |||
m->freeze_ports(); | |||
} | |||
} | |||
void | |||
Chain::thaw_ports ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m = module(i); | |||
m->thaw_ports(); | |||
} | |||
} | |||
/* rename chain... we have to let our modules know our name has | |||
* changed so they can take the appropriate action (in particular the | |||
* JACK module). */ | |||
void | |||
Chain::name ( const char *name ) | |||
{ | |||
_name = name; | |||
if ( strip()->group() ) | |||
{ | |||
if ( strip()->group()->single() ) | |||
strip()->group()->name(name); | |||
} | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
module( i )->handle_chain_name_changed(); | |||
} | |||
} | |||
bool | |||
Chain::add ( Module *m ) | |||
{ | |||
/* FIXME: hacky */ | |||
if ( !strcmp( m->name(), "Controller" ) ) | |||
return false; | |||
else | |||
return insert( NULL, m ); | |||
} | |||
bool | |||
Chain::add ( Controller_Module *m ) | |||
{ | |||
DMESSAGE( "Adding control" ); | |||
add_control(m); | |||
return true; | |||
} | |||
bool | |||
Chain::insert ( Module *m, Module *n ) | |||
{ | |||
client()->lock(); | |||
if ( !m ) | |||
{ | |||
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 ) | |||
{ | |||
n->chain( this ); | |||
n->configure_inputs( 0 ); | |||
modules_pack->add( n ); | |||
} | |||
else if ( n->can_support_inputs( module( modules() - 1 )->noutputs() ) >= 0 ) | |||
{ | |||
n->chain( this ); | |||
n->configure_inputs( module( modules() - 1 )->noutputs() ); | |||
modules_pack->add( n ); | |||
} | |||
else | |||
{ | |||
DMESSAGE( "Module says it can't support %i inputs", module( modules() - 1 )->noutputs() ); | |||
goto err; | |||
} | |||
} | |||
else | |||
{ | |||
int i = modules_pack->find( m ); | |||
n->chain( this ); | |||
if ( 0 == i ) | |||
{ | |||
/* inserting to head of chain*/ | |||
if ( n->can_support_inputs( 0 ) >= 0 ) | |||
n->configure_inputs( 0 ); | |||
else | |||
goto err; | |||
} | |||
else | |||
{ | |||
if ( n->can_support_inputs( module( i - 1 )->noutputs() ) >= 0 ) | |||
{ | |||
n->configure_inputs( module( i - 1 )->noutputs() ); | |||
m->configure_inputs( n->noutputs() ); | |||
for ( int j = i + 1; j < modules(); ++j ) | |||
module( j )->configure_inputs( module( j - 1 )->noutputs() ); | |||
} | |||
else | |||
goto err; | |||
} | |||
modules_pack->insert( *n, i ); | |||
} | |||
strip()->handle_module_added( n ); | |||
configure_ports(); | |||
client()->unlock(); | |||
DMESSAGE( "Module \"%s\" has %i:%i audio and %i:%i control ports", | |||
n->name(), | |||
n->ninputs(), | |||
n->noutputs(), | |||
n->ncontrol_inputs(), | |||
n->ncontrol_outputs() ); | |||
n->initialize(); | |||
return true; | |||
err: | |||
client()->unlock(); | |||
DMESSAGE( "Insert failed" ); | |||
return false; | |||
} | |||
/* add a control to the control strip. Assumed to already be connected! */ | |||
void | |||
Chain::add_control ( Controller_Module *m ) | |||
{ | |||
client()->lock(); | |||
controls_pack->add( m ); | |||
configure_ports(); | |||
client()->unlock(); | |||
controls_pack->redraw(); | |||
} | |||
void | |||
Chain::draw_connections ( Module *m ) | |||
{ | |||
int spacing; | |||
int offset; | |||
int X, Y, W, H; | |||
((Fl_Packscroller*)chain_tab->child( 0 ))->bbox( X, Y, W, H ); | |||
fl_push_clip( X, Y, W, H ); | |||
Fl_Color c = FL_FOREGROUND_COLOR; | |||
fl_color( c ); | |||
if ( m->ninputs() ) | |||
{ | |||
spacing = w() / m->ninputs(); | |||
offset = spacing / 2; | |||
for ( int i = m->ninputs(); i--; ) | |||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 3, 2, 3 ); | |||
} | |||
fl_color( fl_darker( c ) ); | |||
if ( m->noutputs() ) | |||
{ | |||
spacing = w() / m->noutputs(); | |||
offset = spacing / 2; | |||
for ( int i = m->noutputs(); i--; ) | |||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 3 ); | |||
} | |||
fl_pop_clip(); | |||
} | |||
void | |||
Chain::add_to_process_queue ( Module *m ) | |||
{ | |||
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i ) | |||
if ( m == *i ) | |||
return; | |||
process_queue.push_back( m ); | |||
} | |||
/* run any time the internal connection graph might have | |||
* changed... Tells the process thread what order modules need to be | |||
* run in. */ | |||
void | |||
Chain::build_process_queue ( void ) | |||
{ | |||
process_queue.clear(); | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
Module *m = (Module*)module( i ); | |||
/* controllers */ | |||
for ( unsigned int j = 0; j < m->control_input.size(); ++j ) | |||
{ | |||
if ( m->control_input[j].connected() ) | |||
{ | |||
add_to_process_queue( m->control_input[j].connected_port()->module() ); | |||
} | |||
} | |||
/* audio modules */ | |||
add_to_process_queue( m ); | |||
/* indicators */ | |||
for ( unsigned int j = 0; j < m->control_output.size(); ++j ) | |||
{ | |||
if ( m->control_output[j].connected() ) | |||
{ | |||
add_to_process_queue( m->control_output[j].connected_port()->module() ); | |||
} | |||
} | |||
} | |||
/* connect all the ports to the buffers */ | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
Module *m = module( i ); | |||
for ( unsigned int j = 0; j < m->audio_input.size(); ++j ) | |||
{ | |||
m->audio_input[j].set_buffer( scratch_port[j].buffer() ); | |||
} | |||
for ( unsigned int j = 0; j < m->audio_output.size(); ++j ) | |||
{ | |||
m->audio_output[j].set_buffer( scratch_port[j].buffer() ); | |||
} | |||
m->handle_port_connection_change(); | |||
} | |||
/* DMESSAGE( "Process queue looks like:" ); */ | |||
/* for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i ) */ | |||
/* { */ | |||
/* const Module* m = *i; */ | |||
/* if ( m->audio_input.size() || m->audio_output.size() ) */ | |||
/* DMESSAGE( "\t%s", (*i)->name() ); */ | |||
/* else if ( m->control_output.size() ) */ | |||
/* DMESSAGE( "\t%s -->", (*i)->name() ); */ | |||
/* else if ( m->control_input.size() ) */ | |||
/* DMESSAGE( "\t%s <--", (*i)->name() ); */ | |||
/* { */ | |||
/* char *s = m->get_parameters(); */ | |||
/* DMESSAGE( "(%s)", s ); */ | |||
/* delete[] s; */ | |||
/* } */ | |||
/* } */ | |||
} | |||
void | |||
Chain::strip ( Mixer_Strip * ms ) | |||
{ | |||
_strip = ms; | |||
} | |||
void | |||
Chain::draw ( void ) | |||
{ | |||
Fl_Group::draw(); | |||
/* if ( 0 == strcmp( "Chain", tabs->value()->label() ) ) */ | |||
if ( chain_tab->visible() ) | |||
for ( int i = 0; i < modules(); ++i ) | |||
draw_connections( module( i ) ); | |||
} | |||
void | |||
Chain::resize ( int X, int Y, int W, int H ) | |||
{ | |||
Fl_Group::resize( X, Y, W, H ); | |||
/* this won't naturally resize because it's inside of an Fl_Scroll... */ | |||
controls_pack->size( W, controls_pack->h() ); | |||
} | |||
void | |||
Chain::get_output_ports ( std::list<std::string> &sl) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m = module(i); | |||
for ( unsigned int j = 0; j < m->aux_audio_output.size(); j++ ) | |||
{ | |||
char *s; | |||
asprintf( &s, "%s/%s", | |||
"*", | |||
m->aux_audio_output[j].jack_port()->name() ); | |||
sl.push_back( s ); | |||
free(s); | |||
if ( ! strip()->group()->single() ) | |||
{ | |||
asprintf( &s, "%s/%s", | |||
strip()->group()->name(), | |||
m->aux_audio_output[j].jack_port()->name() ); | |||
sl.push_back( s ); | |||
free(s); | |||
} | |||
} | |||
} | |||
} | |||
void | |||
Chain::auto_connect_outputs ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
module(i)->auto_connect_outputs(); | |||
} | |||
} | |||
void | |||
Chain::auto_disconnect_outputs ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
module(i)->auto_disconnect_outputs(); | |||
} | |||
} | |||
/*****************/ | |||
/* Import/Export */ | |||
/*****************/ | |||
void | |||
Chain::snapshot ( void *v ) | |||
{ | |||
((Chain*)v)->snapshot(); | |||
} | |||
void | |||
Chain::snapshot ( void ) | |||
{ | |||
log_children(); | |||
} | |||
bool | |||
Chain::do_export ( const char *filename ) | |||
{ | |||
MESSAGE( "Exporting chain state" ); | |||
Loggable::snapshot_callback( &Chain::snapshot, this ); | |||
Loggable::snapshot( filename ); | |||
return true; | |||
} | |||
/**********/ | |||
/* Client */ | |||
/**********/ | |||
void | |||
Chain::process ( nframes_t nframes ) | |||
{ | |||
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i ) | |||
{ | |||
Module *m = *i; | |||
m->process( nframes ); | |||
} | |||
} | |||
void | |||
Chain::buffer_size ( nframes_t nframes ) | |||
{ | |||
for ( unsigned int i = scratch_port.size(); i--; ) | |||
free(scratch_port[i].buffer()); | |||
scratch_port.clear(); | |||
configure_ports(); | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
Module *m = module(i); | |||
m->resize_buffers( nframes ); | |||
} | |||
} | |||
int | |||
Chain::sample_rate_change ( nframes_t nframes ) | |||
{ | |||
Module::set_sample_rate ( nframes ); | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
Module *m = module(i); | |||
m->handle_sample_rate_change( nframes ); | |||
} | |||
return 0; | |||
} | |||
/* handle jack port connection change */ | |||
void | |||
Chain::port_connect ( jack_port_id_t a, jack_port_id_t b, int connect ) | |||
{ | |||
if ( _deleting ) | |||
return; | |||
/* this is called from JACK non-RT thread... */ | |||
if ( jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), a ) ) || | |||
jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), b ) )) | |||
{ | |||
Fl::awake( Chain::update_connection_status, this ); | |||
} | |||
} | |||
void | |||
Chain::update ( void ) | |||
{ | |||
for ( int i = 0; i < controls_pack->children(); ++i ) | |||
{ | |||
Controller_Module *cm = (Controller_Module*)controls_pack->child( i ); | |||
cm->update(); | |||
} | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m = module(i); | |||
m->update(); | |||
} | |||
} | |||
void | |||
Chain::update_connection_status ( void *v ) | |||
{ | |||
((Chain*)v)->update_connection_status(); | |||
} | |||
void | |||
Chain::update_connection_status ( void ) | |||
{ | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
Module *m = module(i); | |||
if ( !strcmp( m->basename(), "JACK" ) ) | |||
{ | |||
((JACK_Module*)m)->update_connection_status(); | |||
} | |||
} | |||
} |
@@ -1,149 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Pack.H> | |||
#include <FL/Fl_Button.H> | |||
#include "Module.H" | |||
#include "JACK/Port.H" | |||
#include <vector> | |||
#include <list> | |||
#include "Loggable.H" | |||
#include "Group.H" | |||
class Mixer_Strip; | |||
class Fl_Flowpack; | |||
class Fl_Flip_Button; | |||
class Controller_Module; | |||
class Chain : public Fl_Group, public Loggable { | |||
Fl_Flip_Button *tab_button; | |||
Fl_Pack *controls_pack; | |||
Fl_Group *chain_tab; | |||
Fl_Group *control_tab; | |||
Fl_Pack *modules_pack; | |||
Mixer_Strip *_strip; | |||
const char *_name; | |||
std::list<Module*> process_queue; | |||
std::vector <Module::Port> scratch_port; | |||
Fl_Callback *_configure_outputs_callback; | |||
void *_configure_outputs_userdata; | |||
bool _deleting; | |||
private: | |||
static void snapshot ( void *v ); | |||
void snapshot ( void ); | |||
void cb_handle(Fl_Widget*); | |||
static void cb_handle(Fl_Widget*, void*); | |||
void draw_connections ( Module *m ); | |||
void build_process_queue ( void ); | |||
void add_to_process_queue ( Module *m ); | |||
static void update_connection_status ( void *v ); | |||
void update_connection_status ( void ); | |||
protected: | |||
void get ( Log_Entry &e ) const; | |||
void set ( Log_Entry &e ); | |||
public: | |||
void auto_connect_outputs ( void ); | |||
void auto_disconnect_outputs ( void ); | |||
void get_output_ports ( std::list<std::string> &sl); | |||
void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect ); | |||
void buffer_size ( nframes_t nframes ); | |||
int sample_rate_change ( nframes_t nframes ); | |||
void process ( nframes_t ); | |||
Chain ( int X, int Y, int W, int H, const char *L = 0 ); | |||
Chain ( ); | |||
virtual ~Chain ( ); | |||
void update ( void ); | |||
void draw ( void ); | |||
void resize ( int X, int Y, int W, int H ); | |||
Mixer_Strip *strip ( void ) const { return _strip; } | |||
void strip ( Mixer_Strip *v ); | |||
const char *name ( void ) const { return _name; } | |||
void name ( const char *name ); | |||
void send_feedback ( void ); | |||
int get_module_instance_number ( Module *m ); | |||
void configure_ports ( void ); | |||
int required_buffers ( void ); | |||
bool can_support_input_channels ( int n ); | |||
int modules ( void ) const { return modules_pack->children(); } | |||
Module *module ( int n ) const { return (Module*)modules_pack->child( n ); } | |||
void remove ( Controller_Module *m ); | |||
void remove ( Module *m ); | |||
bool add ( Module *m ); | |||
bool add ( Controller_Module *m ); | |||
bool insert ( Module *m, Module *n ); | |||
void add_control ( Controller_Module *m ); | |||
bool do_export ( const char *filename ); | |||
void initialize_with_default ( void ); | |||
bool can_configure_outputs ( Module *m, int n ) const; | |||
void configure_outputs_callback ( Fl_Callback *cb, void *v ) | |||
{ | |||
_configure_outputs_callback = cb; | |||
_configure_outputs_userdata = v; | |||
} | |||
void set_latency ( JACK::Port::direction_e ); | |||
Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; } | |||
virtual void log_children ( void ) const; | |||
static unsigned int maximum_name_length ( void ); | |||
Group *client ( void ); | |||
void freeze_ports ( void ); | |||
void thaw_ports ( void ); | |||
// void client ( Client * ); | |||
LOG_CREATE_FUNC( Chain ); | |||
}; |
@@ -1,994 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "const.h" | |||
#include "Controller_Module.H" | |||
#include <stdio.h> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Box.H> | |||
#include <FL/fl_ask.H> | |||
#include <FL/Fl_Counter.H> | |||
#include <FL/Fl_Menu_Item.H> | |||
#include <FL/Fl_Menu_Button.H> | |||
#include <FL/Fl_Menu_.H> | |||
#include <FL/Fl_Light_Button.H> | |||
#include <FL/fl_draw.H> | |||
#include "FL/Fl_DialX.H" | |||
#include "FL/Fl_Labelpad_Group.H" | |||
#include "FL/Fl_Value_SliderX.H" | |||
#include "Panner.H" | |||
#include "FL/test_press.H" | |||
#include "FL/menu_popup.H" | |||
#include "Chain.H" | |||
#include "OSC/Endpoint.H" | |||
// needed for mixer->endpoint | |||
#include "Mixer.H" | |||
#include "Spatialization_Console.H" | |||
#include "string_util.h" | |||
bool Controller_Module::learn_by_number = false; | |||
bool Controller_Module::_learn_mode = false; | |||
void | |||
Controller_Module::take_focus ( void ) | |||
{ | |||
bool v = visible_focus(); | |||
if ( ! v ) | |||
set_visible_focus(); | |||
Fl_Widget::take_focus(); | |||
if ( ! v ) | |||
clear_visible_focus(); | |||
} | |||
Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 50, 100, name() ) | |||
{ | |||
// label( "" ); | |||
box( FL_NO_BOX ); | |||
_horizontal = true; | |||
_pad = true; | |||
control = 0; | |||
control_value =0.0f; | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
_mode = GUI; | |||
// mode( GUI ); | |||
// mode( CV ); | |||
// configure_inputs( 1 ); | |||
end(); | |||
// clear_visible_focus(); | |||
log_create(); | |||
} | |||
Controller_Module::~Controller_Module ( ) | |||
{ | |||
log_destroy(); | |||
/* shutdown JACK port, if we have one */ | |||
mode( GUI ); | |||
// disconnect(); | |||
} | |||
void | |||
Controller_Module::handle_chain_name_changed() | |||
{ | |||
if ( type() == SPATIALIZATION ) | |||
{ | |||
if ( Mixer::spatialization_console ) | |||
Mixer::spatialization_console->update(); | |||
} | |||
// change_osc_path( generate_osc_path() ); | |||
} | |||
void | |||
Controller_Module::handle_control_disconnect ( Module::Port *p ) | |||
{ | |||
if ( type() == SPATIALIZATION ) | |||
{ | |||
if ( Mixer::spatialization_console ) | |||
Mixer::spatialization_console->update(); | |||
} | |||
} | |||
void | |||
Controller_Module::disconnect ( void ) | |||
{ | |||
for ( unsigned int i = 0; i < control_output.size(); ++i ) | |||
control_output[i].disconnect(); | |||
} | |||
void | |||
Controller_Module::get ( Log_Entry &e ) const | |||
{ | |||
Module::get( e ); | |||
Port *p = control_output[0].connected_port(); | |||
if ( !p ) | |||
{ | |||
e.add( ":module", "" ); | |||
e.add( ":port", "" ); | |||
e.add( ":mode", "" ); | |||
} | |||
else | |||
{ | |||
Module *m = p->module(); | |||
e.add( ":module", m ); | |||
e.add( ":port", m->control_input_port_index( p ) ); | |||
e.add( ":mode", mode() ); | |||
} | |||
} | |||
void | |||
Controller_Module::set ( Log_Entry &e ) | |||
{ | |||
Module::set( e ); | |||
int port = -1; | |||
Module *module = NULL; | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":port" ) ) | |||
{ | |||
port = atoi( v ); | |||
} | |||
else if ( ! strcmp( s, ":module" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Module *t = (Module*)Loggable::find( i ); | |||
assert( t ); | |||
module = t; | |||
} | |||
} | |||
if ( port >= 0 && module ) | |||
{ | |||
connect_to( &module->control_input[port] ); | |||
module->chain()->add_control( this ); | |||
label( module->control_input[port].name() ); | |||
} | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":mode" ) ) | |||
{ | |||
mode( (Mode)atoi( v ) ); | |||
} | |||
} | |||
} | |||
void | |||
Controller_Module::mode ( Mode m ) | |||
{ | |||
if( mode() != CV && m == CV ) | |||
{ | |||
if ( control_output[0].connected() ) | |||
{ | |||
chain()->client()->lock(); | |||
Port *p = control_output[0].connected_port(); | |||
char prefix[512]; | |||
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() ); | |||
add_aux_cv_input( prefix, 0 ); | |||
chain()->client()->unlock(); | |||
} | |||
} | |||
else if ( mode() == CV && m != CV ) | |||
{ | |||
chain()->client()->lock(); | |||
aux_audio_input.back().jack_port()->shutdown(); | |||
delete aux_audio_input.back().jack_port(); | |||
aux_audio_input.pop_back(); | |||
chain()->client()->unlock(); | |||
} | |||
_mode = m ; | |||
} | |||
bool | |||
Controller_Module::connect_spatializer_radius_to ( Module *m ) | |||
{ | |||
Port *radius_port = NULL; | |||
float radius_value = 0.0f; | |||
for ( unsigned int i = 0; i < m->control_input.size(); ++i ) | |||
{ | |||
Port *p = &m->control_input[i]; | |||
if ( !strcasecmp( "Radius", p->name() ) ) | |||
/* 90.0f == p->hints.maximum && */ | |||
/* -90.0f == p->hints.minimum ) */ | |||
{ | |||
radius_port = p; | |||
radius_value = p->control_value(); | |||
continue; | |||
} | |||
} | |||
if ( ! radius_port ) | |||
return false; | |||
if ( control_output.size() != 3 ) | |||
{ | |||
control_output.clear(); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
} | |||
control_output[2].connect_to( radius_port ); | |||
maybe_create_panner(); | |||
Panner *o = (Panner*)control; | |||
o->point( 0 )->radius( radius_value ); | |||
if ( Mixer::spatialization_console ) | |||
Mixer::spatialization_console->update(); | |||
return true; | |||
} | |||
void | |||
Controller_Module::maybe_create_panner ( void ) | |||
{ | |||
if ( _type != SPATIALIZATION ) | |||
{ | |||
clear(); | |||
Panner *o = new Panner( 0,0, 92,92 ); | |||
o->box(FL_FLAT_BOX); | |||
o->color(FL_GRAY0); | |||
o->selection_color(FL_BACKGROUND_COLOR); | |||
o->labeltype(FL_NORMAL_LABEL); | |||
o->labelfont(0); | |||
o->labelcolor(FL_FOREGROUND_COLOR); | |||
o->align(FL_ALIGN_TOP); | |||
o->when(FL_WHEN_CHANGED); | |||
label( "Spatialization" ); | |||
o->align(FL_ALIGN_TOP); | |||
o->labelsize( 10 ); | |||
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) ); | |||
o->callback( cb_spatializer_handle, this ); | |||
control = (Fl_Valuator*)o; | |||
if ( _pad ) | |||
{ | |||
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o ); | |||
flg->position( x(), y() ); | |||
flg->set_visible_focus(); | |||
size( flg->w(), flg->h() ); | |||
add( flg ); | |||
} | |||
else | |||
{ | |||
// o->clear_visible_focus(); | |||
o->resize( x(), y(), w(), h() ); | |||
add( o ); | |||
resizable( o ); | |||
init_sizes(); | |||
} | |||
_type = SPATIALIZATION; | |||
} | |||
} | |||
/** attempt to transform this controller into a spatialization | |||
controller and connect to the given module's spatialization | |||
control inputs. Returns true on success, false if given module | |||
does not accept spatialization inputs. */ | |||
bool | |||
Controller_Module::connect_spatializer_to ( Module *m ) | |||
{ | |||
connect_spatializer_radius_to( m ); | |||
/* these are for detecting related parameter groups which can be | |||
better represented by a single control */ | |||
Port *azimuth_port = NULL; | |||
float azimuth_value = 0.0f; | |||
Port *elevation_port = NULL; | |||
float elevation_value = 0.0f; | |||
for ( unsigned int i = 0; i < m->control_input.size(); ++i ) | |||
{ | |||
Port *p = &m->control_input[i]; | |||
if ( !strcasecmp( "Azimuth", p->name() ) && | |||
180.0f == p->hints.maximum && | |||
-180.0f == p->hints.minimum ) | |||
{ | |||
azimuth_port = p; | |||
azimuth_value = p->control_value(); | |||
continue; | |||
} | |||
else if ( !strcasecmp( "Elevation", p->name() ) && | |||
90.0f == p->hints.maximum && | |||
-90.0f == p->hints.minimum ) | |||
{ | |||
elevation_port = p; | |||
elevation_value = p->control_value(); | |||
continue; | |||
} | |||
} | |||
if ( ! ( azimuth_port && elevation_port ) ) | |||
return false; | |||
if ( control_output.size() != 3 ) | |||
{ | |||
control_output.clear(); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) ); | |||
} | |||
control_output[0].connect_to( azimuth_port ); | |||
control_output[1].connect_to( elevation_port ); | |||
maybe_create_panner(); | |||
Panner *o = (Panner*)control; | |||
o->point( 0 )->azimuth( azimuth_value ); | |||
o->point( 0 )->elevation( elevation_value ); | |||
if ( Mixer::spatialization_console ) | |||
Mixer::spatialization_console->update(); | |||
return true; | |||
} | |||
void | |||
Controller_Module::connect_to ( Port *p ) | |||
{ | |||
control_output[0].connect_to( p ); | |||
clear(); | |||
Fl_Widget *w; | |||
if ( p->hints.type == Module::Port::Hints::BOOLEAN ) | |||
{ | |||
Fl_Button *o = new Fl_Button( 0, 0, 40, 40, p->name() ); | |||
w = o; | |||
o->type( FL_TOGGLE_BUTTON ); | |||
o->value( p->control_value() ); | |||
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) ); | |||
_type = TOGGLE; | |||
/* FIXME: hack */ | |||
control = (Fl_Valuator*)o; | |||
} | |||
else if ( p->hints.type == Module::Port::Hints::INTEGER ) | |||
{ | |||
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24, p->name() ); | |||
control = o; | |||
w = o; | |||
o->type(1); | |||
o->step(1); | |||
if ( p->hints.ranged ) | |||
{ | |||
o->minimum( p->hints.minimum ); | |||
o->maximum( p->hints.maximum ); | |||
} | |||
_type = SPINNER; | |||
o->value( p->control_value() ); | |||
} | |||
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC ) | |||
else | |||
{ | |||
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250, p->name() ); | |||
control = o; | |||
w = o; | |||
if ( ! _horizontal ) | |||
{ | |||
o->size( 30, 250 ); | |||
o->type(FL_VERT_NICE_SLIDER); | |||
} | |||
else | |||
{ | |||
o->size(250,20); | |||
o->type(FL_HOR_NICE_SLIDER); | |||
} | |||
// o->type(4); | |||
o->color( FL_BACKGROUND2_COLOR ); | |||
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) ); | |||
o->minimum(1.5); | |||
o->maximum(0); | |||
o->value(1); | |||
// o->textsize(9); | |||
if ( p->hints.ranged ) | |||
{ | |||
if ( ! _horizontal ) | |||
{ | |||
o->minimum( p->hints.maximum ); | |||
o->maximum( p->hints.minimum ); | |||
} | |||
else | |||
{ | |||
o->minimum( p->hints.minimum ); | |||
o->maximum( p->hints.maximum ); | |||
} | |||
} | |||
o->precision(2); | |||
o->value( p->control_value() ); | |||
_type = SLIDER; | |||
} | |||
/* else */ | |||
/* { */ | |||
/* { Fl_DialX *o = new Fl_DialX( 0, 0, 50, 50, p->name() ); */ | |||
/* w = o; */ | |||
/* control = o; */ | |||
/* if ( p->hints.ranged ) */ | |||
/* { */ | |||
/* DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum ); */ | |||
/* o->minimum( p->hints.minimum ); */ | |||
/* o->maximum( p->hints.maximum ); */ | |||
/* } */ | |||
/* o->color( fl_darker( FL_GRAY ) ); */ | |||
/* o->selection_color( FL_WHITE ); */ | |||
/* o->value( p->control_value() ); */ | |||
/* } */ | |||
/* _type = KNOB; */ | |||
/* } */ | |||
control_value = p->control_value(); | |||
w->clear_visible_focus(); | |||
w->align(FL_ALIGN_TOP); | |||
w->labelsize( 10 ); | |||
w->callback( cb_handle, this ); | |||
if ( _pad ) | |||
{ | |||
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( w ); | |||
flg->set_visible_focus(); | |||
size( flg->w(), flg->h() ); | |||
flg->position( x(), y() ); | |||
add( flg ); | |||
resizable(flg); | |||
// init_sizes(); | |||
} | |||
else | |||
{ | |||
/* HACK: hide label */ | |||
if ( _type == TOGGLE ) | |||
{ | |||
w->align( FL_ALIGN_INSIDE ); | |||
} | |||
else | |||
{ | |||
w->labeltype( FL_NO_LABEL ); | |||
} | |||
w->resize( x(), y(), this->w(), h() ); | |||
add( w ); | |||
resizable( w ); | |||
init_sizes(); | |||
} | |||
} | |||
void | |||
Controller_Module::update ( void ) | |||
{ | |||
/* we only need this in CV (JACK) mode, because with other forms | |||
* of control the change happens in the GUI thread and we know it */ | |||
if ( mode() != CV ) | |||
return; | |||
/* ensures that port value change callbacks are run */ | |||
if ( control && control_output.size() > 0 && control_output[0].connected() ) | |||
control_output[0].connected_port()->control_value( control_value ); | |||
} | |||
void | |||
Controller_Module::cb_handle ( Fl_Widget *w, void *v ) | |||
{ | |||
((Controller_Module*)v)->cb_handle( w ); | |||
} | |||
void | |||
Controller_Module::cb_handle ( Fl_Widget *w ) | |||
{ | |||
if ( type() == TOGGLE ) | |||
{ | |||
control_value = ((Fl_Button*)w)->value(); | |||
} | |||
else | |||
control_value = ((Fl_Valuator*)w)->value(); | |||
if ( control_output[0].connected() ) | |||
control_output[0].connected_port()->control_value( control_value ); | |||
} | |||
void | |||
Controller_Module::cb_spatializer_handle ( Fl_Widget *w, void *v ) | |||
{ | |||
((Controller_Module*)v)->cb_spatializer_handle( w ); | |||
} | |||
void | |||
Controller_Module::cb_spatializer_handle ( Fl_Widget *w ) | |||
{ | |||
Panner *pan = (Panner*)w; | |||
if ( control_output[0].connected() && | |||
control_output[1].connected() ) | |||
{ | |||
control_output[0].connected_port()->control_value( pan->point( 0 )->azimuth() ); | |||
control_output[1].connected_port()->control_value( pan->point( 0 )->elevation() ); | |||
} | |||
if ( control_output[2].connected() ) | |||
{ | |||
control_output[2].connected_port()->control_value( pan->point( 0 )->radius() ); | |||
} | |||
} | |||
void | |||
Controller_Module::menu_cb ( Fl_Widget *w, void *v ) | |||
{ | |||
((Controller_Module*)v)->menu_cb( (Fl_Menu_*) w ); | |||
} | |||
void | |||
Controller_Module::menu_cb ( const Fl_Menu_ *m ) | |||
{ | |||
char picked[256]; | |||
m->item_pathname( picked, sizeof( picked ) ); | |||
Logger log( this ); | |||
if ( ! strcmp( picked, "Mode/GUI + OSC" ) ) | |||
mode( GUI ); | |||
else if ( ! strcmp( picked, "Mode/Control Voltage (JACK)" ) ) | |||
mode( CV ); | |||
else if ( ! strcmp( picked, "/Remove" ) ) | |||
command_remove(); | |||
else if ( ! strncmp( picked, "Connect To/", strlen( "Connect To/" ) ) ) | |||
{ | |||
char *peer_name = index( picked, '/' ) + 1; | |||
*index( peer_name, '/' ) = 0; | |||
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data(); | |||
const char *path = ((OSC::Signal*)m->mvalue()->user_data())->path(); | |||
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */ | |||
/* { */ | |||
/* _persistent_osc_connections.push_back( strdup(path) ); */ | |||
Port *p = control_output[0].connected_port(); | |||
if ( learn_by_number ) | |||
mixer->osc_endpoint->add_translation( path, p->osc_number_path()); | |||
else | |||
mixer->osc_endpoint->add_translation( path, p->osc_path() ); | |||
} | |||
else if ( ! strncmp( picked, "Disconnect From/", strlen( "Disconnect From/" ) ) ) | |||
{ | |||
/* char *peer_name = index( picked, '/' ) + 1; */ | |||
/* *index( peer_name, '/' ) = 0; */ | |||
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data(); | |||
const char *path = (const char*)m->mvalue()->user_data(); | |||
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */ | |||
/* { */ | |||
/* _persistent_osc_connections.push_back( strdup(path) ); */ | |||
// Port *p = control_output[0].connected_port(); | |||
mixer->osc_endpoint->del_translation( path ); | |||
/* if ( learn_by_number ) */ | |||
/* { */ | |||
/* char *our_path = p->osc_number_path(); */ | |||
/* mixer->osc_endpoint->add_translation( path, our_path ); */ | |||
/* free(our_path); */ | |||
/* } */ | |||
/* else */ | |||
/* mixer->osc_endpoint->add_translation( path, p->osc_path() ); */ | |||
} | |||
/* } */ | |||
/* else */ | |||
/* { */ | |||
/* /\* timeline->osc->disconnect_signal( _osc_output(), path ); *\/ */ | |||
/* /\* for ( std::list<char*>::iterator i = _persistent_osc_connections.begin(); *\/ */ | |||
/* /\* i != _persistent_osc_connections.end(); *\/ */ | |||
/* /\* ++i ) *\/ */ | |||
/* /\* { *\/ */ | |||
/* /\* if ( !strcmp( *i, path ) ) *\/ */ | |||
/* /\* { *\/ */ | |||
/* /\* free( *i ); *\/ */ | |||
/* /\* i = _persistent_osc_connections.erase( i ); *\/ */ | |||
/* /\* break; *\/ */ | |||
/* /\* } *\/ */ | |||
/* /\* } *\/ */ | |||
/* //free( path ); */ | |||
/* } */ | |||
} | |||
static Fl_Menu_Button *peer_menu; | |||
static const char *peer_prefix; | |||
void | |||
Controller_Module::peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v ) | |||
{ | |||
char *s; | |||
DMESSAGE( "Paramter limits: %f %f", sig->parameter_limits().min, sig->parameter_limits().max ); | |||
/* only show outputs */ | |||
if ( sig->direction() != OSC::Signal::Output ) | |||
return; | |||
/* only list CV signals for now */ | |||
if ( ! ( sig->parameter_limits().min == 0.0 && | |||
sig->parameter_limits().max == 1.0 ) ) | |||
return; | |||
if ( ! v ) | |||
{ | |||
/* if( state == OSC::Signal::Created ) */ | |||
/* timeline->connect_osc(); */ | |||
/* else */ | |||
/* timeline->update_osc_connection_state(); */ | |||
} | |||
else | |||
{ | |||
/* building menu */ | |||
// const char *name = sig->peer_name(); | |||
assert( sig->path() ); | |||
char *path = strdup( sig->path() ); | |||
unescape_url( path ); | |||
asprintf( &s, "%s/%s", peer_prefix, path ); | |||
peer_menu->add( s, 0, NULL, (void*)( sig ), 0 ); | |||
/* FL_MENU_TOGGLE | */ | |||
/* ( ((Controller_Module*)v)->_osc_output()->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) ); */ | |||
free( path ); | |||
free( s ); | |||
} | |||
} | |||
void | |||
Controller_Module::add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix ) | |||
{ | |||
mixer->osc_endpoint->peer_signal_notification_callback( &Controller_Module::peer_callback, NULL ); | |||
peer_menu = m; | |||
peer_prefix = prefix; | |||
mixer->osc_endpoint->list_peer_signals( this ); | |||
} | |||
void | |||
Controller_Module::add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix ) | |||
{ | |||
/* peer_menu = m; */ | |||
const char *peer_prefix = prefix; | |||
// mixer->osc_endpoint->list_peer_signals( this ); | |||
Port *p = control_output[0].connected_port(); | |||
const char *number_path = p->osc_number_path(); | |||
const char *name_path = p->osc_path(); | |||
const char *paths[] = { number_path,name_path,NULL }; | |||
for ( const char **cpath = paths; *cpath; cpath++ ) | |||
{ | |||
const char ** conn = mixer->osc_endpoint->get_connections( *cpath ); | |||
if ( conn ) | |||
{ | |||
for ( const char **s = conn; *s; s++ ) | |||
{ | |||
/* building menu */ | |||
char *path = strdup( *s ); | |||
unescape_url( path ); | |||
char *ns; | |||
asprintf( &ns, "%s/%s", peer_prefix, path ); | |||
peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 ); | |||
free( path ); | |||
// free(*s); | |||
} | |||
free( conn ); | |||
} | |||
} | |||
} | |||
/** build the context menu for this control */ | |||
Fl_Menu_Button & | |||
Controller_Module::menu ( void ) | |||
{ | |||
static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" ); | |||
m.clear(); | |||
if ( mode() == GUI ) | |||
{ | |||
add_osc_peers_to_menu( &m, "Connect To" ); | |||
add_osc_connections_to_menu( &m, "Disconnect From" ); | |||
} | |||
m.add( "Mode/GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 )); | |||
m.add( "Mode/Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 )); | |||
m.add( "Remove", 0, 0, 0, is_default() ? FL_MENU_INACTIVE : 0 ); | |||
// menu_set_callback( m.items(), &Controller_Module::menu_cb, (void*)this ); | |||
m.callback( &Controller_Module::menu_cb, (void*)this ); | |||
// m.copy( items, (void*)this ); | |||
return m; | |||
} | |||
void | |||
Controller_Module::draw ( void ) | |||
{ | |||
Fl_Group::draw(); | |||
draw_box(x(),y(),w(),h()); | |||
if ( learn_mode() ) | |||
{ | |||
fl_rectf( x(),y(),w(),h(), fl_color_add_alpha( FL_MAGENTA, 50 ) ); | |||
} | |||
} | |||
int | |||
Controller_Module::handle ( int m ) | |||
{ | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( learn_mode() ) | |||
{ | |||
tooltip( "Now learning control. Move the desired control on your controller" ); | |||
//connect_to( &module->control_input[port] ); | |||
Port *p = control_output[0].connected_port(); | |||
if ( p ) | |||
{ | |||
const char * path = learn_by_number ? p->osc_number_path() : p->osc_path(); | |||
DMESSAGE( "Will learn %s", path ); | |||
mixer->osc_endpoint->learn( path ); | |||
} | |||
return 1; | |||
} | |||
if ( Fl::event_button3() ) | |||
{ | |||
/* context menu */ | |||
/* if ( type() != SPATIALIZATION ) */ | |||
menu_popup( &menu() ); | |||
return 1; | |||
} | |||
else | |||
return Fl_Group::handle( m ); | |||
} | |||
} | |||
return Fl_Group::handle( m ); | |||
} | |||
void | |||
Controller_Module::handle_control_changed ( Port *p ) | |||
{ | |||
/* ignore changes initiated while mouse is over widget */ | |||
if ( type() == SPATIALIZATION ) | |||
{ | |||
if ( Mixer::spatialization_console ) | |||
Mixer::spatialization_console->handle_control_changed( this ); | |||
} | |||
if ( contains( Fl::pushed() ) ) | |||
return; | |||
if ( p ) | |||
control_value = p->control_value(); | |||
if ( control->value() == control_value ) | |||
return; | |||
/* if ( control->value() != control_value ) */ | |||
/* { */ | |||
/* redraw(); */ | |||
/* } */ | |||
if ( type() == SPATIALIZATION ) | |||
{ | |||
Panner *pan = (Panner*)control; | |||
pan->point( 0 )->azimuth( control_output[0].control_value() ); | |||
pan->point( 0 )->elevation( control_output[1].control_value() ); | |||
if ( control_output[2].connected() ) | |||
{ | |||
// Port *pp = control_output[2].connected_port(); | |||
float v = control_output[2].control_value(); | |||
// float s = pp->hints.maximum - pp->hints.minimum; | |||
pan->point( 0 )->radius( v ); | |||
} | |||
if ( visible_r() ) | |||
pan->redraw(); | |||
} | |||
else | |||
{ | |||
if ( type() == TOGGLE ) | |||
((Fl_Button*)control)->value(control_value); | |||
else | |||
control->value(control_value); | |||
} | |||
} | |||
void | |||
Controller_Module::command_remove ( void ) | |||
{ | |||
if ( is_default() ) | |||
fl_alert( "Default modules may not be deleted." ); | |||
else | |||
{ | |||
chain()->remove( this ); | |||
Fl::delete_widget( this ); | |||
} | |||
} | |||
/**********/ | |||
/* Client */ | |||
/**********/ | |||
void | |||
Controller_Module::process ( nframes_t nframes ) | |||
{ | |||
THREAD_ASSERT( RT ); | |||
if ( type() == SPATIALIZATION ) | |||
{ | |||
return; | |||
} | |||
if ( control_output[0].connected() ) | |||
{ | |||
float f = control_value; | |||
if ( mode() == CV ) | |||
{ | |||
f = *((float*)aux_audio_input[0].jack_port()->buffer( nframes )); | |||
const Port *p = control_output[0].connected_port(); | |||
if (p->hints.ranged ) | |||
{ | |||
// scale value to range. | |||
// we assume that CV values are between 0 and 1 | |||
float scale = p->hints.maximum - p->hints.minimum; | |||
float offset = p->hints.minimum; | |||
f = ( f * scale ) + offset; | |||
} | |||
} | |||
// else | |||
// f = *((float*)control_output[0].buffer()); | |||
*((float*)control_output[0].buffer()) = f; | |||
control_value = f; | |||
} | |||
} |
@@ -1,127 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "Module.H" | |||
#include <vector> | |||
#include "JACK/Port.H" | |||
#include "OSC/Endpoint.H" | |||
class Fl_Menu_Button; | |||
class Fl_Menu_; | |||
class Fl_Valuator; | |||
class Controller_Module : public Module | |||
{ | |||
bool _pad; | |||
bool _horizontal; | |||
volatile float control_value; | |||
Fl_Menu_Button & menu ( void ); | |||
static void menu_cb ( Fl_Widget *w, void *v ); | |||
void menu_cb ( const Fl_Menu_ *m ); | |||
static void peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v ); | |||
void peer_callback( OSC::Signal *sig, OSC::Signal::State state ); | |||
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix ); | |||
void add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix ); | |||
public: | |||
static bool _learn_mode; | |||
static bool learn_by_number; | |||
static bool learn_mode ( void ) { return _learn_mode; } | |||
static void learn_mode ( bool b ) { _learn_mode = b; } | |||
enum Mode { GUI, CV, OSC, MIDI }; | |||
enum Type { KNOB, | |||
SLIDER, | |||
SPINNER, | |||
TOGGLE, | |||
SPATIALIZATION }; | |||
Mode mode ( void ) const { return _mode; } | |||
void mode ( Mode v ); | |||
void horizontal ( bool v ) { _horizontal = v; } | |||
Type type ( void ) const { return _type; } | |||
Controller_Module ( bool is_default = false ); | |||
virtual ~Controller_Module ( ); | |||
const char *name ( void ) const { return "Controller"; } | |||
int can_support_inputs ( int ) { return 0; } | |||
bool configure_inputs ( int ) { return false; } | |||
void pad ( bool v ) { _pad = v; } | |||
static void cb_handle ( Fl_Widget *w, void *v ); | |||
void cb_handle ( Fl_Widget *w ); | |||
static void cb_spatializer_handle ( Fl_Widget *w, void *v ); | |||
void cb_spatializer_handle ( Fl_Widget *w ); | |||
void connect_to ( Port *p ); | |||
bool connect_spatializer_to ( Module *m ); | |||
bool connect_spatializer_radius_to ( Module *m ); | |||
void disconnect ( void ); | |||
void handle_control_changed ( Port *p ); | |||
void handle_chain_name_changed ( void ); | |||
void handle_control_disconnect ( Port *p ); | |||
virtual void command_remove ( void ); | |||
LOG_CREATE_FUNC( Controller_Module ); | |||
virtual void update ( void ); | |||
void process ( nframes_t nframes ); | |||
void draw ( void ); | |||
int handle ( int m ); | |||
void take_focus ( void ); | |||
// void set_control_value ( float f ) { control_value = f; } | |||
protected: | |||
void get ( Log_Entry &e ) const; | |||
void set ( Log_Entry &e ); | |||
private: | |||
void maybe_create_panner ( void ); | |||
char *generate_osc_path ( void ); | |||
void change_osc_path ( char *path ); | |||
Mode _mode; | |||
Type _type; | |||
Fl_Valuator *control; | |||
}; |
@@ -1,256 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* a Digital Peak Meter, either horizontal or vertical. Color is a | |||
gradient from min_color() to max_color(). box() is used to draw the | |||
individual 'lights'. division() controls how many 'lights' there | |||
are. value() is volume in dBFS */ | |||
#include "DPM.H" | |||
/* we cache the gradient for (probably excessive) speed */ | |||
float DPM::_dim; | |||
Fl_Color DPM::_gradient[128] = { (Fl_Color)0 }; | |||
Fl_Color DPM::_dim_gradient[128]; | |||
#include <FL/Fl.H> | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl_Group.H> | |||
#include <math.h> | |||
#include <stdio.h> | |||
DPM::DPM ( int X, int Y, int W, int H, const char *L ) : | |||
Meter( X, Y, W, H, L ) | |||
{ | |||
tooltip( peak_string ); | |||
_last_drawn_hi_segment = 0; | |||
pixels_per_segment( 4 ); | |||
type( FL_VERTICAL ); | |||
// resize( X, Y, W, H ); | |||
dim( 0.85f ); | |||
/* initialize gradients */ | |||
if ( DPM::_gradient[ 0 ] == 0 ) | |||
{ | |||
int breaks[] = {0,60,70,80,90,127}; | |||
Fl_Color cols[] = { | |||
fl_rgb_color( 45,58,64), | |||
fl_rgb_color( 84,181,195 ), | |||
fl_rgb_color( 122,200,211 ), | |||
fl_rgb_color( 178,213,212 ), | |||
fl_rgb_color( 209,213,179 ), | |||
fl_rgb_color( 250, 40, 30 ) | |||
}; | |||
DPM::blend( 6, breaks, cols ); | |||
} | |||
box( FL_FLAT_BOX ); | |||
color( FL_BACKGROUND_COLOR ); | |||
resize( X,Y,W,H); | |||
} | |||
/* which marks to draw beside meter */ | |||
const int marks [] = { -70, -50, -40, -30, -20, -10, -3, 0, 4 }; | |||
void | |||
DPM::draw_label ( void ) | |||
{ | |||
/* dirty hack */ | |||
if ( parent()->child( 0 ) == this ) | |||
{ | |||
fl_font( FL_TIMES, 8 ); | |||
fl_color( FL_WHITE ); | |||
/* draw marks */ | |||
char pat[5]; | |||
if ( type() == FL_HORIZONTAL ) | |||
{ | |||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; ) | |||
{ | |||
sprintf( pat, "%d", marks[ i ] ); | |||
int v = w() * deflection( (float)marks[ i ] ); | |||
fl_draw( pat, x() + v, (y() + h() + 8), 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) ); | |||
} | |||
} | |||
else | |||
{ | |||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; ) | |||
{ | |||
sprintf( pat, "%d", marks[ i ] ); | |||
int v = h() * deflection( (float)marks[ i ] ); | |||
fl_draw( pat, x() - 20, (y() + h() - 4) - v, 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) ); | |||
} | |||
} | |||
} | |||
} | |||
void | |||
DPM::resize ( int X, int Y, int W, int H ) | |||
{ | |||
int old_segments = _segments; | |||
Fl_Widget::resize( X, Y, W, H ); | |||
int tx,ty,tw,th; | |||
bbox(tx,ty,tw,th); | |||
if ( type() == FL_HORIZONTAL ) | |||
_segments = floor( tw / (double)_pixels_per_segment ); | |||
else | |||
_segments = floor( th / (double)_pixels_per_segment ); | |||
if ( old_segments != _segments ) | |||
_last_drawn_hi_segment = 0; | |||
} | |||
void DPM::bbox ( int &X, int &Y, int &W, int &H ) | |||
{ | |||
X = x() + 2; | |||
Y = y() + 2; | |||
W = w() - 4; | |||
H = h() - 4; | |||
} | |||
void | |||
DPM::draw ( void ) | |||
{ | |||
snprintf( peak_string, sizeof( peak_string ), "%.1f", peak() ); | |||
tooltip( peak_string ); | |||
int X,Y,W,H; | |||
bbox(X,Y,W,H); | |||
int v = pos( value() ); | |||
int pv = pos( peak() ); | |||
int clipv = pos( 0 ); | |||
int bh = H / _segments; | |||
/* int bh = _pixels_per_segment; */ | |||
/* int bw = _pixels_per_segment; */ | |||
int bw = W / _segments; | |||
if ( damage() & FL_DAMAGE_ALL ) | |||
{ | |||
draw_label(); | |||
draw_box( FL_FLAT_BOX, x(), y(), w(), h(), FL_DARK1 ); | |||
} | |||
fl_push_clip( X, Y, W, H ); | |||
const int active = active_r(); | |||
int hi, lo; | |||
/* only draw as many segments as necessary */ | |||
if ( damage() == FL_DAMAGE_USER1 ) | |||
{ | |||
if ( v > _last_drawn_hi_segment ) | |||
{ | |||
hi = v; | |||
lo = _last_drawn_hi_segment; | |||
} | |||
else | |||
{ | |||
hi = _last_drawn_hi_segment; | |||
lo = v; | |||
} | |||
} | |||
else | |||
{ | |||
lo = 0; | |||
hi = _segments; | |||
} | |||
_last_drawn_hi_segment = v; | |||
for ( int p = lo; p <= hi; p++ ) | |||
{ | |||
Fl_Color c; | |||
if ( p <= v ) | |||
{ | |||
if ( p == clipv ) | |||
c = fl_color_average( FL_YELLOW, div_color( p ), 0.40 ); | |||
else | |||
c = div_color( p ); | |||
} | |||
else if ( p == pv ) | |||
c = div_color( p ); | |||
else | |||
c = dim_div_color( p ); | |||
if ( ! active ) | |||
c = fl_inactive( c ); | |||
int yy = 0; | |||
int xx = 0; | |||
if ( type() == FL_HORIZONTAL ) | |||
{ | |||
xx = X + p * bw; | |||
fl_rectf( X + (p * bw), Y, bw, H, c ); | |||
} | |||
else | |||
{ | |||
yy = Y + H - ((p+1) * bh); | |||
fl_rectf( X, yy, W, bh, c ); | |||
} | |||
if ( _pixels_per_segment >= 3 ) | |||
{ | |||
fl_color( FL_DARK1 ); | |||
if ( type() == FL_HORIZONTAL ) | |||
{ | |||
fl_line( xx, Y, xx, Y + H - 1 ); | |||
} | |||
else | |||
{ | |||
fl_line( X, yy, X + W - 1, yy ); | |||
} | |||
} | |||
/* } */ | |||
/* else */ | |||
/* { */ | |||
/* if ( type() == FL_HORIZONTAL ) */ | |||
/* fl_draw_box( box(), X + (p * bw), Y, bw, H, c ); */ | |||
/* else */ | |||
/* fl_draw_box( box(), X, Y + H - ((p + 1) * bh), W, bh, c ); */ | |||
/* } */ | |||
} | |||
fl_pop_clip(); | |||
} |
@@ -1,107 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl_Valuator.H> // for FL_HORIZONTAL and FL_VERTICAL | |||
#include "Meter.H" | |||
class DPM : public Meter | |||
{ | |||
char peak_string[10]; | |||
int _segments; | |||
int _pixels_per_segment; | |||
int _last_drawn_hi_segment; | |||
float _value; | |||
int pos ( float v ) | |||
{ | |||
float pv = deflection( v ) * ( _segments - 1 ); | |||
return pv; | |||
} | |||
static float _dim; | |||
static Fl_Color _gradient[]; | |||
static Fl_Color _dim_gradient[]; | |||
Fl_Color | |||
div_color ( int i ) | |||
{ | |||
return _gradient[ i * 127 / _segments ]; | |||
} | |||
Fl_Color | |||
dim_div_color ( int i ) | |||
{ | |||
return _dim_gradient[ i * 127 / _segments ]; | |||
} | |||
protected: | |||
virtual void draw_label ( void ); | |||
virtual void draw ( void ); | |||
virtual void resize ( int, int, int, int ); | |||
void bbox ( int &X, int &Y, int &W, int &H ); | |||
public: | |||
DPM ( int X, int Y, int W, int H, const char *L = 0 ); | |||
void value ( float v ) | |||
{ | |||
if ( _value != v ) | |||
{ | |||
if ( pos( v ) != pos( _value ) ) | |||
Meter::value( v ); | |||
} | |||
_value = v; | |||
} | |||
float value ( void ) const | |||
{ | |||
return _value; | |||
} | |||
void pixels_per_segment ( int v ) { _pixels_per_segment = v; } | |||
float dim ( void ) const { return _dim; } | |||
void dim ( float v ) { _dim = v; if ( visible_r() ) redraw(); } | |||
static | |||
void | |||
blend ( int nbreaks, int* b, Fl_Color *c ) | |||
{ | |||
for ( int i = 0; i < nbreaks - 1; i++ ) | |||
{ | |||
int k = 0; | |||
for ( int j = b[i]; j <= b[i+1]; j++, k++ ) | |||
_gradient[ j ] = fl_color_average( c[i+1], c[i], ( k ) / (float)(b[i+1] - b[i] )); | |||
} | |||
for ( int i = 0; i < 128; i++ ) | |||
_dim_gradient[ i ] = fl_color_average( FL_BLACK, _gradient[ i ], _dim ); | |||
} | |||
}; |
@@ -1,142 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <math.h> | |||
#include <dsp.h> | |||
#include "Gain_Module.H" | |||
Gain_Module::Gain_Module ( ) | |||
: Module ( 50, 24, name() ) | |||
{ | |||
add_port( Port( this, Port::INPUT, Port::AUDIO ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) ); | |||
{ | |||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" ); | |||
p.hints.type = Port::Hints::LINEAR; | |||
p.hints.ranged = true; | |||
p.hints.minimum = -70.0f; | |||
p.hints.maximum = 6.0f; | |||
p.hints.default_value = 0.0f; | |||
p.connect_to( new float ); | |||
p.control_value( p.hints.default_value ); | |||
add_port( p ); | |||
} | |||
{ | |||
Port p( this, Port::INPUT, Port::CONTROL, "Mute" ); | |||
p.hints.type = Port::Hints::BOOLEAN; | |||
p.hints.ranged = true; | |||
p.hints.minimum = 0.0f; | |||
p.hints.maximum = 1.0f; | |||
p.hints.default_value = 0.0f; | |||
p.connect_to( new float ); | |||
p.control_value( p.hints.default_value ); | |||
add_port( p ); | |||
} | |||
end(); | |||
log_create(); | |||
smoothing.sample_rate( sample_rate() ); | |||
} | |||
Gain_Module::~Gain_Module ( ) | |||
{ | |||
delete (float*)control_input[0].buffer(); | |||
delete (float*)control_input[1].buffer(); | |||
log_destroy(); | |||
} | |||
bool | |||
Gain_Module::configure_inputs ( int n ) | |||
{ | |||
audio_input.clear(); | |||
audio_output.clear(); | |||
// control_input.clear(); | |||
for ( int i = 0; i < n; ++i ) | |||
{ | |||
add_port( Port( this, Port::INPUT, Port::AUDIO ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) ); | |||
} | |||
return true; | |||
} | |||
void | |||
Gain_Module::handle_sample_rate_change ( nframes_t n ) | |||
{ | |||
smoothing.sample_rate( n ); | |||
} | |||
/**********/ | |||
/* Engine */ | |||
/**********/ | |||
void | |||
Gain_Module::process ( nframes_t nframes ) | |||
{ | |||
if ( unlikely( bypass() ) ) | |||
{ | |||
/* nothing to do */ | |||
} | |||
else | |||
{ | |||
const float gt = DB_CO( control_input[1].control_value() ? -90.f : control_input[0].control_value() ); | |||
sample_t gainbuf[nframes]; | |||
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt ); | |||
if ( unlikely( use_gainbuf ) ) | |||
{ | |||
for ( int i = audio_input.size(); i--; ) | |||
{ | |||
if ( audio_input[i].connected() && audio_output[i].connected() ) | |||
{ | |||
sample_t *out = (sample_t*)audio_input[i].buffer(); | |||
buffer_apply_gain_buffer( out, gainbuf, nframes ); | |||
} | |||
} | |||
} | |||
else | |||
for ( int i = audio_input.size(); i--; ) | |||
{ | |||
if ( audio_input[i].connected() && audio_output[i].connected() ) | |||
{ | |||
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, gt ); | |||
} | |||
} | |||
} | |||
} |
@@ -1,50 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "Module.H" | |||
#include "dsp.h" | |||
class Gain_Module : public Module | |||
{ | |||
Value_Smoothing_Filter smoothing; | |||
public: | |||
Gain_Module ( ); | |||
Gain_Module ( const Gain_Module & rhs ); | |||
virtual ~Gain_Module ( ); | |||
const char *name ( void ) const { return "Gain"; } | |||
int can_support_inputs ( int n ) { return n; } | |||
bool configure_inputs ( int n ); | |||
LOG_CREATE_FUNC( Gain_Module ); | |||
MODULE_CLONE_FUNC( Gain_Module ); | |||
virtual void handle_sample_rate_change ( nframes_t n ); | |||
protected: | |||
virtual void process ( nframes_t nframes ); | |||
}; |
@@ -1,303 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include <Mixer.H> | |||
#include "Group.H" | |||
#include "Chain.H" | |||
#include "Mixer_Strip.H" | |||
#include "Module.H" | |||
#include <unistd.h> | |||
extern char *instance_name; | |||
Group::Group ( ) | |||
{ | |||
_single =false; | |||
_name = NULL; | |||
_dsp_load = _load_coef = 0; | |||
} | |||
Group::Group ( const char *name, bool single ) : Loggable ( !single ) | |||
{ | |||
_single = single; | |||
_name = strdup(name); | |||
_dsp_load = _load_coef = 0; | |||
// this->name( name ); | |||
/* FIXME: handle client creation error */ | |||
/* if ( ! jack_name ) */ | |||
/* { */ | |||
/* _engine = NULL; */ | |||
/* // fl_alert( "Could not create JACK client. Perhaps the sound device already in use. In any event, now I'll die." ); */ | |||
/* exit( 1 ); */ | |||
/* // return false; */ | |||
/* } */ | |||
} | |||
Group::~Group ( ) | |||
{ | |||
DMESSAGE( "Destroying group" ); | |||
if ( _name ) | |||
free( _name ); | |||
deactivate(); | |||
} | |||
void | |||
Group::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":name", name() ); | |||
} | |||
void | |||
Group::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! ( strcmp( s, ":name" ) ) ) | |||
{ | |||
bool add = false; | |||
if (!_name ) | |||
add = true; | |||
_name = strdup(v); | |||
if ( add ) | |||
mixer->add_group(this); | |||
} | |||
} | |||
} | |||
/*************/ | |||
/* Callbacks */ | |||
/*************/ | |||
void | |||
Group::latency ( jack_latency_callback_mode_t mode ) | |||
{ | |||
for ( std::list<Mixer_Strip*>::iterator i = strips.begin(); | |||
i != strips.end(); | |||
i++ ) | |||
{ | |||
if ( (*i)->chain() ) | |||
(*i)->chain()->set_latency(mode == JackCaptureLatency ? JACK::Port::Input : JACK::Port::Output ); | |||
} | |||
} | |||
/* THREAD: RT */ | |||
/** This is the jack xrun callback */ | |||
int | |||
Group::xrun ( void ) | |||
{ | |||
return 0; | |||
} | |||
/* THREAD: RT */ | |||
void | |||
Group::freewheel ( bool starting ) | |||
{ | |||
if ( starting ) | |||
DMESSAGE( "entering freewheeling mode" ); | |||
else | |||
DMESSAGE( "leaving freewheeling mode" ); | |||
} | |||
/* THREAD: RT (non-RT) */ | |||
int | |||
Group::buffer_size ( nframes_t nframes ) | |||
{ | |||
recal_load_coef(); | |||
/* JACK calls this in the RT thread, even though it's a | |||
* non-realtime operation. This mucks up our ability to do | |||
* THREAD_ASSERT, so just lie and say this is the UI thread... */ | |||
_thread.set( "UI" ); | |||
for ( std::list<Mixer_Strip*>::iterator i = strips.begin(); | |||
i != strips.end(); | |||
i++ ) | |||
{ | |||
if ( (*i)->chain() ) | |||
(*i)->chain()->buffer_size(nframes); | |||
} | |||
_thread.set( "RT" ); | |||
return 0; | |||
} | |||
/* THREAD: ?? */ | |||
void | |||
Group::port_connect( jack_port_id_t a, jack_port_id_t b, int connect ) | |||
{ | |||
for ( std::list<Mixer_Strip*>::iterator i = strips.begin(); | |||
i != strips.end(); | |||
i++ ) | |||
{ | |||
if ( (*i)->chain() ) | |||
(*i)->chain()->port_connect( a, b, connect); | |||
} | |||
} | |||
/* THREAD: RT */ | |||
int | |||
Group::process ( nframes_t nframes ) | |||
{ | |||
jack_time_t then = jack_get_time(); | |||
/* FIXME: wrong place for this */ | |||
_thread.set( "RT" ); | |||
if ( ! trylock() ) | |||
{ | |||
/* the data structures we need to access here (tracks and | |||
* their ports, but not track contents) may be in an | |||
* inconsistent state at the moment. Just punt and drop this | |||
* buffer. */ | |||
++_buffers_dropped; | |||
return 0; | |||
} | |||
/* since feedback loops are forbidden and outputs are | |||
* summed, we don't care what order these are processed | |||
* in */ | |||
for ( std::list<Mixer_Strip*>::iterator i = strips.begin(); | |||
i != strips.end(); | |||
i++ ) | |||
{ | |||
if ( (*i)->chain() ) | |||
(*i)->chain()->process(nframes); | |||
} | |||
unlock(); | |||
_dsp_load = (float)(jack_get_time() - then ) * _load_coef; | |||
return 0; | |||
} | |||
void | |||
Group::recal_load_coef ( void ) | |||
{ | |||
_load_coef = 1.0f / ( nframes() / (float)sample_rate() * 1000000.0 ); | |||
} | |||
int | |||
Group::sample_rate_changed ( nframes_t srate ) | |||
{ | |||
recal_load_coef(); | |||
for ( std::list<Mixer_Strip*>::iterator i = strips.begin(); | |||
i != strips.end(); | |||
i++ ) | |||
{ | |||
if ( (*i)->chain() ) | |||
(*i)->chain()->sample_rate_change(srate); | |||
} | |||
return 0; | |||
} | |||
/* TRHEAD: RT */ | |||
void | |||
Group::thread_init ( void ) | |||
{ | |||
_thread.set( "RT" ); | |||
} | |||
/* THREAD: RT */ | |||
void | |||
Group::shutdown ( void ) | |||
{ | |||
} | |||
/*******************/ | |||
/* Group interface */ | |||
/*******************/ | |||
void | |||
Group::name ( const char *n ) | |||
{ | |||
if ( _name ) | |||
free( _name ); | |||
char ename[512]; | |||
_name = strdup( n ); | |||
if ( _single ) | |||
snprintf( ename, sizeof(ename), "%s/%s", instance_name, n ); | |||
else | |||
snprintf( ename, sizeof(ename), "%s (%s)", instance_name, n ); | |||
if ( !active() ) | |||
{ | |||
Client::init( ename ); | |||
Module::set_sample_rate( sample_rate() ); | |||
} | |||
else | |||
{ | |||
Client::name( ename ); | |||
} | |||
} | |||
void | |||
Group::add ( Mixer_Strip *o ) | |||
{ | |||
lock(); | |||
if ( ! active() ) | |||
{ | |||
/* to call init */ | |||
char *n = strdup(name()); | |||
name(n); | |||
free(n); | |||
} | |||
if ( o->chain() ) | |||
o->chain()->thaw_ports(); | |||
strips.push_back(o); | |||
unlock(); | |||
} | |||
void | |||
Group::remove ( Mixer_Strip *o ) | |||
{ | |||
lock(); | |||
strips.remove(o); | |||
if ( o->chain() ) | |||
o->chain()->freeze_ports(); | |||
if ( strips.size() == 0 && active() ) | |||
{ | |||
Client::close(); | |||
} | |||
unlock(); | |||
} | |||
@@ -1,102 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2013 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <list> | |||
class Mixer_Strip; | |||
#include "Mutex.H" | |||
class Port; | |||
#include "JACK/Client.H" | |||
#include "Thread.H" | |||
#include "Loggable.H" | |||
class Group : public Loggable, public JACK::Client, public Mutex | |||
{ | |||
bool _single; | |||
char *_name; | |||
Thread _thread; /* only used for thread checking */ | |||
int _buffers_dropped; /* buffers dropped because of locking */ | |||
/* int _buffers_dropped; /\* buffers dropped because of locking *\/ */ | |||
volatile float _dsp_load; | |||
float _load_coef; | |||
int sample_rate_changed ( nframes_t srate ); | |||
void shutdown ( void ); | |||
int process ( nframes_t nframes ); | |||
int xrun ( void ); | |||
void freewheel ( bool yes ); | |||
int buffer_size ( nframes_t nframes ); | |||
void thread_init ( void ); | |||
void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect ); | |||
virtual void latency ( jack_latency_callback_mode_t mode ); | |||
/* not allowed */ | |||
Group ( const Group &rhs ); | |||
Group & operator = ( const Group &rhs ); | |||
void request_locate ( nframes_t frame ); | |||
void recal_load_coef ( void ); | |||
protected: | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
private: | |||
friend class Port; | |||
friend class Transport; | |||
public: | |||
LOG_CREATE_FUNC( Group ); | |||
float dsp_load ( void ) const { return _dsp_load; } | |||
int nstrips ( void ) const { return strips.size(); } | |||
int dropped ( void ) const { return _buffers_dropped; } | |||
Group ( ); | |||
Group ( const char * name, bool single ); | |||
virtual ~Group ( ); | |||
bool single ( void ) const { return _single; } | |||
const char * name ( void ) const { return _name; } | |||
void name ( const char *n ); | |||
std::list<Mixer_Strip*> strips; | |||
/* static void process ( nframes_t nframes, void *v ); */ | |||
/* void process ( nframes_t nframes ); */ | |||
void add (Mixer_Strip*); | |||
void remove (Mixer_Strip*); | |||
/* Engine *engine ( void ) { return _engine; } */ | |||
}; | |||
@@ -1,730 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "const.h" | |||
#include <string.h> | |||
#include <FL/fl_ask.H> | |||
#include <FL/Fl_Box.H> | |||
#include <FL/Fl_Pack.H> | |||
#include <FL/Fl_Scalepack.H> | |||
#include "dsp.h" | |||
#include "Chain.H" | |||
#include "JACK_Module.H" | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Browser.H> | |||
#include <FL/Fl_PNG_Image.H> | |||
#include <FL/img_io_input_connector_10x10_png.h> | |||
#include <FL/img_io_output_connector_10x10_png.h> | |||
static Fl_PNG_Image *input_connector_image = NULL; | |||
static Fl_PNG_Image *output_connector_image = NULL; | |||
extern char *instance_name; | |||
#include "Mixer.H" | |||
#include "Group.H" | |||
static JACK_Module *receptive_to_drop = NULL; | |||
const int MAX_PORTS = 16; | |||
JACK_Module::JACK_Module ( bool log ) | |||
: Module ( 25, 25, name() ) | |||
{ | |||
_prefix = 0; | |||
_connection_handle_outputs[0][0] = 0; | |||
_connection_handle_outputs[0][1] = 0; | |||
_connection_handle_outputs[1][0] = 0; | |||
_connection_handle_outputs[1][1] = 0; | |||
align( FL_ALIGN_TOP | FL_ALIGN_INSIDE ); | |||
if ( log ) | |||
{ | |||
/* FIXME: how do Controls find out that a connected value has changed? How does this work in ladspa? */ | |||
{ | |||
Port p( this, Port::INPUT, Port::CONTROL, "Inputs" ); | |||
p.hints.type = Port::Hints::INTEGER; | |||
p.hints.minimum = 1; | |||
p.hints.maximum = MAX_PORTS; | |||
p.hints.ranged = true; | |||
p.hints.visible = false; | |||
p.connect_to( new float ); | |||
p.control_value_no_callback( 0 ); | |||
add_port( p ); | |||
} | |||
{ | |||
Port p( this, Port::INPUT, Port::CONTROL, "Outputs" ); | |||
p.hints.type = Port::Hints::INTEGER; | |||
p.hints.minimum = 1; | |||
p.hints.maximum = MAX_PORTS; | |||
p.hints.ranged = true; | |||
p.hints.visible = false; | |||
p.connect_to( new float ); | |||
p.control_value_no_callback( 0 ); | |||
add_port( p ); | |||
} | |||
color( FL_DARK1 ); | |||
log_create(); | |||
} | |||
{ Fl_Scalepack *o = new Fl_Scalepack( x() + Fl::box_dx(box()), | |||
y() + Fl::box_dy(box()), | |||
w() - Fl::box_dw(box()), | |||
h() - Fl::box_dh(box()) ); | |||
o->type( Fl_Pack::VERTICAL ); | |||
o->spacing(0); | |||
{ Fl_Scalepack *o = new Fl_Scalepack( x() + Fl::box_dx(box()), | |||
y() + Fl::box_dy(box()), | |||
w(), | |||
24 - Fl::box_dh(box()) ); | |||
o->type( Fl_Pack::HORIZONTAL ); | |||
o->spacing( 0 ); | |||
{ Fl_Box *o = input_connection_handle = new Fl_Box( x(), y(), 18, 18 ); | |||
o->tooltip( "Drag and drop to make and break JACK connections."); | |||
o->hide(); | |||
o->image( input_connector_image ? input_connector_image : input_connector_image = new Fl_PNG_Image( "input_connector", img_io_input_connector_10x10_png, img_io_input_connector_10x10_png_len ) ); | |||
} | |||
{ Fl_Box *o = new Fl_Box( x() + 10, y(), w() - 20, h() ); | |||
Fl_Group::current()->resizable(o); | |||
} | |||
{ Fl_Button *o = dec_button = new Fl_Button( 0, 0, 12, h(), "-" ); | |||
o->callback( cb_button, this ); | |||
o->labelsize(10); | |||
o->labelfont( FL_HELVETICA_BOLD ); | |||
o->hide(); | |||
} | |||
{ Fl_Button *o = inc_button = new Fl_Button( 0,0, 12, h(), "+" ); | |||
o->labelsize(10); | |||
o->labelfont( FL_HELVETICA_BOLD ); | |||
o->callback( cb_button, this ); | |||
o->hide(); | |||
} | |||
{ Fl_Box *o = output_connection_handle = new Fl_Box( x(), y(), 12, 12 ); | |||
o->tooltip( "Drag and drop to make and break JACK connections."); | |||
o->image( output_connector_image ? output_connector_image : output_connector_image = new Fl_PNG_Image( "output_connector", img_io_output_connector_10x10_png, img_io_output_connector_10x10_png_len ) ); | |||
o->hide(); | |||
} | |||
{ Fl_Box *o = output_connection2_handle = new Fl_Box( x(), y(), 12, 12 ); | |||
o->tooltip( "Drag and drop to make and break JACK connections."); | |||
o->image( output_connector_image ? output_connector_image : output_connector_image = new Fl_PNG_Image( "output_connector", img_io_output_connector_10x10_png, img_io_output_connector_10x10_png_len ) ); | |||
o->hide(); | |||
} | |||
o->end(); | |||
} | |||
{ | |||
Fl_Browser *o = connection_display = new Fl_Browser( 0, 0, w(), h() ); | |||
o->has_scrollbar(Fl_Browser_::VERTICAL); | |||
o->textsize( 10 ); | |||
o->textcolor( FL_LIGHT3 ); | |||
o->textfont( FL_COURIER ); | |||
o->box( FL_FLAT_BOX ); | |||
o->color( FL_DARK1 ); | |||
// o->color( fl_color_add_alpha( fl_rgb_color( 10, 10, 10 ), 100 )); | |||
Fl_Group::current()->resizable(o); | |||
} | |||
o->end(); | |||
resizable(o); | |||
} | |||
end(); | |||
} | |||
JACK_Module::~JACK_Module ( ) | |||
{ | |||
log_destroy(); | |||
configure_inputs( 0 ); | |||
configure_outputs( 0 ); | |||
if ( _prefix ) | |||
free( _prefix ); | |||
} | |||
void | |||
JACK_Module::draw ( void ) | |||
{ | |||
Module::draw(); | |||
if ( this == receptive_to_drop ) | |||
{ | |||
Fl_Widget *o = input_connection_handle; | |||
fl_draw_box( FL_OVAL_BOX, o->x(), o->y(), o->w(), o->h(), fl_color_add_alpha( FL_GREEN, 127 ) ); | |||
} | |||
} | |||
static std::list<std::string> | |||
get_connections_for_ports ( std::vector<Module::Port> ports ) | |||
{ | |||
std::list<std::string> names; | |||
for ( unsigned int i = 0; i < ports.size(); ++i ) | |||
{ | |||
const char **connections = ports[i].jack_port()->connections(); | |||
if ( ! connections ) | |||
return names; | |||
bool is_output = ports[i].jack_port()->direction() == JACK::Port::Output; | |||
for ( const char **c = connections; *c; c++ ) | |||
{ | |||
char *client_id = 0; | |||
char *strip_name = 0; | |||
// char *client_name = 0; | |||
if ( 2 == sscanf( *c, "Non-Mixer.%m[^:/]/%m[^:]:", &client_id, &strip_name ) ) | |||
{ | |||
free( client_id ); | |||
char *s = NULL; | |||
asprintf( &s, "%s%s", is_output ? "@r" : "", strip_name ); | |||
free( strip_name ); | |||
strip_name = s; | |||
} | |||
else if ( 2 == sscanf( *c, "Non-Mixer.%m[^:(] (%m[^:)]):", &client_id, &strip_name ) ) | |||
{ | |||
free( client_id ); | |||
char *s = NULL; | |||
asprintf( &s, "%s%s", is_output ? "@r" : "", strip_name ); | |||
free( strip_name ); | |||
strip_name = s; | |||
} | |||
else if ( 2 == sscanf( *c, "Non-Timeline.%m[^:/]:%m[^/]/", &client_id, &strip_name ) ) | |||
{ | |||
free( client_id ); | |||
char *s = NULL; | |||
asprintf( &s, "@C2%s%s", is_output ? "@r" : "", strip_name ); | |||
free( strip_name ); | |||
strip_name = s; | |||
} | |||
else if ( 2 == sscanf( *c, "Non-DAW.%m[^:/]:%m[^/]/", &client_id, &strip_name ) ) | |||
{ | |||
free( client_id ); | |||
char *s = NULL; | |||
asprintf( &s, "@C2%s%s", is_output ? "@r" : "", strip_name ); | |||
free( strip_name ); | |||
strip_name = s; | |||
} | |||
else if ( 1 == sscanf( *c, "%m[^:]:", &strip_name ) ) | |||
{ | |||
char *s = NULL; | |||
asprintf( &s, "@C3%s%s", is_output ? "@r" : "", strip_name ); | |||
free( strip_name ); | |||
strip_name = s; | |||
} | |||
else | |||
{ | |||
continue; | |||
} | |||
for ( std::list<std::string>::const_iterator j = names.begin(); | |||
j != names.end(); | |||
j++ ) | |||
{ | |||
if ( !strcmp( j->c_str(), strip_name ) ) | |||
{ | |||
goto skip; | |||
} | |||
} | |||
names.push_back( strip_name ); | |||
skip: | |||
free( strip_name ); | |||
; | |||
} | |||
} | |||
names.sort(); | |||
return names; | |||
} | |||
void | |||
JACK_Module::update_connection_status ( void ) | |||
{ | |||
/* do nothing when running in noui mode, as ->add will call some | |||
* font measurement stuff which attempts to open the X display. */ | |||
if ( ! fl_display ) | |||
{ | |||
return; | |||
} | |||
std::list<std::string> output_names = get_connections_for_ports( aux_audio_output ); | |||
std::list<std::string> input_names = get_connections_for_ports( aux_audio_input ); | |||
connection_display->clear(); | |||
int n = 0; | |||
for ( std::list<std::string>::const_iterator j = input_names.begin(); | |||
j != input_names.end(); | |||
j++ ) | |||
{ | |||
connection_display->add( j->c_str() ); | |||
n++; | |||
} | |||
for ( std::list<std::string>::const_iterator j = output_names.begin(); | |||
j != output_names.end(); | |||
j++ ) | |||
{ | |||
connection_display->add( j->c_str() ); | |||
n++; | |||
} | |||
/* limit number of lines displayed */ | |||
if ( n > 15 ) | |||
n = 15; | |||
if ( n > 0 ) | |||
size( w(), 26 + ( n * ( connection_display->incr_height() ) ) ); | |||
else | |||
size( w(), 24 ); | |||
parent()->parent()->redraw(); | |||
} | |||
void | |||
JACK_Module::cb_button ( Fl_Widget *w, void *v ) | |||
{ | |||
((JACK_Module*)v)->cb_button( w ); | |||
} | |||
void | |||
JACK_Module::cb_button( Fl_Widget *w ) | |||
{ | |||
int n = audio_output.size(); | |||
Logger log(this); | |||
if ( w == dec_button ) | |||
{ | |||
--n; | |||
} | |||
else if ( w == inc_button ) | |||
{ | |||
++n; | |||
} | |||
control_input[1].control_value( n ); | |||
} | |||
int | |||
JACK_Module::can_support_inputs ( int ) | |||
{ | |||
return audio_output.size(); | |||
} | |||
void | |||
JACK_Module::remove_aux_audio_outputs ( void ) | |||
{ | |||
for ( unsigned int i = aux_audio_output.size(); i--; ) | |||
{ | |||
aux_audio_output.back().jack_port()->shutdown(); | |||
aux_audio_output.pop_back(); | |||
} | |||
} | |||
bool | |||
JACK_Module::configure_inputs ( int n ) | |||
{ | |||
if ( n > 0 ) | |||
{ | |||
output_connection_handle->show(); | |||
} | |||
if ( n < 1 || n > MAX_PORTS ) | |||
return false; | |||
int on = audio_input.size(); | |||
if ( n > on ) | |||
{ | |||
for ( int i = on; i < n; ++i ) | |||
{ | |||
if ( add_aux_audio_output(_prefix, i ) ) | |||
{ | |||
add_port( Port( this, Port::INPUT, Port::AUDIO ) ); | |||
} | |||
} | |||
mixer->maybe_auto_connect_output(&aux_audio_output.back()); | |||
} | |||
else | |||
{ | |||
for ( int i = on; i > n; --i ) | |||
{ | |||
audio_input.back().disconnect(); | |||
audio_input.pop_back(); | |||
aux_audio_output.back().disconnect(); | |||
aux_audio_output.back().jack_port()->shutdown(); | |||
delete aux_audio_output.back().jack_port(); | |||
aux_audio_output.pop_back(); | |||
} | |||
} | |||
_connection_handle_outputs[0][0] = 0; | |||
_connection_handle_outputs[0][1] = aux_audio_output.size(); | |||
if ( is_default() ) | |||
control_input[0].control_value_no_callback( n ); | |||
return true; | |||
} | |||
bool | |||
JACK_Module::configure_outputs ( int n ) | |||
{ | |||
int on = audio_output.size(); | |||
if ( n > MAX_PORTS ) | |||
return false; | |||
if ( n > 0 ) | |||
{ | |||
input_connection_handle->show(); | |||
} | |||
if ( n > on ) | |||
{ | |||
for ( int i = on; i < n; ++i ) | |||
{ | |||
if ( add_aux_audio_input(_prefix, i ) ) | |||
{ | |||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) ); | |||
} | |||
} | |||
mixer->auto_connect(); | |||
} | |||
else | |||
{ | |||
for ( int i = on; i > n; --i ) | |||
{ | |||
audio_output.back().disconnect(); | |||
audio_output.pop_back(); | |||
aux_audio_input.back().disconnect(); | |||
aux_audio_input.back().jack_port()->shutdown(); | |||
delete aux_audio_input.back().jack_port(); | |||
aux_audio_input.pop_back(); | |||
} | |||
} | |||
if ( is_default() ) | |||
control_input[1].control_value_no_callback( n ); | |||
if ( n > 0 && is_default() ) | |||
{ | |||
dec_button->show(); | |||
inc_button->show(); | |||
} | |||
return true; | |||
} | |||
bool | |||
JACK_Module::initialize ( void ) | |||
{ | |||
return true; | |||
} | |||
void | |||
JACK_Module::handle_control_changed ( Port *p ) | |||
{ | |||
// THREAD_ASSERT( UI ); | |||
if ( 0 == strcmp( p->name(), "Inputs" ) ) | |||
{ | |||
DMESSAGE( "Adjusting number of inputs (JACK outputs)" ); | |||
configure_inputs( p->control_value() ); | |||
if ( chain() ) | |||
chain()->configure_ports(); | |||
} | |||
else if ( 0 == strcmp( p->name(), "Outputs" ) ) | |||
{ | |||
DMESSAGE( "Adjusting number of outputs (JACK inputs)" ); | |||
if ( ! chain() ) | |||
{ | |||
configure_outputs( p->control_value() ); | |||
} | |||
else if ( chain()->can_configure_outputs( this, p->control_value() ) ) | |||
{ | |||
configure_outputs( p->control_value() ); | |||
chain()->configure_ports(); | |||
} | |||
else | |||
{ | |||
p->connected_port()->control_value( noutputs() ); | |||
} | |||
} | |||
Module::handle_control_changed( p ); | |||
} | |||
int | |||
JACK_Module::handle ( int m ) | |||
{ | |||
static unsigned long _event_state = 0; | |||
unsigned long evstate = Fl::event_state(); | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
if ( Fl::event_inside( output_connection_handle ) || | |||
Fl::event_inside( output_connection2_handle ) || | |||
Fl::event_inside( input_connection_handle ) ) | |||
{ | |||
_event_state = evstate; | |||
return 1; | |||
} | |||
return Module::handle(m) || 1; | |||
case FL_RELEASE: | |||
Fl::selection_owner(0); | |||
receptive_to_drop = NULL; | |||
if ( Fl::event_inside( output_connection_handle ) || | |||
Fl::event_inside( output_connection2_handle ) || | |||
Fl::event_inside( input_connection_handle ) ) | |||
{ | |||
if ( _event_state & FL_BUTTON3 ) | |||
{ | |||
/* was a right click */ | |||
// TODO: Pop up connection menu. | |||
} | |||
} | |||
return Module::handle(m) || 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_is_click() ) | |||
return 1; | |||
int connection_handle = -1; | |||
if ( Fl::event_inside( output_connection_handle ) ) | |||
connection_handle = 0; | |||
if ( Fl::event_inside( output_connection2_handle ) ) | |||
connection_handle = 1; | |||
if ( Fl::event_button1() && | |||
connection_handle >= 0 | |||
&& ! Fl::selection_owner() ) | |||
{ | |||
DMESSAGE( "initiation of drag" ); | |||
char *s = (char*)malloc(256); | |||
s[0] = 0; | |||
for ( unsigned int i = _connection_handle_outputs[connection_handle][0]; | |||
i < aux_audio_output.size() && i < _connection_handle_outputs[connection_handle][1]; ++i ) | |||
{ | |||
char *s2; | |||
asprintf(&s2, "jack.port://%s\r\n", | |||
aux_audio_output[i].jack_port()->jack_name() ); | |||
s = (char*)realloc( s, strlen( s ) + strlen( s2 ) + 1 ); | |||
strcat( s, s2 ); | |||
free( s2 ); | |||
} | |||
Fl::copy(s, strlen(s) + 1, 0); | |||
Fl::selection_owner(this); | |||
free( s ); | |||
Fl::dnd(); | |||
return 1; | |||
} | |||
return 1; | |||
} | |||
/* we have to prevent Fl_Group::handle() from getting these, otherwise it will mess up Fl::belowmouse() */ | |||
case FL_MOVE: | |||
if ( Fl::event_inside( output_connection_handle ) || | |||
Fl::event_inside( output_connection2_handle ) || | |||
Fl::event_inside( input_connection_handle ) ) | |||
{ | |||
fl_cursor( FL_CURSOR_HAND ); | |||
} | |||
else | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
Module::handle(m); | |||
return 1; | |||
case FL_ENTER: | |||
case FL_DND_ENTER: | |||
Module::handle(m); | |||
return 1; | |||
case FL_LEAVE: | |||
case FL_DND_LEAVE: | |||
Module::handle(m); | |||
if ( this == receptive_to_drop ) | |||
{ | |||
receptive_to_drop = NULL; | |||
redraw(); | |||
} | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
return 1; | |||
case FL_DND_RELEASE: | |||
Fl::selection_owner(0); | |||
receptive_to_drop = NULL; | |||
redraw(); | |||
return 1; | |||
case FL_DND_DRAG: | |||
{ | |||
if ( this == receptive_to_drop ) | |||
return 1; | |||
if ( aux_audio_input.size() ) | |||
{ | |||
receptive_to_drop = this; | |||
redraw(); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
case FL_PASTE: | |||
{ | |||
receptive_to_drop = NULL; | |||
redraw(); | |||
if ( ! Fl::event_inside( this ) ) | |||
return 0; | |||
/* NOW we get the text... */ | |||
const char *text = Fl::event_text(); | |||
DMESSAGE( "Got drop text \"%s\"",text); | |||
if ( strncmp( text, "jack.port://", strlen( "jack.port://" ) ) ) | |||
{ | |||
return 0; | |||
} | |||
std::vector<std::string> port_names; | |||
char *port_name; | |||
int end; | |||
while ( sscanf( text, "jack.port://%m[^\r\n]\r\n%n", &port_name, &end ) > 0 ) | |||
{ | |||
DMESSAGE( "Scanning %s", port_name ); | |||
port_names.push_back( port_name ); | |||
free(port_name ); | |||
text += end; | |||
} | |||
for ( unsigned int i = 0; i < aux_audio_input.size() && i < port_names.size(); i++) | |||
{ | |||
const char *pn = port_names[i].c_str(); | |||
JACK::Port *ji = aux_audio_input[i].jack_port(); | |||
if ( ji->connected_to( pn ) ) | |||
{ | |||
DMESSAGE( "Disconnecting from \"%s\"", pn ); | |||
ji->disconnect( pn ); | |||
} | |||
else | |||
{ | |||
DMESSAGE( "Connecting to %s", pn ); | |||
ji->connect( pn ); | |||
} | |||
} | |||
Fl::selection_owner(0); | |||
return 1; | |||
} | |||
} | |||
return Module::handle(m); | |||
} | |||
/**********/ | |||
/* Engine */ | |||
/**********/ | |||
void | |||
JACK_Module::process ( nframes_t nframes ) | |||
{ | |||
for ( unsigned int i = 0; i < audio_input.size(); ++i ) | |||
{ | |||
if ( audio_input[i].connected() ) | |||
{ | |||
buffer_copy( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), | |||
(sample_t*)audio_input[i].buffer(), | |||
nframes ); | |||
} | |||
} | |||
for ( unsigned int i = 0; i < audio_output.size(); ++i ) | |||
{ | |||
if ( audio_output[i].connected() ) | |||
{ | |||
buffer_copy( (sample_t*)audio_output[i].buffer(), | |||
(sample_t*)aux_audio_input[i].jack_port()->buffer(nframes), | |||
nframes ); | |||
} | |||
} | |||
} |
@@ -1,87 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
class Fl_Box; | |||
class Fl_Browser; | |||
#include "Module.H" | |||
#include "JACK/Port.H" | |||
#include <vector> | |||
class JACK_Module : public Module | |||
{ | |||
char *_prefix; | |||
protected: | |||
void prefix ( const char *s ) | |||
{ | |||
if ( _prefix ) | |||
free( _prefix ); | |||
_prefix = NULL; | |||
if ( s ) | |||
_prefix = strdup( s ); | |||
} | |||
Fl_Button * dec_button; | |||
Fl_Button * inc_button; | |||
Fl_Browser * connection_display; | |||
Fl_Box * input_connection_handle; | |||
Fl_Box * output_connection_handle; | |||
Fl_Box * output_connection2_handle; | |||
static void cb_button ( Fl_Widget *w, void *v ); | |||
void cb_button ( Fl_Widget *w ); | |||
protected: | |||
unsigned int _connection_handle_outputs[2][2]; | |||
public: | |||
void update_connection_status ( void ); | |||
JACK_Module ( bool log = true ); | |||
virtual ~JACK_Module ( ); | |||
virtual const char *basename ( void ) const { return "JACK"; } | |||
virtual const char *name ( void ) const { return "JACK"; } | |||
virtual bool initialize ( void ); | |||
virtual void draw ( void ); | |||
virtual int handle ( int m ); | |||
virtual int can_support_inputs ( int ); | |||
void remove_aux_audio_outputs ( void ); | |||
virtual bool configure_inputs ( int n ); | |||
virtual bool configure_outputs ( int n ); | |||
virtual void handle_control_changed ( Port *p ); | |||
LOG_CREATE_FUNC( JACK_Module ); | |||
protected: | |||
virtual void process ( nframes_t nframes ); | |||
}; |
@@ -1,828 +0,0 @@ | |||
// | |||
// LADSPAInfo.C - Class for indexing information on LADSPA Plugins | |||
// | |||
// Copyleft (C) 2002 Mike Rawes <myk@waxfrenzy.org> | |||
// | |||
// This program is free software; you can redistribute it and/or modify | |||
// it under the terms of the GNU General Public License as published by | |||
// the Free Software Foundation; either version 2 of the License, or | |||
// (at your option) any later version. | |||
// | |||
// This program is distributed in the hope that it will be useful, | |||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
// GNU General Public License for more details. | |||
// | |||
// You should have received a copy of the GNU General Public License | |||
// along with this program; if not, write to the Free Software | |||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
// | |||
// #include <config.h> | |||
#include <vector> | |||
#include <string> | |||
#include <list> | |||
#include <map> | |||
#include <iostream> | |||
#include <sstream> | |||
#include <algorithm> | |||
#include <stdio.h> | |||
#include <cstring> | |||
#include <cstdlib> | |||
#include <sys/types.h> | |||
#include <sys/stat.h> | |||
#include <dirent.h> | |||
#include <dlfcn.h> | |||
#include <ladspa.h> | |||
#define HAVE_LIBLRDF 1 | |||
#ifdef HAVE_LIBLRDF | |||
#include <lrdf.h> | |||
#endif | |||
#include "LADSPAInfo.h" | |||
using namespace std; | |||
LADSPAInfo::LADSPAInfo(bool override, | |||
const char *path_list) | |||
{ | |||
if (strlen(path_list) > 0) { | |||
m_ExtraPaths = strdup(path_list); | |||
} else { | |||
m_ExtraPaths = NULL; | |||
} | |||
m_LADSPAPathOverride = override; | |||
RescanPlugins(); | |||
} | |||
LADSPAInfo::~LADSPAInfo() | |||
{ | |||
CleanUp(); | |||
} | |||
void | |||
LADSPAInfo::RescanPlugins(void) | |||
{ | |||
// Clear out what we've got | |||
CleanUp(); | |||
if (!m_LADSPAPathOverride) { | |||
// Get $LADPSA_PATH, if available | |||
char *ladspa_path = getenv("LADSPA_PATH"); | |||
if (ladspa_path) { | |||
ScanPathList(ladspa_path, &LADSPAInfo::ExaminePluginLibrary); | |||
} else { | |||
cerr << "WARNING: LADSPA_PATH environment variable not set" << endl; | |||
cerr << " Assuming /usr/lib/ladspa:/usr/local/lib/ladspa" << endl; | |||
ScanPathList("/usr/lib/ladspa:/usr/local/lib/ladspa", &LADSPAInfo::ExaminePluginLibrary); | |||
} | |||
} | |||
// Check any supplied extra paths | |||
if (m_ExtraPaths) { | |||
ScanPathList(m_ExtraPaths, &LADSPAInfo::ExaminePluginLibrary); | |||
} | |||
// Do we have any plugins now? | |||
if (m_Plugins.size() == 0) { | |||
cerr << "WARNING: No plugins found" << endl; | |||
} else { | |||
cerr << m_Plugins.size() << " plugins found in " << m_Libraries.size() << " libraries" << endl; | |||
#ifdef HAVE_LIBLRDF | |||
// Got some plugins. Now search for RDF data | |||
lrdf_init(); | |||
char *rdf_path = getenv("LADSPA_RDF_PATH"); | |||
if (rdf_path) { | |||
// Examine rdf info | |||
ScanPathList(rdf_path, &LADSPAInfo::ExamineRDFFile); | |||
} else { | |||
cerr << "WARNING: LADSPA_RDF_PATH environment variable not set" << endl; | |||
cerr << " Assuming /usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf" << endl; | |||
// Examine rdf info | |||
ScanPathList("/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf", &LADSPAInfo::ExamineRDFFile); | |||
} | |||
MetadataRDFDescend(LADSPA_BASE "Plugin", 0); | |||
// See which plugins were not added to an rdf group, and add them | |||
// all into the top level 'LADSPA' one | |||
list<unsigned long> rdf_p; | |||
// Get indices of plugins added to groups | |||
for (vector<RDFURIInfo>::iterator ri = m_RDFURIs.begin(); ri != m_RDFURIs.end(); ri++) { | |||
rdf_p.insert(rdf_p.begin(), ri->Plugins.begin(), ri->Plugins.end()); | |||
} | |||
// Add all uncategorized plugins to top level group, subclassed by their | |||
// library's basename. | |||
rdf_p.unique(); | |||
rdf_p.sort(); | |||
unsigned long last_p = 0; | |||
for (list<unsigned long>::iterator p = rdf_p.begin(); p != rdf_p.end(); p++) { | |||
if ((*p - last_p) > 1) { | |||
for (unsigned long i = last_p + 1; i < *p; i++) { | |||
// URI 0 is top-level "LADSPA" group | |||
m_RDFURIs[0].Plugins.push_back(i); | |||
} | |||
} | |||
last_p = *p; | |||
} | |||
while (++last_p < m_Plugins.size()) { | |||
// URI 0 is top-level "LADSPA" group | |||
m_RDFURIs[0].Plugins.push_back(last_p); | |||
} | |||
lrdf_cleanup(); | |||
#else | |||
// No RDF. Add all plugins to top-level group | |||
RDFURIInfo ri; | |||
ri.URI = ""; | |||
ri.Label = "LADSPA"; | |||
m_RDFURIs.push_back(ri); | |||
m_RDFLabelLookup["LADSPA"] = 0; | |||
for (unsigned long i = 0; i < m_Plugins.size(); i++) { | |||
// Add plugin index | |||
m_RDFURIs[0].Plugins.push_back(i); | |||
} | |||
#endif | |||
} | |||
} | |||
void | |||
LADSPAInfo::UnloadAllLibraries(void) | |||
{ | |||
// Blank descriptors | |||
for (vector<PluginInfo>::iterator i = m_Plugins.begin(); | |||
i != m_Plugins.end(); i++) { | |||
if (i->Descriptor) i->Descriptor = NULL; | |||
} | |||
// Unload DLLs, | |||
for (vector<LibraryInfo>::iterator i = m_Libraries.begin(); | |||
i != m_Libraries.end(); i++) { | |||
if (i->Handle) { | |||
dlclose(i->Handle); | |||
i->Handle = NULL; | |||
} | |||
i->RefCount = 0; | |||
} | |||
} | |||
const LADSPA_Descriptor * | |||
LADSPAInfo::GetDescriptorByID(unsigned long unique_id) | |||
{ | |||
if (m_IDLookup.find(unique_id) == m_IDLookup.end()) { | |||
cerr << "LADSPA Plugin ID " << unique_id << " not found!" << endl; | |||
return NULL; | |||
} | |||
// Got plugin index | |||
unsigned long plugin_index = m_IDLookup[unique_id]; | |||
PluginInfo *pi = &(m_Plugins[plugin_index]); | |||
LibraryInfo *li = &(m_Libraries[pi->LibraryIndex]); | |||
if (!(pi->Descriptor)) { | |||
LADSPA_Descriptor_Function desc_func = GetDescriptorFunctionForLibrary(pi->LibraryIndex); | |||
if (desc_func) pi->Descriptor = desc_func(pi->Index); | |||
} | |||
if (pi->Descriptor) { | |||
// Success, so increment ref counter for library | |||
li->RefCount++; | |||
} | |||
return pi->Descriptor; | |||
} | |||
void | |||
LADSPAInfo::DiscardDescriptorByID(unsigned long unique_id) | |||
{ | |||
if (m_IDLookup.find(unique_id) == m_IDLookup.end()) { | |||
cerr << "LADSPA Plugin ID " << unique_id << " not found!" << endl; | |||
} else { | |||
// Get plugin index | |||
unsigned long plugin_index = m_IDLookup[unique_id]; | |||
PluginInfo *pi = &(m_Plugins[plugin_index]); | |||
LibraryInfo *li = &(m_Libraries[pi->LibraryIndex]); | |||
pi->Descriptor = NULL; | |||
// Decrement reference counter for library, and unload if last | |||
if (li->RefCount > 0) { | |||
li->RefCount--; | |||
if (li->RefCount == 0) { | |||
// Unload library | |||
dlclose(li->Handle); | |||
li->Handle = NULL; | |||
} | |||
} | |||
} | |||
} | |||
// **************************************************************************** | |||
// ** SSM Specific Functions ** | |||
// **************************************************************************** | |||
unsigned long | |||
LADSPAInfo::GetIDFromFilenameAndLabel(std::string filename, | |||
std::string label) | |||
{ | |||
bool library_loaded = false; | |||
if (m_FilenameLookup.find(filename) == m_FilenameLookup.end()) { | |||
cerr << "LADSPA Library " << filename << " not found!" << endl; | |||
return 0; | |||
} | |||
unsigned long library_index = m_FilenameLookup[filename]; | |||
if (!(m_Libraries[library_index].Handle)) library_loaded = true; | |||
LADSPA_Descriptor_Function desc_func = GetDescriptorFunctionForLibrary(library_index); | |||
if (!desc_func) { | |||
return 0; | |||
} | |||
// Search for label in library | |||
const LADSPA_Descriptor *desc; | |||
for (unsigned long i = 0; (desc = desc_func(i)) != NULL; i++) { | |||
string l = desc->Label; | |||
if (l == label) { | |||
// If we had to load the library, unload it | |||
unsigned long id = desc->UniqueID; | |||
if (library_loaded) { | |||
dlclose(m_Libraries[library_index].Handle); | |||
m_Libraries[library_index].Handle = NULL; | |||
} | |||
return id; | |||
} | |||
} | |||
cerr << "Plugin " << label << " not found in library " << filename << endl; | |||
return 0; | |||
} | |||
const vector<LADSPAInfo::PluginEntry> | |||
LADSPAInfo::GetMenuList(void) | |||
{ | |||
m_SSMMenuList.clear(); | |||
DescendGroup("", "LADSPA", 1); | |||
return m_SSMMenuList; | |||
} | |||
const vector<LADSPAInfo::PluginInfo> | |||
LADSPAInfo::GetPluginInfo(void) | |||
{ | |||
return m_Plugins; | |||
} | |||
unsigned long | |||
LADSPAInfo::GetPluginListEntryByID(unsigned long unique_id) | |||
{ | |||
unsigned long j = 0; | |||
for (vector<PluginEntry>::iterator i = m_SSMMenuList.begin(); | |||
i != m_SSMMenuList.end(); i++, j++) { | |||
if (i->UniqueID == unique_id) return j; | |||
} | |||
return m_SSMMenuList.size(); | |||
} | |||
// **************************************************************************** | |||
// ** Private Member Functions ** | |||
// **************************************************************************** | |||
// Build a list of plugins by group, suitable for SSM LADSPA Plugin drop-down | |||
// The top-level "LADSPA" group is not included | |||
void | |||
LADSPAInfo::DescendGroup(string prefix, | |||
const string group, | |||
unsigned int depth) | |||
{ | |||
list<string> groups = GetSubGroups(group); | |||
if (prefix.length() > 0) { | |||
// Add an explicit '/' as we're creating sub-menus from groups | |||
prefix += "/"; | |||
} | |||
for (list<string>::iterator g = groups.begin(); g != groups.end(); g++) { | |||
string name; | |||
// Escape '/' and '|' characters | |||
size_t x = g->find_first_of("/|"); | |||
if (x == string::npos) { | |||
name = *g; | |||
} else { | |||
size_t last_x = 0; | |||
while (x < string::npos) { | |||
name += g->substr(last_x, x - last_x) + '\\' + (*g)[x]; | |||
last_x = x + 1; | |||
x = g->find_first_of("/|", x + 1); | |||
} | |||
name += g->substr(last_x, x - last_x); | |||
} | |||
DescendGroup(prefix + name, *g, depth + 1); | |||
} | |||
if (m_RDFLabelLookup.find(group) != m_RDFLabelLookup.end()) { | |||
unsigned long uri_index = m_RDFLabelLookup[group]; | |||
// Create group for unclassified plugins | |||
if (prefix.length() == 0) { | |||
prefix = "Unclassified/"; | |||
depth = depth + 1; | |||
} | |||
// Temporary list (for sorting the plugins by name) | |||
list<PluginEntry> plugins; | |||
for (vector<unsigned long>::iterator p = m_RDFURIs[uri_index].Plugins.begin(); | |||
p != m_RDFURIs[uri_index].Plugins.end(); p++) { | |||
PluginInfo *pi = &(m_Plugins[*p]); | |||
string name; | |||
// Escape '/' and '|' characters | |||
size_t x = pi->Name.find_first_of("/|"); | |||
if (x == string::npos) { | |||
name = pi->Name; | |||
} else { | |||
size_t last_x = 0; | |||
while (x < string::npos) { | |||
name += pi->Name.substr(last_x, x - last_x) + '\\' + pi->Name[x]; | |||
last_x = x + 1; | |||
x = pi->Name.find_first_of("/|", x + 1); | |||
} | |||
name += pi->Name.substr(last_x, x - last_x); | |||
} | |||
PluginEntry pe; | |||
pe.Depth = depth; | |||
pe.UniqueID = pi->UniqueID; | |||
pe.Name = name; | |||
pe.Category = prefix; | |||
pe.Category = pe.Category.substr(0, pe.Category.size()-1); | |||
plugins.push_back(pe); | |||
} | |||
plugins.sort(); | |||
// Deal with duplicates by numbering them | |||
for (list<PluginEntry>::iterator i = plugins.begin(); | |||
i != plugins.end(); ) { | |||
string name = i->Name; | |||
i++; | |||
unsigned long n = 2; | |||
while ((i != plugins.end()) && (i->Name == name)) { | |||
stringstream s; | |||
s << n; | |||
i->Name = name + " (" + s.str() + ")"; | |||
n++; | |||
i++; | |||
} | |||
} | |||
// Add all ordered entries to the Menu List | |||
// This ensures that plugins appear after groups | |||
for (list<PluginEntry>::iterator p = plugins.begin(); p != plugins.end(); p++) { | |||
m_SSMMenuList.push_back(*p); | |||
} | |||
} | |||
} | |||
// Get list of groups that are within given group. The root group is | |||
// always "LADSPA" | |||
list<string> | |||
LADSPAInfo::GetSubGroups(const string group) | |||
{ | |||
list<string> groups; | |||
unsigned long uri_index; | |||
if (m_RDFLabelLookup.find(group) == m_RDFLabelLookup.end()) { | |||
return groups; | |||
} else { | |||
uri_index = m_RDFLabelLookup[group]; | |||
} | |||
for (vector<unsigned long>::iterator sg = m_RDFURIs[uri_index].Children.begin(); | |||
sg != m_RDFURIs[uri_index].Children.end(); sg++) { | |||
groups.push_back(m_RDFURIs[*sg].Label); | |||
} | |||
groups.sort(); | |||
return groups; | |||
} | |||
// Unload any loaded DLLs and clear vectors etc | |||
void | |||
LADSPAInfo::CleanUp(void) | |||
{ | |||
m_MaxInputPortCount = 0; | |||
m_IDLookup.clear(); | |||
m_Plugins.clear(); | |||
// Unload loaded dlls | |||
for (vector<LibraryInfo>::iterator i = m_Libraries.begin(); | |||
i != m_Libraries.end(); i++) { | |||
if (i->Handle) dlclose(i->Handle); | |||
} | |||
m_Libraries.clear(); | |||
m_Paths.clear(); | |||
m_RDFURILookup.clear(); | |||
m_RDFURIs.clear(); | |||
if (m_ExtraPaths) { | |||
free(m_ExtraPaths); | |||
m_ExtraPaths = NULL; | |||
} | |||
} | |||
// Given a colon-separated list of paths, examine the contents of each | |||
// path, examining any regular files using the given member function, | |||
// which currently can be: | |||
// | |||
// ExaminePluginLibrary - add plugin library info from plugins | |||
// ExamineRDFFile - add plugin information from .rdf/.rdfs files | |||
void | |||
LADSPAInfo::ScanPathList(const char *path_list, | |||
void (LADSPAInfo::*ExamineFunc)(const string, | |||
const string)) | |||
{ | |||
const char *start; | |||
const char *end; | |||
int extra; | |||
char *path; | |||
string basename; | |||
DIR *dp; | |||
struct dirent *ep; | |||
struct stat sb; | |||
// This does the same kind of thing as strtok, but strtok won't | |||
// like the const | |||
start = path_list; | |||
while (*start != '\0') { | |||
while (*start == ':') start++; | |||
end = start; | |||
while (*end != ':' && *end != '\0') end++; | |||
if (end - start > 0) { | |||
extra = (*(end - 1) == '/') ? 0 : 1; | |||
path = (char *)malloc(end - start + 1 + extra); | |||
if (path) { | |||
strncpy(path, start, end - start); | |||
if (extra == 1) path[end - start] = '/'; | |||
path[end - start + extra] = '\0'; | |||
dp = opendir(path); | |||
if (!dp) { | |||
cerr << "WARNING: Could not open path " << path << endl; | |||
} else { | |||
while ((ep = readdir(dp))) { | |||
// Stat file to get type | |||
basename = ep->d_name; | |||
if (!stat((path + basename).c_str(), &sb)) { | |||
// We only want regular files | |||
if (S_ISREG(sb.st_mode)) (*this.*ExamineFunc)(path, basename); | |||
} | |||
} | |||
closedir(dp); | |||
} | |||
free(path); | |||
} | |||
} | |||
start = end; | |||
} | |||
} | |||
// Check given file is a valid LADSPA Plugin library | |||
// | |||
// If so, add path, library and plugin info | |||
// to the m_Paths, m_Libraries and m_Plugins vectors. | |||
// | |||
void | |||
LADSPAInfo::ExaminePluginLibrary(const string path, | |||
const string basename) | |||
{ | |||
void *handle; | |||
LADSPA_Descriptor_Function desc_func; | |||
const LADSPA_Descriptor *desc; | |||
string fullpath = path + basename; | |||
// We're not executing any code, so be lazy about resolving symbols | |||
handle = dlopen(fullpath.c_str(), RTLD_LAZY); | |||
if (!handle) { | |||
cerr << "WARNING: File " << fullpath | |||
<< " could not be examined" << endl; | |||
cerr << "dlerror() output:" << endl; | |||
cerr << dlerror() << endl; | |||
} else { | |||
// It's a DLL, so now see if it's a LADSPA plugin library | |||
desc_func = (LADSPA_Descriptor_Function)dlsym(handle, | |||
"ladspa_descriptor"); | |||
if (!desc_func) { | |||
// Is DLL, but not a LADSPA one | |||
cerr << "WARNING: DLL " << fullpath | |||
<< " has no ladspa_descriptor function" << endl; | |||
cerr << "dlerror() output:" << endl; | |||
cerr << dlerror() << endl; | |||
} else { | |||
// Got ladspa_descriptor, so we can now get plugin info | |||
bool library_added = false; | |||
unsigned long i = 0; | |||
desc = desc_func(i); | |||
while (desc) { | |||
// First, check that it's not a dupe | |||
if (m_IDLookup.find(desc->UniqueID) != m_IDLookup.end()) { | |||
unsigned long plugin_index = m_IDLookup[desc->UniqueID]; | |||
unsigned long library_index = m_Plugins[plugin_index].LibraryIndex; | |||
unsigned long path_index = m_Libraries[library_index].PathIndex; | |||
cerr << "WARNING: Duplicated Plugin ID (" | |||
<< desc->UniqueID << ") found:" << endl; | |||
cerr << " Plugin " << m_Plugins[plugin_index].Index | |||
<< " in library: " << m_Paths[path_index] | |||
<< m_Libraries[library_index].Basename | |||
<< " [First instance found]" << endl; | |||
cerr << " Plugin " << i << " in library: " << fullpath | |||
<< " [Duplicate not added]" << endl; | |||
} else { | |||
if (CheckPlugin(desc)) { | |||
// Add path if not already added | |||
unsigned long path_index; | |||
vector<string>::iterator p = find(m_Paths.begin(), m_Paths.end(), path); | |||
if (p == m_Paths.end()) { | |||
path_index = m_Paths.size(); | |||
m_Paths.push_back(path); | |||
} else { | |||
path_index = p - m_Paths.begin(); | |||
} | |||
// Add library info if not already added | |||
if (!library_added) { | |||
LibraryInfo li; | |||
li.PathIndex = path_index; | |||
li.Basename = basename; | |||
li.RefCount = 0; | |||
li.Handle = NULL; | |||
m_Libraries.push_back(li); | |||
library_added = true; | |||
} | |||
// Add plugin info | |||
PluginInfo pi; | |||
pi.LibraryIndex = m_Libraries.size() - 1; | |||
pi.Index = i; | |||
pi.UniqueID = desc->UniqueID; | |||
pi.Label = desc->Label; | |||
pi.Name = desc->Name; | |||
pi.Descriptor = NULL; | |||
pi.Maker = desc->Maker; | |||
pi.AudioInputs = 0; | |||
pi.AudioOutputs = 0; | |||
// Find number of input ports | |||
unsigned long in_port_count = 0; | |||
for (unsigned long p = 0; p < desc->PortCount; p++) { | |||
if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[p])) { | |||
in_port_count++; | |||
if ( LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[p] ) ) | |||
pi.AudioInputs++; | |||
} | |||
} | |||
for (unsigned long p = 0; p < desc->PortCount; p++) { | |||
if (LADSPA_IS_PORT_OUTPUT(desc->PortDescriptors[p])) { | |||
if ( LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[p] ) ) | |||
pi.AudioOutputs++; | |||
} | |||
} | |||
if (in_port_count > m_MaxInputPortCount) { | |||
m_MaxInputPortCount = in_port_count; | |||
} | |||
m_Plugins.push_back(pi); | |||
// Add to index | |||
m_IDLookup[desc->UniqueID] = m_Plugins.size() - 1; | |||
} else { | |||
cerr << "WARNING: Plugin " << desc->UniqueID << " not added" << endl; | |||
} | |||
} | |||
desc = desc_func(++i); | |||
} | |||
} | |||
dlclose(handle); | |||
} | |||
} | |||
#ifdef HAVE_LIBLRDF | |||
// Examine given RDF plugin meta-data file | |||
void | |||
LADSPAInfo::ExamineRDFFile(const std::string path, | |||
const std::string basename) | |||
{ | |||
string fileuri = "file://" + path + basename; | |||
if (lrdf_read_file(fileuri.c_str())) { | |||
cerr << "WARNING: File " << path + basename << " could not be parsed [Ignored]" << endl; | |||
} | |||
} | |||
// Recursively add rdf information for plugins that have been | |||
// found from scanning LADSPA_PATH | |||
void | |||
LADSPAInfo::MetadataRDFDescend(const char * uri, | |||
unsigned long parent) | |||
{ | |||
unsigned long this_uri_index; | |||
// Check URI not already added | |||
if (m_RDFURILookup.find(uri) == m_RDFURILookup.end()) { | |||
// Not found | |||
RDFURIInfo ri; | |||
ri.URI = uri; | |||
if (ri.URI == LADSPA_BASE "Plugin") { | |||
// Add top level group as "LADSPA" | |||
// This will always happen, even if there are no .rdf files read by liblrdf | |||
// or if there is no liblrdf support | |||
ri.Label = "LADSPA"; | |||
} else { | |||
char * label = lrdf_get_label(uri); | |||
if (label) { | |||
ri.Label = label; | |||
} else { | |||
ri.Label = "(No label)"; | |||
} | |||
} | |||
// Add any instances found | |||
lrdf_uris * instances = lrdf_get_instances(uri); | |||
if (instances) { | |||
for (unsigned long j = 0; j < instances->count; j++) { | |||
unsigned long uid = lrdf_get_uid(instances->items[j]); | |||
if (m_IDLookup.find(uid) != m_IDLookup.end()) { | |||
ri.Plugins.push_back(m_IDLookup[uid]); | |||
} | |||
} | |||
} | |||
lrdf_free_uris(instances); | |||
m_RDFURIs.push_back(ri); | |||
this_uri_index = m_RDFURIs.size() - 1; | |||
m_RDFURILookup[ri.URI] = this_uri_index; | |||
m_RDFLabelLookup[ri.Label] = this_uri_index; | |||
} else { | |||
// Already added | |||
this_uri_index = m_RDFURILookup[uri]; | |||
} | |||
// Only add parent - child info if this uri is NOT the first (root) uri | |||
if (this_uri_index > 0) { | |||
m_RDFURIs[this_uri_index].Parents.push_back(parent); | |||
m_RDFURIs[parent].Children.push_back(this_uri_index); | |||
} | |||
lrdf_uris * uris = lrdf_get_subclasses(uri); | |||
if (uris) { | |||
for (unsigned long i = 0; i < uris->count; i++) { | |||
MetadataRDFDescend(uris->items[i], this_uri_index); | |||
} | |||
} | |||
lrdf_free_uris(uris); | |||
} | |||
#endif | |||
bool | |||
LADSPAInfo::CheckPlugin(const LADSPA_Descriptor *desc) | |||
{ | |||
#define test(t, m) { \ | |||
if (!(t)) { \ | |||
cerr << m << endl; \ | |||
return false; \ | |||
} \ | |||
} | |||
test(desc->instantiate, "WARNING: Plugin has no instatiate function"); | |||
test(desc->connect_port, "WARNING: Warning: Plugin has no connect_port funciton"); | |||
test(desc->run, "WARNING: Plugin has no run function"); | |||
test(!(desc->run_adding != 0 && desc->set_run_adding_gain == 0), | |||
"WARNING: Plugin has run_adding but no set_run_adding_gain"); | |||
test(!(desc->run_adding == 0 && desc->set_run_adding_gain != 0), | |||
"WARNING: Plugin has set_run_adding_gain but no run_adding"); | |||
test(desc->cleanup, "WARNING: Plugin has no cleanup function"); | |||
test(!LADSPA_IS_INPLACE_BROKEN(desc->Properties), | |||
"WARNING: Plugin cannot use in place processing"); | |||
test(desc->PortCount, "WARNING: Plugin has no ports"); | |||
test(desc->Name, "WARNING: Plugin has no name" ); | |||
if ( strcmp( desc->Maker, "Tom Szilagyi" ) ) | |||
{ | |||
/* The author of the TAP plugins has a very narrow | |||
* interpretation of the HARD RT hint which differs from | |||
* most everyone else, so we are left in the unfortunate | |||
* position of having to ignore the hint for TAP plugins | |||
* and consider them all RT safe */ | |||
test(LADSPA_IS_HARD_RT_CAPABLE( desc->Properties ), "WARNING: Plugin is not RT capable" ); | |||
} | |||
return true; | |||
} | |||
LADSPA_Descriptor_Function | |||
LADSPAInfo::GetDescriptorFunctionForLibrary(unsigned long library_index) | |||
{ | |||
LibraryInfo *li = &(m_Libraries[library_index]); | |||
if (!(li->Handle)) { | |||
// Need full path | |||
string fullpath = m_Paths[li->PathIndex]; | |||
fullpath.append(li->Basename); | |||
// Immediate symbol resolution, as plugin code is likely to be executed | |||
li->Handle = dlopen(fullpath.c_str(), RTLD_NOW); | |||
if (!(li->Handle)) { | |||
// Plugin library changed since last path scan | |||
cerr << "WARNING: Plugin library " << fullpath << " cannot be loaded" << endl; | |||
cerr << "Rescan of plugins recommended" << endl; | |||
cerr << "dlerror() output:" << endl; | |||
cerr << dlerror() << endl; | |||
return NULL; | |||
} | |||
} | |||
// Got handle so now verify that it's a LADSPA plugin library | |||
const LADSPA_Descriptor_Function desc_func = (LADSPA_Descriptor_Function)dlsym(li->Handle, | |||
"ladspa_descriptor"); | |||
if (!desc_func) { | |||
// Is DLL, but not a LADSPA one (changed since last path scan?) | |||
cerr << "WARNING: DLL " << m_Paths[li->PathIndex] << li->Basename | |||
<< " has no ladspa_descriptor function" << endl; | |||
cerr << "Rescan of plugins recommended" << endl; | |||
cerr << "dlerror() output:" << endl; | |||
cerr << dlerror() << endl; | |||
// Unload library | |||
dlclose(li->Handle); | |||
return NULL; | |||
} | |||
return desc_func; | |||
} |
@@ -1,208 +0,0 @@ | |||
// | |||
// LADSPAInfo.h - Header file for LADSPA Plugin info class | |||
// | |||
// Copyleft (C) 2002 Mike Rawes <myk@waxfrenzy.org> | |||
// | |||
// This program is free software; you can redistribute it and/or modify | |||
// it under the terms of the GNU General Public License as published by | |||
// the Free Software Foundation; either version 2 of the License, or | |||
// (at your option) any later version. | |||
// | |||
// This program is distributed in the hope that it will be useful, | |||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
// GNU General Public License for more details. | |||
// | |||
// You should have received a copy of the GNU General Public License | |||
// along with this program; if not, write to the Free Software | |||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
// | |||
#ifndef __ladspa_info_h__ | |||
#define __ladspa_info_h__ | |||
// #include <config.h> | |||
#include <string> | |||
#include <vector> | |||
#include <list> | |||
#include <map> | |||
#include <ladspa.h> | |||
class LADSPAInfo | |||
{ | |||
public: | |||
// If override is false, examine $LADSPA_PATH | |||
// Also examine supplied path list | |||
// For all paths, add basic plugin information for later lookup, | |||
// instantiation and so on. | |||
LADSPAInfo(bool override = false, const char *path_list = ""); | |||
// Unload all loaded plugins and clean up | |||
~LADSPAInfo(); | |||
// ************************************************************************ | |||
// Loading/Unloading plugin libraries | |||
// | |||
// At first, no library dlls are loaded. | |||
// | |||
// A plugin library may have more than one plugin descriptor. The | |||
// descriptor is used to instantiate, activate, execute plugin instances. | |||
// Administration of plugin instances are outwith the scope of this class, | |||
// instead, descriptors are requested using GetDecriptorByID, and disposed | |||
// of using DiscardDescriptorByID. | |||
// | |||
// Each library keeps a reference count of descriptors requested. A library | |||
// is loaded when a descriptor is requested for the first time, and remains | |||
// loaded until the number of discards matches the number of requests. | |||
// Rescan all paths in $LADSPA_PATH, as per constructor. | |||
// This will also unload all libraries, and make any descriptors that | |||
// have not been discarded with DiscardDescriptorByID invalid. | |||
void RescanPlugins(void); | |||
// Unload all dlopened libraries. This will make any descriptors that | |||
// have not been discarded with DiscardDescriptorByID invalid. | |||
void UnloadAllLibraries(void); | |||
// Get descriptor of plugin with given ID. This increments the descriptor | |||
// count for the corresponding library. | |||
const LADSPA_Descriptor *GetDescriptorByID(unsigned long unique_id); | |||
// Notify that a descriptor corresponding to the given ID has been | |||
// discarded. This decrements the descriptor count for the corresponding | |||
// library. | |||
void DiscardDescriptorByID(unsigned long unique_id); | |||
// ************************************************************************ | |||
// SSM Specific options | |||
// Get unique ID of plugin identified by given library filename and label. | |||
// This is for backwards compatibility with older versions of SSM where the | |||
// path and label of the plugin was stored in the configuration - current | |||
// versions store the Unique ID | |||
unsigned long GetIDFromFilenameAndLabel(std::string filename, | |||
std::string label); | |||
// Struct for plugin information returned by queries | |||
struct PluginEntry | |||
{ | |||
unsigned int Depth; | |||
unsigned long UniqueID; | |||
std::string Name; | |||
std::string Category; | |||
bool operator<(const PluginEntry& pe) | |||
{ | |||
return (Name<pe.Name); | |||
} | |||
}; | |||
// For cached plugin information | |||
struct PluginInfo | |||
{ | |||
unsigned long LibraryIndex; // Index of library in m_Libraries | |||
unsigned long Index; // Plugin index in library | |||
unsigned long UniqueID; // Unique ID | |||
std::string Label; // Plugin label | |||
std::string Name; // Plugin Name | |||
std::string Maker; | |||
unsigned int AudioInputs; | |||
unsigned int AudioOutputs; | |||
const LADSPA_Descriptor *Descriptor; // Descriptor, NULL | |||
}; | |||
// Get ordered list of plugin names and IDs for plugin menu | |||
const std::vector<PluginEntry> GetMenuList(void); | |||
const std::vector<PluginInfo> GetPluginInfo(void); | |||
// Get the index in the above list for given Unique ID | |||
// If not found, this returns the size of the above list | |||
unsigned long GetPluginListEntryByID(unsigned long unique_id); | |||
// Get the number of input ports for the plugin with the most | |||
// input ports | |||
unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; } | |||
private: | |||
// See LADSPAInfo.C for comments on these functions | |||
void DescendGroup(std::string prefix, | |||
const std::string group, | |||
unsigned int depth); | |||
std::list<std::string> GetSubGroups(const std::string group); | |||
void CleanUp(void); | |||
void ScanPathList(const char *path_list, | |||
void (LADSPAInfo::*ExamineFunc)(const std::string, | |||
const std::string)); | |||
void ExaminePluginLibrary(const std::string path, | |||
const std::string basename); | |||
bool CheckPlugin(const LADSPA_Descriptor *desc); | |||
LADSPA_Descriptor_Function GetDescriptorFunctionForLibrary(unsigned long library_index); | |||
#ifdef HAVE_LIBLRDF | |||
void ExamineRDFFile(const std::string path, | |||
const std::string basename); | |||
void MetadataRDFDescend(const char *uri, | |||
unsigned long parent); | |||
#endif | |||
// For cached library information | |||
struct LibraryInfo | |||
{ | |||
unsigned long PathIndex; // Index of path in m_Paths | |||
std::string Basename; // Filename | |||
unsigned long RefCount; // Count of descriptors requested | |||
void *Handle; // DLL Handle, NULL | |||
}; | |||
// For cached RDF uri information | |||
struct RDFURIInfo | |||
{ | |||
std::string URI; // Full URI for use with lrdf | |||
std::string Label; // Label | |||
std::vector<unsigned long> Parents; // Index of parents in m_RDFURIs | |||
std::vector<unsigned long> Children; // Indices of children in m_RDFURIs | |||
std::vector<unsigned long> Plugins; // Indices of plugins in m_Plugins | |||
}; | |||
// Lookup maps | |||
typedef std::map<unsigned long, | |||
unsigned long, | |||
std::less<unsigned long> > IDMap; | |||
typedef std::map<std::string, | |||
unsigned long, | |||
std::less<std::string> > StringMap; | |||
bool m_LADSPAPathOverride; | |||
char *m_ExtraPaths; | |||
// LADSPA Plugin information database | |||
std::vector<std::string> m_Paths; | |||
std::vector<LibraryInfo> m_Libraries; | |||
std::vector<PluginInfo> m_Plugins; | |||
// Plugin lookup maps | |||
IDMap m_IDLookup; | |||
// RDF URI database | |||
std::vector<RDFURIInfo> m_RDFURIs; | |||
// RDF URI lookup map | |||
StringMap m_RDFURILookup; | |||
// RDF Label lookup map | |||
StringMap m_RDFLabelLookup; | |||
// SSM specific data | |||
std::vector<PluginEntry> m_SSMMenuList; | |||
StringMap m_FilenameLookup; | |||
unsigned long m_MaxInputPortCount; | |||
}; | |||
#endif // __ladspa_info_h__ |
@@ -1,101 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* Base class for all meters */ | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Valuator.H> | |||
#include "FL/test_press.H" | |||
class Meter : public Fl_Valuator | |||
{ | |||
float _peak; | |||
float _value; | |||
protected: | |||
virtual void draw ( void ) = 0; | |||
virtual int handle ( int m ) | |||
{ | |||
if ( m == FL_ENTER || m == FL_LEAVE ) | |||
return 1; | |||
else if ( m == FL_PUSH && test_press( FL_BUTTON1 )) | |||
{ | |||
reset(); | |||
return 1; | |||
} | |||
return Fl_Valuator::handle( m ); | |||
} | |||
float | |||
deflection ( float db ) | |||
{ | |||
float def = 0.0f; | |||
if ( db < -70.0f ) | |||
def = 0.0f; | |||
else if ( db < -60.0f ) | |||
def = ( db + 70.0f ) * 0.25f; | |||
else if ( db < -50.0f ) | |||
def = ( db + 60.0f ) * 0.5f + 2.5f; | |||
else if ( db < -40.0f ) | |||
def = ( db + 50.0f ) * 0.75f + 7.5f; | |||
else if ( db < -30.0f ) | |||
def = ( db + 40.0f ) * 1.5f + 15.0f; | |||
else if ( db < -20.0f ) | |||
def = ( db + 30.0f ) * 2.0f + 30.0f; | |||
else if ( db < 6.0f ) | |||
def = ( db + 20.0f ) * 2.5f + 50.0f; | |||
else | |||
def = 115.0f; | |||
return def / 115.0f; | |||
} | |||
public: | |||
Meter ( int X, int Y, int W, int H, const char *L = 0 ) : | |||
Fl_Valuator( X, Y, W, H, L ) | |||
{ | |||
_peak = _value = -80.0f; | |||
} | |||
virtual ~Meter ( ) { } | |||
virtual void value ( float v ) | |||
{ | |||
if ( visible_r() ) | |||
damage( FL_DAMAGE_USER1 ); | |||
_value = v; | |||
if ( _value > _peak ) | |||
_peak = _value; | |||
} | |||
virtual float value ( void ) const { return _value; } | |||
float peak ( void ) const { return _peak; } | |||
void reset ( void ) { _peak = -80.0f; redraw(); } | |||
}; |
@@ -1,267 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2010 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "Meter_Indicator_Module.H" | |||
#include <stdio.h> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Value_Slider.H> | |||
#include <FL/Fl_Box.H> | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl_Counter.H> | |||
#include <FL/Fl_Light_Button.H> | |||
#include "FL/Fl_Dial.H" | |||
#include "FL/Fl_Labelpad_Group.H" | |||
#include "FL/Fl_Scalepack.H" | |||
#include "Chain.H" | |||
#include "DPM.H" | |||
#include "FL/test_press.H" | |||
Meter_Indicator_Module::Meter_Indicator_Module ( bool is_default ) | |||
: Module ( is_default, 50, 100, name() ) | |||
{ | |||
box( FL_FLAT_BOX ); | |||
color( FL_BLACK ); | |||
_disable_context_menu = false; | |||
_pad = true; | |||
control_value = 0; | |||
add_port( Port( this, Port::INPUT, Port::CONTROL ) ); | |||
control_input[0].hints.visible = false; | |||
dpm_pack = new Fl_Scalepack( x(), y(), w(), h() ); | |||
dpm_pack->color( FL_BACKGROUND_COLOR ); | |||
dpm_pack->box( FL_FLAT_BOX ); | |||
dpm_pack->type( FL_HORIZONTAL ); | |||
end(); | |||
control_value = new float[1]; | |||
*control_value = -70.0f; | |||
align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) ); | |||
clear_visible_focus(); | |||
} | |||
Meter_Indicator_Module::~Meter_Indicator_Module ( ) | |||
{ | |||
if ( control_value ) | |||
{ | |||
delete[] control_value; | |||
control_value = NULL; | |||
} | |||
log_destroy(); | |||
} | |||
void | |||
Meter_Indicator_Module::get ( Log_Entry &e ) const | |||
{ | |||
Port *p = control_input[0].connected_port(); | |||
Module *m = p->module(); | |||
e.add( ":module", m ); | |||
e.add( ":port", m->control_output_port_index( p ) ); | |||
Module::get( e ); | |||
} | |||
void | |||
Meter_Indicator_Module::set ( Log_Entry &e ) | |||
{ | |||
Module::set( e ); | |||
int port = -1; | |||
Module *module = NULL; | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":port" ) ) | |||
{ | |||
port = atoi( v ); | |||
} | |||
else if ( ! strcmp( s, ":module" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Module *t = (Module*)Loggable::find( i ); | |||
assert( t ); | |||
module = t; | |||
} | |||
} | |||
if ( port >= 0 && module ) | |||
control_input[0].connect_to( &module->control_output[port] ); | |||
} | |||
void | |||
Meter_Indicator_Module::update ( void ) | |||
{ | |||
if ( control_input[0].connected() ) | |||
{ | |||
// A little hack to detect that the connected module's number | |||
// of control outs has changed. | |||
Port *p = control_input[0].connected_port(); | |||
if ( dpm_pack->children() != p->hints.dimensions ) | |||
{ | |||
/* engine->lock(); */ | |||
dpm_pack->clear(); | |||
control_value = new float[p->hints.dimensions]; | |||
for ( int i = p->hints.dimensions; i--; ) | |||
{ | |||
DPM *dpm = new DPM( x(), y(), w(), h() ); | |||
dpm->type( FL_VERTICAL ); | |||
dpm_pack->add( dpm ); | |||
control_value[i] = -70.0f; | |||
dpm->value( -70.0f ); | |||
} | |||
/* engine->unlock(); */ | |||
} | |||
else | |||
{ | |||
for ( int i = 0; i < dpm_pack->children(); ++i ) | |||
{ | |||
((DPM*)dpm_pack->child( i ))->value( control_value[i] ); | |||
control_value[i] = -70.0f; | |||
} | |||
} | |||
} | |||
} | |||
void | |||
Meter_Indicator_Module::connect_to ( Port *p ) | |||
{ | |||
control_input[0].connect_to( p ); | |||
/* DPM *o = new DPM( 10, 10, 10, 10 ); */ | |||
/* o->type( FL_VERTICAL ); */ | |||
/* dpm_pack->add( o ); */ | |||
redraw(); | |||
} | |||
int | |||
Meter_Indicator_Module::handle ( int m ) | |||
{ | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( Fl::event_button3() && _disable_context_menu ) | |||
return 0; | |||
if ( test_press( FL_BUTTON1 ) ) | |||
{ | |||
/* don't let Module::handle eat our click */ | |||
return Fl_Group::handle( m ); | |||
} | |||
} | |||
} | |||
return Module::handle( m ); | |||
} | |||
void | |||
Meter_Indicator_Module::handle_control_changed ( Port *p ) | |||
{ | |||
THREAD_ASSERT( UI ); | |||
/* The engine is already locked by the UI thread at this point in | |||
the call-graph, so we can be sure that process() won't be | |||
executed concurrently. */ | |||
if ( p->connected() ) | |||
{ | |||
p = p->connected_port(); | |||
if ( dpm_pack->children() != p->hints.dimensions ) | |||
{ | |||
dpm_pack->clear(); | |||
control_value = new float[p->hints.dimensions]; | |||
for ( int i = p->hints.dimensions; i--; ) | |||
{ | |||
DPM *dpm = new DPM( x(), y(), w(), h() ); | |||
dpm->type( FL_VERTICAL ); | |||
align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) ); | |||
dpm_pack->add( dpm ); | |||
dpm_pack->redraw(); | |||
control_value[i] = -70.0f; | |||
dpm->value( -70.0f ); | |||
} | |||
redraw(); | |||
} | |||
} | |||
} | |||
/**********/ | |||
/* Engine */ | |||
/**********/ | |||
void | |||
Meter_Indicator_Module::process ( nframes_t ) | |||
{ | |||
if ( control_input[0].connected() ) | |||
{ | |||
Port *p = control_input[0].connected_port(); | |||
for ( int i = 0; i < p->hints.dimensions; ++i ) | |||
{ | |||
float dB = ((float*)control_input[0].buffer())[i]; | |||
if ( dB > control_value[i]) | |||
control_value[i] = dB; | |||
} | |||
} | |||
} |
@@ -1,83 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "Module.H" | |||
#include <vector> | |||
#include "JACK/Port.H" | |||
class Fl_Valuator; | |||
class Fl_Scalepack; | |||
class Meter_Indicator_Module : public Module | |||
{ | |||
Fl_Scalepack *dpm_pack; | |||
bool _pad; | |||
volatile float *control_value; | |||
bool _disable_context_menu; | |||
public: | |||
virtual void update ( void ); | |||
void disable_context_menu ( bool b ) { _disable_context_menu = b; } | |||
void handle_control_changed ( Port *p ); | |||
Meter_Indicator_Module ( bool is_default = false ); | |||
virtual ~Meter_Indicator_Module ( ); | |||
bool allows_external_control ( void ) const { return false; } | |||
const char *name ( void ) const { return "Meter Indicator"; } | |||
int can_support_inputs ( int ) { return 0; } | |||
bool configure_inputs ( int ) { return false; } | |||
void pad ( bool v ) { _pad = v; } | |||
static void cb_handle ( Fl_Widget *w, void *v ); | |||
void cb_handle ( Fl_Widget *w ); | |||
void connect_to ( Port *p ); | |||
LOG_CREATE_FUNC( Meter_Indicator_Module ); | |||
void process ( nframes_t ); | |||
protected: | |||
void get ( Log_Entry &e ) const; | |||
void set ( Log_Entry &e ); | |||
virtual void draw ( void ) | |||
{ | |||
// draw_box(); | |||
Fl_Group::draw(); | |||
} | |||
virtual int handle ( int m ); | |||
private: | |||
}; |
@@ -1,185 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#include "const.h" | |||
#include <math.h> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Single_Window.H> | |||
#include "FL/Fl_Scalepack.H" | |||
#include "FL/test_press.H" | |||
#include "Meter_Module.H" | |||
#include "DPM.H" | |||
#include "JACK/Port.H" | |||
#include "dsp.h" | |||
Meter_Module::Meter_Module ( ) | |||
: Module ( 50, 100, name() ) | |||
{ | |||
box( FL_NO_BOX ); | |||
dpm_pack = new Fl_Scalepack( x(), y(), w(), h() ); | |||
dpm_pack->type( FL_HORIZONTAL ); | |||
control_value = 0; | |||
color( FL_BLACK ); | |||
end(); | |||
Port p( this, Port::OUTPUT, Port::CONTROL, "dB level" ); | |||
p.hints.type = Port::Hints::LOGARITHMIC; | |||
p.hints.ranged = true; | |||
p.hints.maximum = 6.0f; | |||
p.hints.minimum = -70.0f; | |||
p.hints.dimensions = 1; | |||
p.connect_to( new float[1] ); | |||
p.control_value_no_callback( -70.0f ); | |||
add_port( p ); | |||
log_create(); | |||
} | |||
Meter_Module::~Meter_Module ( ) | |||
{ | |||
if ( control_value ) | |||
delete[] control_value; | |||
log_destroy(); | |||
} | |||
void | |||
Meter_Module::update ( void ) | |||
{ | |||
for ( int i = dpm_pack->children(); i--; ) | |||
{ | |||
((DPM*)dpm_pack->child( i ))->value( control_value[i] ); | |||
control_value[i] = -70.0f; | |||
} | |||
} | |||
bool | |||
Meter_Module::configure_inputs ( int n ) | |||
{ | |||
THREAD_ASSERT( UI ); | |||
int on = audio_input.size(); | |||
if ( n > on ) | |||
{ | |||
for ( int i = on; i < n; ++i ) | |||
{ | |||
DPM *dpm = new DPM( 0, 0, w(), h() ); | |||
dpm->type( FL_VERTICAL ); | |||
align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) ); | |||
dpm_pack->add( dpm ); | |||
add_port( Port( this, Port::INPUT, Port::AUDIO ) ); | |||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) ); | |||
} | |||
} | |||
else | |||
{ | |||
for ( int i = on; i > n; --i ) | |||
{ | |||
DPM *dpm = (DPM*)dpm_pack->child( dpm_pack->children() - 1 ); | |||
dpm_pack->remove( dpm ); | |||
delete dpm; | |||
audio_input.back().disconnect(); | |||
audio_input.pop_back(); | |||
audio_output.back().disconnect(); | |||
audio_output.pop_back(); | |||
} | |||
} | |||
control_output[0].hints.dimensions = n; | |||
delete[] (float*)control_output[0].buffer(); | |||
{ | |||
float *f = new float[n]; | |||
for ( int i = n; i--; ) | |||
f[i] = -70.0f; | |||
control_output[0].connect_to( f ); | |||
} | |||
if ( control_value ) | |||
delete [] control_value; | |||
control_value = new float[n]; | |||
for ( int i = n; i--; ) | |||
control_value[i] = -70.0f; | |||
if ( control_output[0].connected() ) | |||
control_output[0].connected_port()->module()->handle_control_changed( control_output[0].connected_port() ); | |||
return true; | |||
} | |||
int | |||
Meter_Module::handle ( int m ) | |||
{ | |||
switch ( m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
int r = 0; | |||
if ( test_press( FL_BUTTON1 ) ) | |||
{ | |||
/* don't let Module::handle eat our click */ | |||
r = Fl_Group::handle( m ); | |||
} | |||
return Module::handle( m ) || r; | |||
} | |||
} | |||
return Module::handle( m ); | |||
} | |||
/**********/ | |||
/* Engine */ | |||
/**********/ | |||
void | |||
Meter_Module::process ( nframes_t nframes ) | |||
{ | |||
for ( unsigned int i = 0; i < audio_input.size(); ++i ) | |||
{ | |||
// float dB = 20 * log10( get_peak_sample( (float*)audio_input[i].buffer(), nframes ) / 2.0f ); | |||
float dB = 20 * log10( buffer_get_peak( (sample_t*) audio_input[i].buffer(), nframes ) ); | |||
((float*)control_output[0].buffer())[i] = dB; | |||
if (dB > control_value[i]) | |||
control_value[i] = dB; | |||
} | |||
} |
@@ -1,51 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "Module.H" | |||
class Fl_Scalepack; | |||
class Meter_Module : public Module | |||
{ | |||
Fl_Scalepack *dpm_pack; | |||
volatile float *control_value; | |||
public: | |||
Meter_Module ( ); | |||
virtual ~Meter_Module ( ); | |||
const char *name ( void ) const { return "Meter"; } | |||
int can_support_inputs ( int n ) { return n > 0 ? n : -1; } | |||
bool configure_inputs ( int n ); | |||
LOG_CREATE_FUNC( Meter_Module ); | |||
virtual void update ( void ); | |||
protected: | |||
virtual int handle ( int m ); | |||
virtual void process ( nframes_t nframes ); | |||
virtual void draw ( void ) { draw_box(x(),y(),w(),h()); } | |||
}; |
@@ -1,176 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Group.H> | |||
#include <FL/Fl_Scroll.H> | |||
#include <FL/Fl_Pack.H> | |||
#include "Mixer_Strip.H" | |||
#include "Thread.H" | |||
class Fl_Blink_Button; | |||
class Fl_Flowpack; | |||
class Fl_Menu_Bar; | |||
class Spatialization_Console; | |||
namespace OSC { class Endpoint; } | |||
#include <lo/lo.h> | |||
class Group; | |||
class Mixer : public Fl_Group | |||
{ | |||
public: | |||
OSC::Endpoint *osc_endpoint; | |||
Fl_Button *sm_blinker; | |||
private: | |||
float _update_interval; | |||
static void show_tooltip ( const char *s ); | |||
static void hide_tooltip ( void ); | |||
int _rows; | |||
int _strip_height; | |||
Fl_Color system_colors[3]; | |||
Mixer_Strip* track_by_name ( const char *name ); | |||
void snapshot ( void ); | |||
static void snapshot ( void *v ) { ((Mixer*)v)->snapshot(); } | |||
void cb_menu(Fl_Widget*); | |||
static void cb_menu(Fl_Widget*, void*); | |||
Fl_Menu_Bar *menubar; | |||
Fl_Scroll *scroll; | |||
Fl_Pack *pack; | |||
Fl_Box *project_name; | |||
Fl_Box *_status; | |||
Fl_Flowpack *mixer_strips; | |||
void load_options ( void ); | |||
void save_options ( void ); | |||
void save_translations ( void ); | |||
void load_translations ( void ); | |||
static void send_feedback_cb ( void *v ); | |||
void send_feedback ( void ); | |||
void redraw_windows ( void ); | |||
static void handle_dirty ( int, void *v ); | |||
static int osc_non_hello ( const char *, const char *, lo_arg **, int , lo_message msg, void * ); | |||
static int osc_strip_by_number ( const char *, const char *, lo_arg **, int , lo_message msg, void * ); | |||
static void update_cb ( void * ); | |||
void update_cb ( void ); | |||
public: | |||
void auto_connect ( void ); | |||
void maybe_auto_connect_output ( Module::Port *p ); | |||
std::list<std::string> get_auto_connect_targets ( void ); | |||
Group * group_by_name ( const char * name ); | |||
char *get_unique_group_name ( const char *name ); | |||
std::list <Group*> groups; | |||
Group *group ( int n ); | |||
void add_group ( Group *g ); | |||
void remove_group ( Group *g ); | |||
void update_menu ( void ); | |||
static Spatialization_Console *spatialization_console; | |||
int nstrips ( void ) const; | |||
Mixer_Strip* track_by_number ( int n ); | |||
void update_frequency ( float f ); | |||
void status ( const char *s ) { | |||
if ( s ) _status->copy_label( s ); | |||
else _status->label(0); | |||
_status->redraw(); } | |||
virtual int handle ( int m ); | |||
char * get_unique_track_name ( const char *name ); | |||
int min_h ( void ) const { return Mixer_Strip::min_h() + (18 * 2); } | |||
void rows ( int n ); | |||
virtual void resize ( int X, int Y, int W, int H ); | |||
void new_strip ( void ); | |||
void add ( Mixer_Strip *ms ); | |||
void remove ( Mixer_Strip *ms ); | |||
void move_left ( Mixer_Strip *ms ); | |||
void move_right ( Mixer_Strip *ms ); | |||
void insert ( Mixer_Strip *ms, Mixer_Strip *before ); | |||
void insert ( Mixer_Strip *ms, int i ); | |||
bool contains ( Mixer_Strip *ms ); | |||
Mixer_Strip * event_inside ( void ); | |||
int find_strip ( const Mixer_Strip *m ) const; | |||
bool save ( void ); | |||
void quit ( void ); | |||
Mixer ( int X, int Y, int W, int H, const char *L ); | |||
virtual ~Mixer(); | |||
void handle_hello ( lo_message msg ); | |||
void announce ( const char *nash_url, const char *process_name ); | |||
int init_osc ( const char* osc_port ); | |||
void sm_active ( bool b ); | |||
void say_hello ( void ); | |||
void save_default_project_settings ( void ); | |||
void load_default_project_settings ( void ); | |||
void reset_project_settings ( void ); | |||
void save_project_settings ( void ); | |||
void load_project_settings ( void ); | |||
public: | |||
void command_toggle_fader_view ( void ); | |||
void command_clear_mappings ( void ); | |||
void command_new ( void ); | |||
bool command_save ( void ); | |||
bool command_load ( const char *path, const char *display_name = 0 ); | |||
bool command_new ( const char *path, const char *display_name = 0 ); | |||
void command_quit ( void ); | |||
void command_add_strip ( void ); | |||
}; | |||
extern Mixer* mixer; |
@@ -1,188 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2010 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl.H> | |||
#include "DPM.H" | |||
#include "Panner.H" | |||
#include <FL/Fl_Scalepack.H> | |||
#include <FL/Fl_Pack.H> | |||
#include <FL/Fl_Flip_Button.H> | |||
#include <FL/Fl_Dial.H> | |||
#include <FL/Fl_Group.H> | |||
#include <FL/Fl_Box.H> | |||
#include <FL/Fl_Button.H> | |||
#include <FL/Fl_Value_Slider.H> | |||
#include <FL/Fl_Counter.H> | |||
#include <FL/Fl_Progress.H> | |||
#include <JACK/Port.H> | |||
#include "../FL/Fl_Sometimes_Input.H" | |||
#include "Loggable.H" | |||
class Chain; | |||
class Fl_Flowpack; | |||
class Controller_Module; | |||
class Meter_Indicator_Module; | |||
class Module; | |||
class Fl_Flip_Button; | |||
class Fl_Input; | |||
class Fl_Menu_; | |||
class Fl_Menu_Button; | |||
class Fl_Choice; | |||
class Group; | |||
#include "Module.H" | |||
class Mixer_Strip : public Fl_Group, public Loggable { | |||
public: | |||
static int min_h ( void ) { return 333; } | |||
Mixer_Strip( const char *strip_name ); | |||
Mixer_Strip(); /* for log create */ | |||
virtual ~Mixer_Strip(); | |||
void chain ( Chain *c ); | |||
Chain *chain ( void ) { return _chain; } | |||
virtual void log_children ( void ) const; | |||
virtual void color ( Fl_Color c ); | |||
virtual Fl_Color color ( void ) const; | |||
LOG_CREATE_FUNC( Mixer_Strip ); | |||
static void configure_outputs ( Fl_Widget *o, void *v ); | |||
void configure_outputs ( void ); | |||
bool configure_ports ( int n ); | |||
void handle_module_added ( Module *m ); | |||
void handle_module_removed ( Module *m ); | |||
void update ( void ); | |||
void name ( const char *name ); | |||
const char *name ( void ) const { return label(); } | |||
private: | |||
char *_auto_input; | |||
void auto_input ( const char *s ); | |||
unsigned int _dsp_load_index; | |||
/* used to defer setting the mode of the gain controller until the | |||
chain has been added and the controller connected to a default | |||
module */ | |||
int _gain_controller_mode; | |||
int _mute_controller_mode; | |||
bool _manual_connection; | |||
Fl_Menu_Button *output_connection_button; | |||
Fl_Flip_Button *width_button; | |||
Fl_Flip_Button *tab_button; | |||
Fl_Button *close_button; | |||
Fl_Input *name_field; | |||
Fl_Choice *group_choice; | |||
Fl_Flowpack *controls_pack; | |||
Fl_Group *tab_group; | |||
Fl_Group *signal_tab; | |||
Fl_Group *fader_tab; | |||
Fl_Pack *panner_pack; | |||
Chain *_chain; | |||
Group *_group; | |||
Fl_Box *spatialization_label; | |||
Controller_Module *gain_controller; | |||
Controller_Module *mute_controller; | |||
Controller_Module *jack_input_controller; | |||
Controller_Module *spatialization_controller; | |||
Meter_Indicator_Module *meter_indicator; | |||
Fl_Progress *dsp_load_progress; | |||
Fl_Box *color_box; | |||
nframes_t nframes; | |||
Fl_Color _color; | |||
void init ( ); | |||
void cb_handle(Fl_Widget*); | |||
static void cb_handle(Fl_Widget*, void*); | |||
void set_tab ( void ); | |||
void update_port_names ( void ); | |||
void menu_cb ( const Fl_Menu_ *m ); | |||
static void menu_cb ( Fl_Widget *w, void *v ); | |||
Fl_Menu_Button & menu ( void ) const; | |||
static void snapshot ( void *v ); | |||
void snapshot ( void ); | |||
bool export_strip ( const char *filename ); | |||
void set_spatializer_visibility ( void ); | |||
protected: | |||
void get ( Log_Entry &e ) const; | |||
void set ( Log_Entry &e ); | |||
virtual int handle ( int m ); | |||
virtual void draw ( void ); | |||
public: | |||
void manual_connection ( bool b ); | |||
bool has_group_affinity ( void ) const; | |||
void auto_connect_outputs ( void ); | |||
bool maybe_auto_connect_output ( Module::Port *p ); | |||
void get_output_ports ( std::list<std::string> &ports ); | |||
void update_group_choice ( void ); | |||
Controller_Module *spatializer ( void ); | |||
Group *group ( void ) { return _group;} | |||
// int group ( void ) const; | |||
void group ( Group * ); | |||
void send_feedback ( void ); | |||
int number ( void ) const; | |||
static bool import_strip ( const char *filename ); | |||
void command_toggle_fader_view ( void ); | |||
void command_move_left ( void ); | |||
void command_move_right ( void ); | |||
void command_close ( void ); | |||
void command_rename ( const char * s ); | |||
void command_width ( bool b ); | |||
void command_view ( bool b ); | |||
}; |
@@ -1,578 +0,0 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2009 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Group.H> | |||
#include <stdlib.h> | |||
#include "debug.h" | |||
#include <vector> | |||
#include "Thread.H" | |||
#include "Loggable.H" | |||
#include "JACK/Port.H" | |||
#include "OSC/Endpoint.H" | |||
#include <list> | |||
#include <algorithm> | |||
class Chain; | |||
class Module_Parameter_Editor; | |||
class Fl_Menu_; | |||
class Fl_Menu_Button; | |||
class Fl_Button; | |||
class Mixer_Strip; | |||
class Module : public Fl_Group, public Loggable { | |||
int _ins; | |||
int _outs; | |||
int _instances; | |||
nframes_t _nframes; | |||
Chain *_chain; | |||
bool _is_default; | |||
static nframes_t _sample_rate; | |||
static Module *_copied_module_empty; | |||
static char *_copied_module_settings; | |||
void init ( void ); | |||
void insert_menu_cb ( const Fl_Menu_ *m ); | |||
static void insert_menu_cb ( Fl_Widget *w, void *v ); | |||
void menu_cb ( const Fl_Menu_ *m ); | |||
static void menu_cb ( Fl_Widget *w, void *v ); | |||
Fl_Menu_Button & menu ( void ) const; | |||
bool copy ( void ) const; | |||
void paste_before ( void ); | |||
protected: | |||
Module_Parameter_Editor *_editor; | |||
volatile bool _bypass; | |||
public: | |||
virtual nframes_t get_module_latency ( void ) const { return 0; } | |||
virtual void get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const; | |||
virtual void set_latency ( JACK::Port::direction_e dir, nframes_t min, nframes_t max ); | |||
/* true if this module was added by default and not under normal user control */ | |||
bool is_default ( void ) const { return _is_default; } | |||
void is_default ( bool v ) { _is_default = v; } | |||
virtual void update ( void ) {} | |||
virtual void update_tooltip ( void ); | |||
class Port | |||
{ | |||
/* support multiple connection for audio ports (many to one, one to many, many to many). | |||
control ports only support one to one and one to many. */ | |||
/* char *type_names[] = { "Audio", "Control" }; */ | |||
/* char *direction_names[] = { "Input", "Output" }; */ | |||
void update_connected_port_buffer ( void ) | |||
{ | |||
if ( connected() ) | |||
connected_port()->_buf = _buf; | |||
} | |||
public: | |||
enum Direction { INPUT, OUTPUT }; | |||
enum Type { AUDIO, CONTROL, AUX_AUDIO }; | |||
/* hints for control ports (specifically control inputs) */ | |||
struct Hints | |||
{ | |||
enum Type { LINEAR, LOGARITHMIC, BOOLEAN, INTEGER }; | |||
Type type; | |||
bool ranged; | |||
float minimum; | |||
float maximum; | |||
float default_value; | |||
int dimensions; | |||
bool visible; | |||
Hints ( ) | |||
{ | |||
type = LINEAR; | |||
ranged = false; | |||
minimum = 0; | |||
maximum = 1; /* FIXME: totally bogus, but some | |||
* plugins (SWH delays) don't | |||
* provide an upper bound. */ | |||
default_value = 0.0f; | |||
dimensions = 1; | |||
visible = true; | |||
} | |||
}; | |||
static int osc_control_change_exact ( float v, void *user_data ); | |||
static int osc_control_change_cv ( float v, void *user_data ); | |||
Hints hints; | |||
Port ( Module *module, Direction direction, Type type, const char *name = 0 ) | |||
{ | |||
_name = name; | |||
_direction = direction; | |||
_type = type; | |||
_buf = 0; | |||
_nframes = 0; | |||
_module = module; | |||
_scaled_signal = 0; | |||
_unscaled_signal = 0; | |||
_by_number_path = 0; | |||
_by_number_number = -1; | |||
_jack_port = 0; | |||
} | |||
Port ( const Port& p ) | |||
{ | |||
_name = p._name; | |||
_direction = p._direction; | |||
_type = p._type; | |||
_buf = p._buf; | |||
_nframes = p._nframes; | |||
_module = p._module; | |||
hints = p.hints; | |||
_scaled_signal = p._scaled_signal; | |||
_unscaled_signal = p._unscaled_signal; | |||
_by_number_path = 0; | |||
_by_number_number = -1; | |||
_jack_port = p._jack_port; | |||
} | |||
virtual ~Port ( ) | |||
{ | |||
if ( _by_number_path ) | |||
free( _by_number_path ); | |||
_by_number_path = NULL; | |||
} | |||
const char *name ( void ) const { return _name; } | |||
Type type ( void ) const { return _type; } | |||
Direction direction ( void ) const { return _direction; } | |||
Module * module ( void ) const { return _module; } | |||
nframes_t nframes ( void ) const { return _nframes; } | |||
void buffer ( void *buf, nframes_t nframes ) { _buf = buf; _nframes = nframes; }; | |||
void *buffer ( void ) const { return _buf; } | |||
OSC::Signal *scaled_signal ( void ) { return _scaled_signal; } | |||
int _by_number_number; | |||
char *_by_number_path; | |||
const char *osc_path ( ) | |||
{ | |||
if ( _scaled_signal ) | |||
return _scaled_signal->path(); | |||
else | |||
return NULL; | |||
} | |||
const char *osc_number_path ( void ); | |||
void update_osc_port ( ) | |||
{ | |||
// if ( INPUT == _direction ) | |||
change_osc_path( generate_osc_path() ); | |||
} | |||
void destroy_osc_port ( ) | |||
{ | |||
delete _unscaled_signal; | |||
delete _scaled_signal; | |||
_unscaled_signal = _scaled_signal = NULL; | |||
} | |||
void control_value_no_callback ( float f ) | |||
{ | |||
/* can also be called from the OSC thread */ | |||
ASSERT( Thread::is( "UI" ) || Thread::is( "OSC" ), | |||
"Function called from wrong thread! (is %s)", Thread::current()->name() ); | |||
if ( buffer() ) | |||
{ | |||
*((float*)buffer()) = f; | |||
} | |||
} | |||
void control_value ( float f ) | |||
{ | |||
control_value_no_callback( f ); | |||
_module->handle_control_changed( this ); | |||
if ( connected() ) | |||
connected_port()->_module->handle_control_changed( connected_port() ); | |||
} | |||
float control_value ( void ) const | |||
{ | |||
if ( buffer() ) | |||
return *((float*)buffer()); | |||
else | |||
return 0.0f; | |||
} | |||
bool connected ( void ) const { | |||
if ( _type == Port::AUDIO ) | |||
/* internal audio ports are considered connected by the buffer setting */ | |||
return _buf != 0; | |||
else | |||
/* control and external audio ports belong to a graph */ | |||
return _connected.size() > 0; | |||
} | |||
bool connected_osc ( void ) const; | |||
Port *connected_port ( void ) const | |||
{ | |||
ASSERT( _type == Port::CONTROL, "Operation only available for control ports" ); | |||
return _connected.size() == 0 ? NULL : _connected.front(); | |||
} | |||
void connect_to ( Port *to ) | |||
{ | |||
if ( _type != Port::AUX_AUDIO ) | |||
{ | |||
_buf = to->_buf; | |||
} | |||
if ( jack_port() && to->jack_port() ) | |||
jack_port()->connect( to->jack_port()->jack_name() ); | |||
if ( std::find(_connected.begin(),_connected.end(),to) == _connected.end() ) | |||
{ | |||
_connected.push_back(to); | |||
to->_connected.push_back(this); | |||
} | |||
} | |||
/* disconnect this port from any ports of modules belonging to strip /o/ */ | |||
void disconnect_from_strip ( Mixer_Strip *o ); | |||
void connect_to ( void *buf ) | |||
{ | |||
ASSERT( _type == Port::CONTROL, "Operation only available for control ports" ); | |||
_buf = buf; | |||
update_connected_port_buffer(); | |||
} | |||
void set_buffer ( void *buf ) | |||
{ | |||
ASSERT( _type != Port::CONTROL, "Operation only available for audio ports" ); | |||
_buf = buf; | |||
} | |||
void send_feedback ( void ); | |||
bool connected_to ( Port *p ) | |||
{ | |||
return std::find( _connected.begin(), _connected.end(), p ) != _connected.end(); | |||
} | |||
/* disconnect from specified port */ | |||
void disconnect ( Port *p ) | |||
{ | |||
if ( ! connected_to(p) ) | |||
return; | |||
if ( _type == Port::CONTROL && p->_module ) | |||
p->_module->handle_control_disconnect( this ); | |||
if ( jack_port() && p->jack_port() ) | |||
jack_port()->disconnect( p->jack_port()->jack_name() ); | |||
_connected.remove(p); | |||
p->_connected.remove(this); | |||
} | |||
/* disconnect from *all* connected ports */ | |||
void disconnect ( void ) | |||
{ | |||
if ( _connected.size() ) | |||
{ | |||
for ( std::list<Port*>::iterator i = _connected.begin(); i != _connected.end(); i++ ) | |||
{ | |||
Port *p = *i; | |||
/* iterator about to be invalidated... */ | |||
i = _connected.erase(i); | |||
disconnect(p); | |||
} | |||
} | |||
} | |||
void jack_port ( JACK::Port *v ) { _jack_port = v; } | |||
JACK::Port *jack_port ( void ) const { return _jack_port; } | |||
private: | |||
char *generate_osc_path ( void ); | |||
void change_osc_path ( char *path ); | |||
std::list <Port*> _connected; | |||
Type _type; | |||
Direction _direction; | |||
const char *_name; | |||
void *_buf; | |||
nframes_t _nframes; | |||
Module *_module; | |||
/* used for auxilliary I/Os */ | |||
JACK::Port *_jack_port; | |||
OSC::Signal *_scaled_signal; | |||
OSC::Signal *_unscaled_signal; | |||
static void handle_signal_connection_state_changed ( OSC::Signal *, void *o ); | |||
}; | |||
void bbox ( int &X, int &Y, int &W, int &H ) | |||
{ | |||
X += + 5; | |||
Y += 5; | |||
W -= 10; | |||
H -= 10; | |||
} | |||
Module ( int W, int H, const char *L = 0 ); | |||
Module ( ); | |||
Module ( bool is_default, int W, int H, const char *L = 0 ); | |||
virtual ~Module ( ); | |||
LOG_NAME_FUNC( Module ); | |||
nframes_t nframes ( void ) const { return _nframes; } | |||
virtual void resize_buffers ( nframes_t v ) { _nframes = v; } | |||
int instances ( void ) const { return _instances; } | |||
void instances ( int i ) { _instances = i; } | |||
bool is_being_controlled ( void ) const | |||
{ | |||
for ( nframes_t i = control_input.size(); i--; ) | |||
if ( control_input[i].connected() ) | |||
return true; | |||
return false; | |||
} | |||
bool is_controlling ( void ) const | |||
{ | |||
for ( nframes_t i = control_output.size(); i--; ) | |||
if ( control_output[i].connected() ) | |||
return true; | |||
return false; | |||
} | |||
/* bool */ | |||
/* is_being_controlled_osc ( void ) const */ | |||
/* { */ | |||
/* for ( nframes_t i = control_input.size(); i--; ) */ | |||
/* if ( control_input[i].connected_osc() ) */ | |||
/* return true; */ | |||
/* return false; */ | |||
/* } */ | |||
virtual const char *name ( void ) const = 0; | |||
virtual const char *basename ( void ) const { return "Module"; } | |||
std::vector<Port> audio_input; | |||
std::vector<Port> audio_output; | |||
std::vector<Port> control_input; | |||
std::vector<Port> control_output; | |||
std::vector<Port> aux_audio_input; | |||
std::vector<Port> aux_audio_output; | |||
void add_port ( const Port &p ) | |||
{ | |||
if ( p.type() == Port::AUDIO && p.direction() == Port::INPUT ) | |||
audio_input.push_back( p ); | |||
else if ( p.type() == Port::AUDIO && p.direction() == Port::OUTPUT ) | |||
audio_output.push_back( p ); | |||
else if ( p.type() == Port::CONTROL && p.direction() == Port::INPUT ) | |||
control_input.push_back( p ); | |||
else if ( p.type() == Port::CONTROL && p.direction() == Port::OUTPUT ) | |||
control_output.push_back( p ); | |||
} | |||
int noutputs ( void ) const | |||
{ | |||
return audio_output.size(); | |||
} | |||
int ninputs ( void ) const | |||
{ | |||
return audio_input.size(); | |||
} | |||
int ncontrol_inputs ( void ) const | |||
{ | |||
return control_input.size(); | |||
} | |||
int ncontrol_outputs ( void ) const | |||
{ | |||
return control_output.size(); | |||
} | |||
int nvisible_control_inputs ( void ) const | |||
{ | |||
int n = 0; | |||
for ( std::vector<Port>::const_iterator i = control_input.begin(); | |||
i != control_input.end(); | |||
i++ ) | |||
if ( i->hints.visible ) | |||
n++; | |||
return n; | |||
} | |||
virtual bool bypass ( void ) const { return _bypass; } | |||
virtual void bypass ( bool v ) { _bypass = v; } | |||
virtual bool bypassable ( void ) const | |||
{ | |||
return ninputs() == noutputs() || | |||
( ninputs() == 1 && noutputs() == 2 ); | |||
} | |||
int control_input_port_index ( Port *p ) | |||
{ | |||
for ( nframes_t i = control_input.size(); i--; ) | |||
if ( &control_input[i] == p ) | |||
return i; | |||
return -1; | |||
} | |||
int control_output_port_index ( Port *p ) | |||
{ | |||
for ( nframes_t i = control_output.size(); i--; ) | |||
if ( &control_output[i] == p ) | |||
return i; | |||
return -1; | |||
} | |||
Chain *chain ( void ) const { return _chain; } | |||
void chain ( Chain * v ); | |||
char *get_parameters ( void ) const; | |||
void set_parameters ( const char * ); | |||
bool show_analysis_window ( void ); | |||
void send_feedback ( void ); | |||
virtual bool initialize ( void ) { return true; } | |||
/* for the given number of inputs, return how many outputs this | |||
* plugin would have. -1 if this plugin can't support so many | |||
* inputs. */ | |||
virtual int can_support_inputs ( int n ) = 0; | |||
/* called by the chain whenever we need to adjust our input | |||
* channel configuration, but only if can_support_inputs() returns | |||
* true */ | |||
virtual bool configure_inputs ( int n ) = 0; | |||
virtual void process ( nframes_t ) = 0; | |||
/* called whenever the module is initialized or when the sample rate is changed at runtime */ | |||
virtual void handle_sample_rate_change ( nframes_t sample_rate ) {} | |||
/* called whenever the value of a control port is changed. | |||
This can be used to take appropriate action from the GUI thread */ | |||
virtual void handle_control_changed ( Port * ); | |||
virtual void handle_control_disconnect ( Port * ) {} | |||
/* called whenever the name of the chain changes (usually because | |||
* the name of the mixer strip changed). */ | |||
virtual void handle_chain_name_changed (); | |||
virtual void handle_port_connection_change () {} | |||
/* module should create a new context, run against this impulse, | |||
* and return true if there's anything worth reporting */ | |||
virtual bool get_impulse_response ( sample_t *buf, nframes_t nframes ) | |||
{ | |||
return false; | |||
} | |||
#define MODULE_CLONE_FUNC(class) \ | |||
virtual Module *clone_empty ( void ) const \ | |||
{ \ | |||
return new class (); \ | |||
} | |||
virtual Module *clone_empty ( void ) const { return NULL; } | |||
Module *clone ( Chain *dest ) const; | |||
Module *clone ( void ) const; | |||
protected: | |||
void draw_connections ( void ); | |||
void draw_label ( int X, int Y, int W, int H ); | |||
void draw_box ( int X, int Y, int W, int H ); | |||
virtual void draw ( void ) { Module::draw_box(x(),y(),w(),h()); Module::draw_label(x(),y(),w(),h()); } | |||
virtual int handle ( int m ); | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
bool add_aux_port ( bool input, const char *prefix, int n , JACK::Port::type_e type ); | |||
public: | |||
nframes_t sample_rate ( void ) const { return Module::_sample_rate; } | |||
void auto_connect_outputs(); | |||
void auto_disconnect_outputs(); | |||
void freeze_ports ( void ); | |||
void thaw_ports ( void ); | |||
bool add_aux_audio_output ( const char *prefix, int n ); | |||
bool add_aux_audio_input ( const char *prefix, int n ); | |||
bool add_aux_cv_input ( const char *prefix, int n ); | |||
static void set_sample_rate ( nframes_t srate ) { _sample_rate = srate; } | |||
void command_open_parameter_editor(); | |||
virtual void command_activate ( void ); | |||
virtual void command_deactivate ( void ); | |||
virtual void command_remove ( void ); | |||
}; |