LazStats: Complete refactoring of FreqUnit.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7691 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-09-23 22:34:12 +00:00
parent 6f16f11ccc
commit e3cd2dea44
9 changed files with 900 additions and 688 deletions

View File

@ -113,7 +113,7 @@ implementation
uses
Math,
MoveAvgUnit, AutoPlotUnit, PolynomialUnit, ExpSmoothUnit, FFTUnit;
MathUnit, MoveAvgUnit, AutoPlotUnit, PolynomialUnit, ExpSmoothUnit, FFTUnit;
{ TAutoCorrFrm }

View File

@ -1,45 +1,45 @@
object FreqFrm: TFreqFrm
Left = 490
Height = 543
Height = 376
Top = 228
Width = 889
Width = 835
HelpType = htKeyword
HelpKeyword = 'html/FrequencyAnalysis.htm'
Caption = 'Frequency Distribution'
ClientHeight = 543
ClientWidth = 889
ClientHeight = 376
ClientWidth = 835
OnActivate = FormActivate
OnCreate = FormCreate
Position = poMainFormCenter
LCLVersion = '2.1.0.0'
object ParamsPanel: TPanel
Left = 8
Height = 527
Height = 360
Top = 8
Width = 288
Width = 264
Align = alLeft
BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Right = 4
BorderSpacing.Bottom = 8
BevelOuter = bvNone
ClientHeight = 527
ClientWidth = 288
ClientHeight = 360
ClientWidth = 264
TabOrder = 0
object Panel1: TPanel
AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PlotOptionsGroup
AnchorSideBottom.Control = NormPltChk
Left = 0
Height = 217
Height = 163
Top = 0
Width = 288
Anchors = [akTop, akLeft, akRight]
Width = 264
Anchors = [akTop, akLeft, akRight, akBottom]
BevelOuter = bvNone
ClientHeight = 217
ClientWidth = 288
ClientHeight = 163
ClientWidth = 264
TabOrder = 0
object Label1: TLabel
AnchorSideLeft.Control = Panel1
@ -54,7 +54,7 @@ object FreqFrm: TFreqFrm
object Label2: TLabel
AnchorSideLeft.Control = SelList
AnchorSideTop.Control = Panel1
Left = 175
Left = 159
Height = 15
Top = 0
Width = 104
@ -69,12 +69,12 @@ object FreqFrm: TFreqFrm
AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 200
Height = 146
Top = 17
Width = 113
Width = 105
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 2
BorderSpacing.Right = 8
BorderSpacing.Right = 4
ItemHeight = 0
MultiSelect = True
OnDblClick = VarListDblClick
@ -90,12 +90,12 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom
Left = 175
Height = 200
Left = 159
Height = 146
Top = 17
Width = 113
Width = 105
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 8
BorderSpacing.Left = 4
BorderSpacing.Top = 2
ItemHeight = 0
OnSelectionChange = SelListSelectionChange
@ -104,7 +104,7 @@ object FreqFrm: TFreqFrm
object InBtn: TBitBtn
AnchorSideLeft.Control = Panel1
AnchorSideLeft.Side = asrCenter
Left = 131
Left = 119
Height = 26
Top = 23
Width = 26
@ -117,7 +117,7 @@ object FreqFrm: TFreqFrm
object OutBtn: TBitBtn
AnchorSideLeft.Control = Panel1
AnchorSideLeft.Side = asrCenter
Left = 131
Left = 119
Height = 26
Top = 56
Width = 26
@ -132,7 +132,7 @@ object FreqFrm: TFreqFrm
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = OutBtn
AnchorSideTop.Side = asrBottom
Left = 121
Left = 109
Height = 25
Top = 106
Width = 46
@ -143,62 +143,20 @@ object FreqFrm: TFreqFrm
TabOrder = 3
end
end
object PlotOptionsGroup: TRadioGroup
AnchorSideLeft.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = BarTypeGroup
Left = 0
Height = 127
Top = 273
Width = 277
Anchors = [akLeft, akBottom]
AutoFill = True
AutoSize = True
BorderSpacing.Top = 8
BorderSpacing.Right = 8
Caption = 'Plot Options'
ChildSizing.LeftRightSpacing = 12
ChildSizing.TopBottomSpacing = 6
ChildSizing.HorizontalSpacing = 12
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 107
ClientWidth = 273
Columns = 2
ItemIndex = 0
Items.Strings = (
'2D Vertical Bars'
'3D Vertical Bars'
'2D Pie Chart'
'Exploded Pie Chart'
'2D Line Chart'
'3D Line Chart'
'Plot 2D Points'
'Plot 3D Points'
'2D Horizontal Bars'
'3D Horizontal Bars'
)
OnSelectionChanged = PlotOptionsGroupSelectionChanged
TabOrder = 1
end
object NormPltChk: TCheckBox
AnchorSideLeft.Control = ParamsPanel
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Side = asrBottom
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Bevel1
Left = 0
AnchorSideBottom.Control = BinSelectionGroup
Left = 58
Height = 19
Top = 467
Top = 171
Width = 149
Anchors = [akLeft, akBottom]
BorderSpacing.Top = 8
Caption = 'Plot Normal Distribution'
TabOrder = 2
TabOrder = 1
end
object Bevel1: TBevel
AnchorSideLeft.Control = ParamsPanel
@ -207,8 +165,8 @@ object FreqFrm: TFreqFrm
AnchorSideBottom.Control = CloseBtn
Left = 0
Height = 8
Top = 486
Width = 288
Top = 319
Width = 264
Anchors = [akLeft, akRight, akBottom]
Shape = bsBottomLine
end
@ -217,15 +175,15 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Control = ComputeBtn
AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom
Left = 87
Left = 63
Height = 25
Top = 502
Top = 335
Width = 54
Anchors = [akRight, akBottom]
AutoSize = True
Caption = 'Reset'
OnClick = ResetBtnClick
TabOrder = 3
TabOrder = 2
end
object CloseBtn: TButton
AnchorSideLeft.Side = asrBottom
@ -234,9 +192,9 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom
Left = 233
Left = 209
Height = 25
Top = 502
Top = 335
Width = 55
Anchors = [akRight, akBottom]
AutoSize = True
@ -245,15 +203,15 @@ object FreqFrm: TFreqFrm
Caption = 'Close'
ModalResult = 1
OnClick = CloseBtnClick
TabOrder = 4
TabOrder = 3
end
object ComputeBtn: TButton
AnchorSideRight.Control = CloseBtn
AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom
Left = 149
Left = 125
Height = 25
Top = 502
Top = 335
Width = 76
Anchors = [akRight, akBottom]
AutoSize = True
@ -262,67 +220,141 @@ object FreqFrm: TFreqFrm
BorderSpacing.Right = 8
Caption = 'Compute'
OnClick = ComputeBtnClick
TabOrder = 5
TabOrder = 4
end
object BarTypeGroup: TRadioGroup
object PlotOptionsGroup: TGroupBox
AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Control = BinSelectionGroup
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = NormPltChk
AnchorSideBottom.Control = Bevel1
Left = 0
Height = 51
Top = 408
Width = 182
Anchors = [akLeft, akBottom]
AutoFill = True
Height = 52
Top = 267
Width = 255
Anchors = [akLeft, akRight, akBottom]
AutoSize = True
BorderSpacing.Top = 8
Caption = 'Bar Type'
ChildSizing.LeftRightSpacing = 12
ChildSizing.TopBottomSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 31
ClientWidth = 178
Columns = 2
Enabled = False
ItemIndex = 0
Items.Strings = (
'Separated'
'Contiguous'
)
TabOrder = 6
Caption = 'Plot Options'
ClientHeight = 32
ClientWidth = 251
TabOrder = 5
object VertBarsBtn: TSpeedButton
AnchorSideLeft.Control = PlotOptionsGroup
AnchorSideTop.Control = PlotOptionsGroup
Left = 12
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 12
BorderSpacing.Top = 4
BorderSpacing.Bottom = 6
Down = True
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 8
end
object Panel2: TPanel
object HorBarsBtn: TSpeedButton
AnchorSideLeft.Control = VertBarsBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 39
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 9
end
object LinePlotBtn: TSpeedButton
AnchorSideLeft.Control = HorBarsBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 66
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 10
end
object AreaPlotBtn: TSpeedButton
AnchorSideLeft.Control = LinePlotBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 93
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 11
end
object ThreeDChk: TCheckBox
AnchorSideLeft.Control = AreaPlotBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = VertBarsBtn
AnchorSideTop.Side = asrCenter
Left = 148
Height = 19
Top = 6
Width = 34
BorderSpacing.Left = 32
BorderSpacing.Right = 8
Caption = '3D'
TabOrder = 0
end
end
object BinSelectionGroup: TGroupBox
AnchorSideLeft.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PlotOptionsGroup
Left = 0
Height = 23
Top = 236
Width = 288
Anchors = [akTop, akLeft, akRight]
Height = 57
Top = 202
Width = 255
Anchors = [akLeft, akBottom]
AutoSize = True
BorderSpacing.Top = 12
BorderSpacing.Bottom = 8
Caption = 'Bin Selection'
ClientHeight = 37
ClientWidth = 251
TabOrder = 6
object Panel2: TPanel
AnchorSideLeft.Control = BinSelectionGroup
AnchorSideTop.Control = BinSelectionGroup
AnchorSideRight.Side = asrBottom
Left = 12
Height = 23
Top = 2
Width = 239
AutoSize = True
BorderSpacing.Left = 12
BorderSpacing.Top = 2
BorderSpacing.Bottom = 12
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 288
TabOrder = 7
ClientWidth = 239
TabOrder = 0
object NoIntervalsEdit: TSpinEdit
AnchorSideLeft.Control = NoIntervalsLabel
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel2
Left = 121
Left = 165
Height = 23
Top = 0
Width = 74
Width = 66
Alignment = taRightJustify
BorderSpacing.Left = 16
BorderSpacing.Right = 8
MinValue = 1
TabOrder = 0
Value = 10
@ -334,24 +366,25 @@ object FreqFrm: TFreqFrm
Left = 0
Height = 15
Top = 4
Width = 105
Caption = 'Number of intervals'
Width = 149
Caption = 'Approximate No of intervals'
ParentColor = False
end
end
end
end
object ParamsSplitter: TSplitter
Left = 300
Height = 543
Left = 276
Height = 376
Top = 0
Width = 5
ResizeStyle = rsPattern
end
object PageControl: TPageControl
Left = 309
Height = 527
Left = 285
Height = 360
Top = 8
Width = 572
Width = 542
ActivePage = ReportPage
Align = alClient
BorderSpacing.Left = 4

View File

@ -9,7 +9,7 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, ExtCtrls, ComCtrls, Spin,
Globals, MainUnit, FunctionsLib, GraphLib, DataProcs, ReportFrameUnit, ChartFrameUnit;
Globals, MainUnit, GraphLib, DataProcs, ReportFrameUnit, ChartFrameUnit;
type
@ -17,7 +17,10 @@ type
TFreqFrm = class(TForm)
Bevel1: TBevel;
BinSelectionGroup: TGroupBox;
ThreeDChk: TCheckBox;
ComputeBtn: TButton;
PlotOptionsGroup: TGroupBox;
NoIntervalsLabel: TLabel;
PageControl: TPageControl;
Panel1: TPanel;
@ -32,11 +35,13 @@ type
Label1: TLabel;
Label2: TLabel;
SelList: TListBox;
PlotOptionsGroup: TRadioGroup;
BarTypeGroup: TRadioGroup;
ParamsSplitter: TSplitter;
ReportPage: TTabSheet;
NoIntervalsEdit: TSpinEdit;
HorBarsBtn: TSpeedButton;
LinePlotBtn: TSpeedButton;
AreaPlotBtn: TSpeedButton;
VertBarsBtn: TSpeedButton;
VarList: TListBox;
procedure AllBtnClick(Sender: TObject);
procedure CloseBtnClick(Sender: TObject);
@ -45,7 +50,6 @@ type
procedure FormCreate(Sender: TObject);
procedure InBtnClick(Sender: TObject);
procedure OutBtnClick(Sender: TObject);
procedure PlotOptionsGroupSelectionChanged(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
procedure SelListSelectionChange(Sender: TObject; User: boolean);
procedure VarListDblClick(Sender: TObject);
@ -54,11 +58,15 @@ type
{ private declarations }
FReportFrame: TReportFrame;
FAutoSized: Boolean;
procedure CalcIntervals(var AMin, AMax, AIntervalSize: Double;
out ANumIntervals: Integer);
procedure ClearTabs;
function CreateChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
function CreateOrGetChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
function GetPageCaption(AVarName: String): String;
procedure PlotFreq(AColIndex: Integer; AVarName: String; const xLabels: StrDyneVec;
procedure PlotFreq(AChartFrame: TChartFrame; AColIndex: Integer;
AVarName: String; const xLabels: StrDyneVec;
const Freq: DblDyneVec);
procedure PlotNormalDist(AChartFrame: TChartFrame; Freq: DblDyneVec);
procedure UpdateBtnStates;
public
{ public declarations }
@ -74,8 +82,8 @@ implementation
{$R *.lfm}
uses
Math, TAChartUtils, TALegend, TASeries,
Utils, FreqSpecsUnit;
Math, TAChartUtils, TALegend, TASources, TACustomSeries, TASeries,
Utils, MathUnit, FreqSpecsUnit;
{ TFreqFrm }
@ -92,6 +100,22 @@ begin
end;
procedure TFreqFrm.CalcIntervals(var AMin, AMax, AIntervalsize: Double;
out ANumIntervals: Integer);
var
intervalSize: Double;
m: Double;
e: Integer;
begin
intervalSize := round((AMax - AMin) / NoIntervalsEdit.Value);
MantisseAndExponent(intervalSize, m, e);
m := round(m);
AIntervalSize := m * IntPower(10, e);
AMin := floor(AMin / AIntervalSize) * AIntervalSize;
AMax := ceil(AMax / AIntervalSize) * AIntervalSize;
ANumIntervals := round((AMax - AMin) / AIntervalSize);
end;
procedure TFreqFrm.ClearTabs;
var
i: Integer;
@ -118,22 +142,20 @@ var
cumfreq: DblDyneVec = nil;
XLabels: StrDyneVec = nil;
XValue: DblDyneVec = nil;
normDistValue: DblDyneVec = nil;
value: double;
NoVars: integer;
plottype: integer;
cellval: string;
mask: String;
col: integer;
min, max, range: double;
incrsize: double;
nointervals: double;
min, max: double;
incrSize: double = 1;
nInts: integer;
NormDist: boolean;
Sumx, Sumx2, Mean, Variance, StdDev, zlow, zhi: double;
X, zproplow, zprophi, zfreq: double;
nCases: integer;
oldPageIndex: Integer;
found: Boolean;
lReport: TStrings;
chartFrame: TChartFrame;
begin
if SelList.Count = 0 then
begin
@ -141,8 +163,6 @@ begin
exit;
end;
NormDist := NormPltChk.Checked;
SetLength(freq, NoCases);
SetLength(pcnt, NoCases);
SetLength(cumpcnt, NoCases);
@ -150,23 +170,16 @@ begin
SetLength(cumfreq, NoCases);
SetLength(XValue, NoCases);
(* ---------------> causes flicker
// Remove already existing chart pages
oldPageIndex := PageControl.PageIndex;
for i := PageControl.PageCount-1 downto 1 do
PageControl.Pages[i].Free;
*)
lReport := TStringList.Create;
try
lReport.Add('FREQUENCY ANALYSIS BY BILL MILLER');
lReport.Add('');
{ Analyze each variable }
// Iterate through all variables
NoVars := SelList.Items.Count;
for i := 1 to NoVars do
begin
{ get column no. of variable }
// Get column index of variable
col := 1;
cellval := SelList.Items[i-1];
for j := 1 to NoVariables do
@ -180,7 +193,7 @@ begin
end;
end;
{ get min and max values for variable in col }
// Get min and max values for variable in col
min := Infinity;
max := -Infinity;
for j := 1 to NoCases do
@ -190,39 +203,14 @@ begin
if value > max then max := value;
if value < min then min := value;
end;
(*
range := max - min + 1.0;
incrsize := 1.0;
{ if too many increments, set increment size for 15 increments }
if range > 200.0 then incrsize := range / 15;
nointervals := range / incrsize;
nints := round(nointervals);
{ Get user's approval and / or changes }
FreqSpecsFrm.VarName.Text := cellval;
FreqSpecsFrm.Minimum.Text := FloatToStr(min);
FreqSpecsFrm.Maximum.Text := FloatToStr(max);
FreqSpecsFrm.range.Text := FloatToStr(range);
FreqSpecsFrm.IntSize.Text := FloatToStr(incrsize);
FreqSpecsFrm.NoInts.Text := IntToStr(nints);
FreqSpecsFrm.NoCases := NoCases;
if FreqSpecsFrm.ShowModal <> mrOK then
exit;
incrsize := StrToFloat(FreqSpecsFrm.IntSize.Text);
nints := StrToInt(FreqSpecsFrm.NoInts.Text);
if nints > 200 then
nints := 200;
*)
nInts := NoIntervalsEdit.Value;
incrSize := (max - min) / nInts;
CalcIntervals(min, max, incrSize, nInts);
SetLength(freq, nInts);
SetLength(XValue, nInts);
SetLength(XLabels, nInts);
{ Get frequency of cases in each interval }
// Get frequency of cases in each interval
nCases := 0;
for j := 1 to NoCases do
begin
@ -233,13 +221,19 @@ begin
if (value >= min + k * incrSize) and (value < min + ((k+1) * incrSize)) then
freq[k] := freq[k] + 1.0;
end;
// Create x axis labels for the chart
if HorBarsBtn.Down then
mask := '%.2f to %.2f'
else
mask := '%.2f' + LineEnding + 'to' + LineEnding + '%.2f';
for j := 0 to nInts-1 do
begin
XValue[j] := min + j * incrSize;
XLabels[j] := Format('%.2f'+LineEnding+'to'+LineEnding+'%.2f', [XValue[j], XValue[j] + incrSize]);
XLabels[j] := Format(mask, [XValue[j], XValue[j] + incrSize]);
end;
{ Get cumulative frequencies and percents to midpoints }
// Get cumulative frequencies and percents to midpoints
cumFreq[0] := freq[0];
pcnt[0] := freq[0] / nCases;
cumPcnt[0] := cumFreq[0] / nCases;
@ -252,7 +246,65 @@ begin
pcntileRank[k] := (cumFreq[k-1] + freq[k] * 0.5) / nCases;
end;
{ Print results to report }
if NormPltChk.Checked then
begin
// Get mean and standard deviation of xvalues, then height of
// the normal curve for each normally distributed corresponding z score
sumx := 0.0;
sumx2 := 0.0;
for k := 1 to NoCases do
begin
if not ValidValue(k, col) then continue;
value := StrToFloat(OS3MainFrm.DataGrid.Cells[col, k]);
sumx := sumx + value;
sumx2 := sumx2 + sqr(value);
end;
Mean := sumx / nCases;
Variance := sumx2 - sqr(sumx) / nCases;
Variance := Variance / (nCases - 1);
StdDev := sqrt(Variance);
SetLength(normDistValue, nInts);
for k := 0 to nInts-1 do
begin
X := XValue[k];
if StdDev > 0.0 then
zLow := (X - Mean) / StdDev
else
zLow := 0.0;
X := XValue[k] + incrSize;
if StdDev > 0.0 then
zHi := (X - Mean) / StdDev
else
zHi := 0.0;
// Get cumulative proportion for this z and translate to frequency
zPropLow := NormalDist(zLow);
zPropHi := NormalDist(zHi);
zFreq := nCases * abs(zPropHi - zPropLow);
normDistValue[k] := zFreq;
end;
// Print results to report
lReport.Add(' FROM TO FREQ. PCNT CUM.FREQ. CUM.PCNT. %ILE RANK ND FREQ.');
lReport.Add('');
for k := 0 to nInts - 1 do
lReport.Add('%8.2f%8.2f%8.0f%8.2f %8.2f %8.2f %8.2f %8.2f', [
min + k*incrSize, // from
min + (k+1)*incrSize, // to
freq[k], // freq
pcnt[k], // pcnt
cumFreq[k], // cum.freq.
cumPcnt[k], // cum.pcnt.
pcntileRank[k], // %ile rank
normDistValue[k] // normal distribution value
]);
end
else
begin
// Print results to report
lReport.Add(' FROM TO FREQ. PCNT CUM.FREQ. CUM.PCNT. %ILE RANK');
lReport.Add('');
for k := 0 to nInts - 1 do
@ -265,130 +317,25 @@ begin
cumPcnt[k], // cum.pcnt.
pcntileRank[k] // %ile rank
]);
(*
{ Now, prepare plot values as indicated in options list }
if NormDist = false then
SetLength(GraphFrm.Ypoints,1,nints+1)
else
SetLength(GraphFrm.Ypoints,2,nints+1);
SetLength(GraphFrm.Xpoints,1,nints+1);
for k := 1 to nints+1 do
begin
GraphFrm.Ypoints[0,k-1] := freq[k-1];
GraphFrm.Xpoints[0,k-1] := XValue[k-1];
end; *)
// Create ND plot if checked.
// BUT: Only 3D-vertical plots when normal curve is desired
if NormDist then
begin
lReport.Add('');
lReport.Add('Interval ND Freq.');
// Only use 3Dvertical plots when normal curve desired
PlotOptionsGroup.ItemIndex := 1;
// get mean and standard deviation of xvalues, then height of
// the normal curve for each Normally distributed corresponding z score
sumx := 0.0;
sumx2 := 0.0;
for k := 1 to nints do
begin
sumx := sumx + (XValue[k-1] * freq[k-1]);
sumx2 := sumx2 + ((XValue[k-1] * XValue[k-1]) * freq[k-1]);
end;
Mean := sumx / Ncases;
Variance := sumx2 - ((sumx * sumx) / Ncases);
Variance := Variance / (Ncases - 1);
StdDev := sqrt(Variance);
for k := 1 to nints+1 do
begin
X := XValue[k-1] - (incrsize / 2.0);
if StdDev > 0.0 then
zlow := (X - Mean) / StdDev
else
zlow := 0.0;
X := XValue[k-1] + (incrsize / 2.0);
if StdDev > 0.0 then
zhi := (X - Mean) / StdDev
else
zhi := 0.0;
// get cum. prop. for this z and translate to frequency
zproplow := probz(zlow);
zprophi := probz(zhi);
zfreq := NoCases * abs(zprophi - zproplow);
(* !!!!!!!!!!!!!!!!!!!
GraphFrm.Ypoints[1,k-1] := zfreq;
lReport.Add(' %2d %6.2f', [k, GraphFrm.Ypoints[1,k-1]]);
*)
end;
end;
// Show report in form
FReportFrame.DisplayReport(lReport);
// Plot data
PlotFreq(col, cellVal, xLabels, freq);
chartFrame := CreateOrGetChartFrame(col, cellVal);
chartFrame.Clear;
if NormPltChk.Checked then
PlotNormalDist(chartFrame, normDistValue);
PlotFreq(chartFrame, col, cellVal, xLabels, freq);
end;
(*
plottype := PlotOptionsGroup.ItemIndex + 1;
if Histogram then
GraphFrm.barwideprop := 1.0
else
GraphFrm.barwideprop := 0.5;
if NormDist then
GraphFrm.nosets := 2
else
GraphFrm.nosets := 1;
GraphFrm.nbars := nints+1;
GraphFrm.Heading := cellval;
GraphFrm.XTitle := 'Lower Limit Values';
GraphFrm.YTitle := 'Frequency';
GraphFrm.AutoScaled := true;
GraphFrm.GraphType := plotType;
GraphFrm.BackColor := clCream;
GraphFrm.WallColor := clDkGray;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
if plotType in [2, 6, 8, 10] then
begin
GraphFrm.ShowLeftWall := true;
GraphFrm.ShowRightWall := true;
GraphFrm.ShowBottomWall := true;
end;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
end; // for novars list
*)
{
for j := PageControl.PageCount-1 downto 1 do
begin
found := false;
for i := 0 to SelList.Count-1 do
if GetPageCaption(SelList.Items[i]) = PageControl.Pages[j].Caption then
begin
found := true;
break;
end;
if not found then
PageControl.Pages[j].Free;
end;
}
finally
lReport.Free;
(*
XValue := nil;
cumfreq := nil;
pcntilerank := nil;
cumpcnt := nil;
pcnt := nil;
freq := nil;
*)
end;
end;
function TFreqFrm.CreateChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
function TFreqFrm.CreateOrGetChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
var
sheetTitle: String;
tabSheet: TTabSheet;
@ -433,12 +380,22 @@ begin
ComputeBtn.Constraints.MinWidth := w;
CloseBtn.Constraints.MinWidth := w;
(*
Panel1.Constraints.MinHeight := BarTypeGroup.Top + BarTypeGroup.Height - Panel1.Top;
Panel1.Constraints.MinWidth := Label2.Width * 2 + AllBtn.Width + 2 * VarList.BorderSpacing.Right;
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
*)
Panel1.Constraints.MinHeight := AllBtn.Top + AllBtn.Height;
Panel1.Constraints.MinWidth := Max(Label1.Width, Label2.Width) + AllBtn.Width + VarList.BorderSpacing.Right*2;
ParamsPanel.Constraints.MinHeight := Panel1.Constraints.MinHeight +
NormPltChk.BorderSpacing.Top + NormPltChk.Height +
BinSelectionGroup.BorderSpacing.Top + BinSelectionGroup.Height +
PlotOptionsGroup.BorderSpacing.Top + PlotOptionsGroup.Height +
Bevel1.Height +
CloseBtn.BorderSpacing.Top + CloseBtn.Height;
ParamsPanel.Constraints.MinWidth := Max(
3*w + 2 * CloseBtn.BorderSpacing.Left,
Panel1.Constraints.MinWidth) + ParamsPanel.BorderSpacing.left*2;
Constraints.MinWidth := ParamsPanel.Constraints.MinWidth + 300;
Constraints.MinHeight := ParamsPanel.Constraints.MinHeight + ParamsPanel.BorderSpacing.Top*2;
if Width < Constraints.MinWidth then Width := 1; // trigger autoscaling
if Height < Constraints.MinHeight then Height := 1;
Position := poMainFormCenter;
FAutoSized := true;
@ -515,38 +472,117 @@ begin
UpdateBtnStates;
end;
procedure TFreqFrm.PlotFreq(AColIndex: Integer; AVarName: String;
const xLabels: StrDyneVec; const Freq: DblDyneVec);
procedure TFreqFrm.PlotFreq(AChartFrame: TChartFrame; AColIndex: Integer;
AVarName: String; const xLabels: StrDyneVec; const Freq: DblDyneVec);
var
ser: TBarSeries;
chartFrame: TChartFrame;
ser: TChartSeries;
isRotated: Boolean;
margin: Integer;
source: TListChartSource;
i: Integer;
begin
chartFrame := CreateChartFrame(AColIndex, AVarName);
chartFrame.Clear;
isRotated := false;
ser := chartFrame.PlotXY(ptVertBars, nil, Freq, xLabels, nil, '', clDefault) as TBarSeries;
ser.BarBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
if BarTypeGroup.ItemIndex = 1 then
// *** BAR series ***
if VertBarsBtn.Down or HorBarsBtn.Down then
begin
ser.BarWidthPercent := 100;
ser.BarPen.Color := ser.BarBrush.Color;
ser := AChartFrame.PlotXY(ptBars, nil, Freq, xLabels, nil, 'Data', clDefault);
with (ser as TBarSeries) do
begin
BarBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
DepthBrightnessDelta := -30;
end;
if HorBarsBtn.Down then
isRotated := true;
margin := 0;
end
else
// *** LINE series ***
if LinePlotBtn.Down then
begin
ser := AChartFrame.PlotXY(ptLines, nil, Freq, xLabels, nil, 'Data', clDefault);
with TLineSeries(ser) do
begin
LinePen.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
DepthBrightnessDelta := -30;
end;
margin := 4;
end
else
// *** AREA series ***
if AreaPlotBtn.Down then
begin
ser := AChartFrame.PlotXY(ptArea, nil, Freq, xLabels, nil, 'Data', clDefault);
with TAreaSeries(ser) do
begin
AreaBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
AreaLinesPen.Color := AreaBrush.Color;
AreaContourPen.Color := clBlack; //AreaBrush.Color;
DepthBrightnessDelta := -30;
end;
margin := 0;
end;
chartFrame.Chart.Margins.Bottom := 0;
chartFrame.Chart.BottomAxis.Marks.Source := ser.Source;
chartFrame.Chart.BottomAxis.Marks.Style := smsLabel;
chartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
chartFrame.SetTitle('Frequency distribution');
chartFrame.SetXTitle(AVarName + ' categories');
chartFrame.SetYTitle('Frequency');
chartFrame.Chart.Legend.Visible := false;
ser.Legend.Order := 0;
if ThreeDChk.Checked then
ser.Depth := 20;
source := TListChartSource.Create(AChartFrame);
for i := 0 to ser.Source.Count-1 do
source.Add(ser.Source[i]^.X, ser.Source[i]^.X, ser.Source[i]^.Text);
AChartFrame.SetTitle('Frequency distribution');
AChartFrame.Chart.Legend.Visible := NormPltChk.Checked;
if isRotated then
begin
ser.AxisIndexX := 0;
ser.AxisIndexY := 1;
AChartFrame.SetXTitle('Frequency');
AChartFrame.SetYTitle(AVarName + ' categories');
AChartFrame.Chart.Margins.Bottom := 4;
AChartFrame.Chart.BottomAxis.Marks.Source := nil;
AChartFrame.Chart.BottomAxis.Marks.Style := smsValue;
AChartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
AChartFrame.Chart.Margins.Left := margin;
AChartFrame.Chart.LeftAxis.Marks.Source := source;
AChartFrame.Chart.LeftAxis.Marks.Style := smsLabel;
AChartFrame.Chart.LeftAxis.Marks.Alignment := taCenter;
end else
begin
ser.AxisIndexX := 1;
ser.AxisIndexY := 0;
AChartFrame.SetXTitle(AVarName + ' categories');
AChartFrame.SetYTitle('Frequency');
AChartFrame.Chart.Margins.Bottom := margin;
AChartFrame.Chart.BottomAxis.Marks.Source := source;
AChartFrame.Chart.BottomAxis.Marks.Style := smsLabel;
AChartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
AChartFrame.Chart.Margins.Left := 4;
AChartFrame.Chart.LeftAxis.Marks.Source := nil;
AChartFrame.Chart.LeftAxis.Marks.Style := smsValue;
AChartFrame.Chart.LeftAxis.Marks.Alignment := taCenter;
end;
end;
procedure TFreqFrm.PlotOptionsGroupSelectionChanged(Sender: TObject);
procedure TFreqFrm.PlotNormalDist(AChartFrame: TChartFrame; Freq: DblDyneVec);
var
ser: TLineSeries;
begin
BarTypeGroup.Enabled := PlotOptionsGroup.ItemIndex in [0, 1, 8, 9]; // Bar series only
ser := AChartFrame.PlotXY(ptLines, nil, Freq, nil, nil, 'Normal Dist.', clBlack) as TLineSeries;
if HorBarsBtn.Down then
begin
ser.AxisIndexX := 0;
ser.AxisIndexY := 1;
end;
if ThreeDChk.Checked then
begin
ser.LinePen.Color := clGray;
ser.LinePen.Width := 1;
ser.Depth := 20;
end else
ser.LinePen.Width := 2;
end;
@ -558,8 +594,6 @@ begin
SelList.Clear;
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
BarTypeGroup.ItemIndex := 0;
PlotOptionsGroup.ItemIndex := 0;
NormPltChk.Checked := false;
ClearTabs;
@ -599,8 +633,6 @@ begin
AllBtn.Enabled := VarList.Items.Count > 0;
BarTypeGroup.Enabled := PlotOptionsGroup.ItemIndex in [0, 1, 8, 9]; // Bar series only
FReportFrame.UpdateBtnStates;
for i := 1 to PageControl.PageCount-1 do
begin

View File

@ -9,333 +9,449 @@ object MainDataModule: TMainDataModule
Left = 48
Top = 40
Bitmap = {
4C7A080000001000000010000000C20700000000000078DAED987B5054F715C7
7F8D3149D324CD1F0E5A282663ACCE24CD946A1F33E96813A3AC4A8C28105C59
417C624587B684BF34DD48CBBA0BB210E4B52CE02B18D24899C4568DDA6AD1A8
0802220476AFBAEE00092B0F798BAF93737ED7BB591CEE72EFC6BF4CEECC77EE
DD7B7F9FF3F8DDDF39F70700C0E07B2C665E8C7A9BB11D6F3196B600F06CE3BF
F97D25C2B1690B1933BC09FB5A9A8119E7A18D10C6D2178DA1FB3E682CB2058E
5A60278A80FD732BB094378019E602DB2E27F461D250ACE5CC341F52AE9C0576
DA0AEC9405D65C3D03B18EB3107BAD525ECEF3B0B6AD0E882525DA8E03AB46FE
BC453CD71403ABDD25AFBADDC01AF6238BF3C5D84C8A75ED979F016BC26747FE
86F1538CC138171A7911FBBEE6049F3F6E2318C26DE5C869449BCAF492FB1DD0
EFB41060FF985FA7FCDD2D660F1C64733A5371C0F7BC7E1E8DFA5758E73BDEB2
DCEF114CEA11AA7C616FE03D02EB5DF4CD6DFE8BD732D5B45CBD532FA09E40BD
017B04EF15920DAC5FAA65AA69AF358F3D817A03F508EA15BC67F0FA5F20D632
D5B4B79AA79EE0D12378CF207EEBDC326EC35BAD532FA09E40BD017B04EF1594
93586F2F28AE77EC0DBC4760AFE0BF55F569D4BBAFE7F01EE1C9AA3B7E763F96
47B6FE471CB42E4D1A5093AFFB30CC018BA39E8BAE55F1B8E6D3EDE771BD1472
F1EBED7CBD8CCDA72D846D4225B093B866FF5B200AAF93E91E3E1B93FFBBA69A
19717D95E15AAD281255A6077E0F9F29887F9AF83D9B037F7256013BB7DB73AD
4F533C7F98AFF61AD6E8F93DA26FB5F38FFD24C47112EB76B758833EF0B3AF62
8D5FF4950F86A0AB87B0B7EC91BEE92AD74F30BCE4F81458B3AFBC06FC1C9F00
137CE49179CA5902CCE1236FC49EF8D57E51C605EA797DF031665A085C74AD96
676C8A47EF9CA29AE77B4BCDB7FB4CB5BC2918F25C6DB05EB834A287A859FF29
2D36604771FD99827DE293AE61EFF9DF2E9FF9F58E6AAC7FDFFD2FBB8CDFDB33
7B7CAEBF0502D66FA5EFFC6BF6A3C02EECF5B97E5FB61FC47D818FEB1FBFF701
CD587F97768BDF7EA5FC8E45A7F97EE1C87BC0EAB1FFD71789D714033E1BBBFF
874058533984B94E61EFB172D135DDA3670AE2E7FB0C761C7D5E2E1675FC3DF7
DF250AF3471BB837AAD8268AAEEFEF1B54D4EF4C968A7B95D410F0DC73A8FA7E
7F5BFFB2DFEF7D6B7F035A6D9F6A1147F61E06DFD1D5A55A3FF00F8FF7550F9B
FFCFF1CF65A59497B3F308F311DF65FE3C0F7BEEC63E7BF606184D42EEC6217B
56DCEBDEFE38A27172C7509B00972D0903426EDC9CB1F841FB2918683CEA16FD
E6F7F16F6721377ED017FFD24163D4FAF78CE1413E3B3BFB99828282FEFCFC7C
50EA9FC622D7AFD7EB9FB1582C6F979696F6B4B5B529E6692CF23D8989898B0A
0B0B8B2B2A2AEE391C0EB05AAD70E0C001AFA23134B6ACACECDEA64D9B8A9177
D96C36A8AAAA82F2F2726EDB9B680C8DADABAB83F8F87817E542C23CF8392727
07CC6633188D46484E4E862D5BB640525212242424C0860D1B60DDBA75101717
C7CF2462C8AE7496E4743A411004686C6C84DADA5AEE531271D259E20A2CF963
FA95B4397EA39BA77889BF9CBF19941E3456E2B3B2B2A0B5B5D5679E624E4D4D
55CD4BB948EB90EEA991C43DB132FFD5A7575B3F1FA7CD2861511F3CA7F61F22
4F213BA3A4132627FF1F1E5F9651C942CDCFABE1C76933F707269F8419255D68
A3C26D634292F1D98989A93F19D340C4F69F3EAECDF82210FD4B36C6EB326B03
D20BAB034DF9E98A82407F928DA0BD5F43A0796FEBAC334DF0B2E5A31AA6D73F
A6D4C6785D4675A0795FEB9C737688AC69818059F577FC430F37BC6AB66E9FA0
37FA7BC329DFC9E6A2EAB99576D0D5B5C2D4793698FE861D763A7A20D7711DA2
CA8F397F9551943975D3074F8EC6D35CBD9866490F2A28AD099C5D7FE7956001
AC2D7DF059D74D387263183EE918044353EBDDDFE67D583DD99039D3CB7FB47F
F442F8B106620F750FC385C17BFCBCABBD1F4CCE6EF88BAD1D66951DFB6A8AB9
F86080216BD45EFEBBECBDA5E48FFC927F6253917D5770414C632BCCAF71C0AF
CFD860D28EC2C3A3F1419945468BB313F6B90620AFAD170CD7BAE0AF76174437
88EC8C7302041CFCE2D6C494ECB5A3F1FE7AF38CF527AA7B29DEAD573A20BEF9
6BD05E6A8179171C1074D60E01271B60624651258BF878DCA85380EFFC0FC507
2E2560AEAB1ADB60C94527FCB1EA0AFC92623ED1007E3925C284949DD3BCBDCF
E9666B4E6895001A8CF7F79502FCE27413F81DA9BAE797B1AB6ED2B6F457C65A
4EFEFAB409532D1FDBC867C0BFCFDDF5CBFBA87992297FE7CFFF9CFE63A5B5E5
6FC8D34E4CB37EEA67C88AF3D7EB9F961B17BB6635AC5CB34AD4EA588859B512
56C4C6806E6534E862564054B40E96AFD08137FED6AD5B5CC3C3C370F3E64D18
1C1C84BEBE3EB871E3067476768256B75C9627BFB76FDFE6926C10DFDFDFEFE6
23A3B4AA79F2DFD3D3035DB8DF8DD046CAE64239CBF997F8F0C808D95C629097
F2273D983FF14BDF0997CD251AE79B7C4A73373434C47DF7F6F6BA9925E16123
72F1E4E95D1123696060C09D7B777737E743C3978EC865048FEF991812F99558
29F68E8E0E581CB664442E9EBC2E269AC72A49F24B63C9F7F5EBD7DDBC948B27
1F85EF859E91889362965897CB058B972E19918B27BF1CDFA9349E44F11227B1
EDEDEDDCBF672E23785C0FCBF09D462ED7F2B90DC3F9591A11C6FD84E2581A4F
67CF5CE4D6A2D25CE478A5B9C8F20A7391C67F03DAE7A495
4C7A0C0000001000000010000000030A00000000000078DAED98795C54D715C7
6F6B4C4D9A2E7FF8410BC1F4638C7E3E26B6469BB6696A1A1041252A6B701441
5C102B24B425540D985112761908B20DC3A25014A304173685AA4501111444A8
CC8C3A52C130ECAB5BE2E9B96F7C3883F386F7066CAAE67E3EBFCF7B73DFFDDE
73CE7DF79CFB0000083CC3229265A8A584EC7C9F90C845805739F39BE9E7231C
1BB9989090F99079A31148D8029CC39690A82523E8810D3A16D964550D9093A9
40BE0C04126C0124C40A482897D046B80DF53597842F84E0AB1540CEC8809C96
C2BA6BE5E0A1AA008FEB95DC6A3A07EB5B6A81B2547EF21220D5C89F936AAE17
D280D4A473AB763790FABDC8E27A113297FABAFEDF47805CC667459FA2FFD447
6B5C0B1B6E5176BBCD4966FD9839ACC1499E8B9C8D664E7E7A75E81DD0DF91B6
403E5F58CBFFDD2D23C31A9D730611D0E019CF9FA723FF79E6F9CEF7A50F6A04
616B84205B581B981A81F9AEB1CDCCF91593CB34A7B9F29DD6025A13686DC01A
C1D40A760ECC5F9ACB34A70DE63CD6045A1B688DA0B582A9194CFE2FD2E432CD
6943394F6B82568D606A06E503AD7298390CE53AAD05B426D0DA803582A91534
264DBEBDC23BDFB1363035026B05F35B509D467DFC5E3C5323B45961ED170F7C
796AF35FA7D17D196E0342E21D6A21962055D531A2F78278DCF3518A73B85F52
1831F7A1CC7E19998F5C0C3B9495404EE19EFD67B246781F44FBF0D988FC6736
D5240CF7570EEED5D2548D72C4C0F4E1331EFE4FD79C6796F0E7A62A2067776B
EFF5E9BCD70FE3155DC71C3DB747635BE8FA633DB1559DC2BCDDADC94123F877
AF618E5F3496B786D9D70AB0B6EC61CF7481FBC71A5E551D06D2682C6F0326AA
03409446F2C84C68CA02A232920FC39A7873AF46618B84F362EB6212BE1818D1
7BA13C2153B56AE754C13CF36D69F3F03B53281F6E0D89EA16D8A0BCA4534384
ECFFE01B7220C771FF855B1BC5FB5FC7DA7322DD687E83AA1AF3DF78FBCBAFE0
795BBEC7E8FC5BA4C4FCAD349EFF83E23890F31946E7EF4CC551FC2E3072FFE3
796FD688F97769B7E6ECE7CBEF5C7286F95E28DA06A40EEB7F5DAAE69EFA80CF
46AEFFB6E07839171CD5A7B1F6C818D17BDA479FF1F09FF9CE202568F34A9A46
25DB86FE2EE1193FCE81DF46A53B34A2F70FBE1B04E4EF5C1281DF2A11B6A0FD
CD21E8FC7E98FF9CE777E6FADF8048D4275894A3F38D05DFDED92958DFF363C7
1BABB1E6F34B8E718A2FCF35CF53CC3B8F66FDB49B2261539F226E23E8933261
D32D45ACD77B86FE38A2E3B8DAAD16255C91FA0E2813BC2C47E20715A761A0E1
F890E86FA61FFF765626780F1A639F6D748C50FBDA3E0CE7E3E2E25E4A4E4EEE
4F4A4A02BEF6E958E4FAC562F14B52A974697676764F4B4B0B6F9E8E45BEC7CF
CF6F494A4A4A5A6969E97D954A0532990C0E1E3C6850740C1D9B939373DFC7C7
270D79B55C2E87AAAA2AC8CDCD65E636243A868EADADAD056F6F6F358D850AE3
60AEF1F1F1209148202C2C0C82828220202000FCFDFDC1D7D717366EDC089E9E
9EE0E5E5C55CA92843E765AFAC9A9A9A40A95442434303D4D4D4303659518EBD
B25CB2346944BBAC3EF4DE34C4537F297F25E943E0DBE858968F8D8D85E6E666
A379EA73444484609E8D85DD87B44F8858EEF9D549B35E5C2B3B364E149D4556
7EF153A1FF109980EC9CAC0E9812F42F786E797425B193FC5C083F4E14B3D73C
E814CCC9EAC4394A87E698E81FF693497E113F1E7102E7D09F3D278A2E3347FB
EC1CE35D636ACCA252AACDC393A2783981F6D83966677C0DE6928CE679E59761
A674DF052216FF90EF1CE35DA3ABCD2599CD966715E072E10698CDABFBC6D4AE
B07E9644163A511C666A08A7F14E91A4565B552AC0B5B619A62D90C30C0B05EC
52F54082AA0D56E61637FD3A3A35669ACF173FD2C7D3B5FA65A4346A7672F605
F377EBBE79DD5A09B21B7D70A4F3361475DF8103ED831072B9F9DBB712FF513D
252466AE81FF68FFE015A7E27ACA1674DD81F383F7996B7A6B3F843775C15FE5
AD302FA7F8E65449DA51B39058BDB5FCB77119D9D41EB54BED533602D98F956A
706F6886851754F066B91C26EF4C29D4C7CF8E490D93367540A67A00125B7A21
E47A27FC4DA106B77A0D3BE7AC12CC8E96DD9D141CB75E1F6F2A96CCD970B2BA
97FA1B78B51DBC1BBF06D1A51BB0E0BC0A665728C0EC543D4C8A4EAD24CEFBC7
E95D027CE7EFA41DBCE48BB1AE696801FB8B4DF0A7AAABF006F5F9643D98C467
292706EF9A6EE87DCE90C8E2EDAA946083FEFEAE5209AF9DB90C264555F74DA2
D36B27EF887A7DA4ED642A8E9C384DBA5F4E6D9AE59DFDD624715FE3E4F0A45D
2FFF25EA05BEB9651A92289A14293B6C1212EB652A16BFC835CE63DD5A58BD6E
8D466B3DC07DCD6A58E5E10EAEABDDC0D57D15AC74738515AB5CC1107FF7EE5D
4677EEDC81DBB76FC3E0E020F4F5F54177773774747480C87505274FEDDEBB77
8F113B07E5FBFBFB8778979522C13CB5DFD3D3039DF8BDEB2C72E18C85C6CC65
9FE59D5C9C396371479E8D9F6A78FC9477F8C0893316375C6F6A935DBB5BB76E
31B67B7B7B87187B27479D58B479FAAE28C36A60606028F6AEAE2E86B77372D0
894587C7F74C192A6A976559DFDBDBDB6199A3BD4E2CDABCABBB1BE32B2BD62E
1D4B6DB7B5B50DF16C2CDAFC4A7C2FF41915E5589F5956AD56C332077B9D58B4
F915F84ED9F154D45FCAB16C6B6B2B635F3B161D1EF7C3727CA72E2B44CCDA3A
E2FA38383B3276EC702C1D4FAFDAB170ED45BEB170F17C63E1E479C642BE83E6
2F73036D19C397A88E311A4B9EAF5F86783E7E3D49BCBE3511CAF3E9FB9EE75E
6B3E7DFF0F6DB85F8634D2BE34A4C7C98FC6FFC7B97E42EB1A9F781F07FFBF5C
AFD1BC3F7DBEF1DD3F5C6B3316FC68FC1F4D93456C862791B7B0287FC7DAFACC
1BC6F056566536F3E797B7595854CCA57CDDC9DCAF68BFF6D5CAEADCD48B270E
E53EDA5F6663BBB8ECB69555C51FE96F7DF6716E17D46DD4092BABD3531EF697
2DC4BE56EA3B57FCF8DC1DD56461717A06DAF0A47ECE9F5FF191A565993DDEDF
44FB6F72AD1F8E5BFE60CC2CB6CFD2B27C0EF635A03A70BEDF73AD3FCE2F1ACE
B2EDEDB7CB5EC0E76686DE1FB2FBD0FEAF8C79FFFAD69FEFF549DDBF63C98F46
DFC5F742BEBFC3CBF95B967EA9F7D9D6A56B0A031D6AF2B62C597542FCDE04ED
67FBC5CECFE77D6217501860D79FB775E923BE176C5EF2564180FDA03CDD0FCA
22DD070B03ED078AC48E29F95B96CDCCDB66BFA0689B43CBD9288F41F5A1CF60
385F24B63729DC66DF7635733374174430521FFA1C2E493FBA777CBB636FC98E
0F7AAFEF0B187AA6CD57797A8E3F16E870FE62A2CF3DF6B98EF2C3A10BA5DDA7
CDA35F99153B3D06BB878D31246D9EDE771C0D65FAFF73341852F6FA4274A637
941EDC0AED7AE6AC3FB41D426357E8F205E1907FE0EFF069FA7A483D150DFBAB
7743F4E100FCBD0EB2B3FD40712488E1E2B37C607B8697CEF99319E400C1191B
20E6F02790D798AB73CE15288EE07C1208CADC083B507BCA12A0F86AE123E7DF
FEF37B0C9F99D78E41F1B5A2C776FE3EABE7FF7F0194742A66
}
BitmapAdv = {
4C69020000004C7A080000001800000018000000760E00000000000078DAED9B
7B5454D715C60F6A2C69A882511E0690B7DAD4C6684DADAE658C9A9826514104
1410D1F80C6AD59A56139282828ABC41C01964C047951045F3109028C417F840
91D7C84B8A220882082A6810FDBACFC0A5034C741CAEFF7471D7FAD6CC70E7FE
F699BDCF3DFBBB7706000CBDEA95864A4F4FEFAC9CF3FAE9157913E9B956B77D
1AA8D3A6AB6DC056BF2F6121F6CDF44A9B89BB69B1BF4F8919F593B4493F6609
E8F540D1C8BADA46C49659A6456349C9398C4EFC1A83639761709C86DABD02BF
8D74A9601683DE617AAF9AB135D30E5A1D0F7F64959500EB8BF178AB200923E4
4918294FD64C85A918F2FD66300BBD4F28C687BA87363E31BDF22D58663449AA
A468CD742E06ECDBCF39DF9619E8FC896DB2CB60A7825AD9E55D6097683F7FCC
8ED15C39B16087FFD1C6676C003319388379CFCA6417778015C8C0923C69FF7A
CDF51DB177B9373273BD0F89DF87A4C7F45F9BCEA2E697B2BC28B01837D0BECF
29FE3A0DB5968E7767BFE937AC636E32A6A388B1CDFE228B747C4AAF4DF9CCEA
817448FD3ACD7FFE39CC07CD651FD84428F226FED6A73DB621A9BF18C0C99327
BF54F5AEF1BDEA55AFD4F63F9A494BE199B8777A96FFD17CD3567826EE9DB887
127F1BC83D13F74EDC43B5F792B6CD72D0D4DF46B9B470CFA2B1DF21AFC43D13
F74EDC432962089FC3426F26F72ADCB368EA77B857E29E897B27EEA1C84B35B1
BF4DE5B932547808EE55B867D1D4EF74F14CDC4BE91EDCD84CDE6AAA82CFBD0A
F72C3DF13CCADE897B29EEA90C74C6528C592C7661ABC2B3F4C4F370CFC4BD13
F750DC4B714FC53D82763F6B8AB1A2075E679DC22B71CFC4BD13F750DCE7702F
D2E6175E69F7223DF13AA62CCA112CD0B18C19FECEAEDDFB688938FF0790678A
A23CB8D1F3C122B359BB57326CCF49DF5EFFD3AB97ADCEDDA39F0E9B3B66E388
388F46B67E6AACAA1ED203BE16737A7BC3A8C37EB57F2FCAC2D4E3B226B6F2BD
9D5D6368C8D7621F5B2F323EE4DB30EBD231E81DDF8349E77FC0F854EA53EBDE
EBD4A75E98AFDD4F97B98C8BD44DF4793CE5722AD8315ADB5369FD4D95E20F99
4760931607F6F93419D37DD55023BEE5EBEFB348E7C76689DE189CB80923320F
821D8FC6E0937B3122351266F4372659D8CCDEB75ECBD7490DC66F4DBDD983D6
DFCF87C72EC7CCFCE3602724187E2E01338F85804D34D949FB5731BD57C7F335
4783FCF76F5FB74D6DE256604601F1D325B0B9908019A9A1747DACEBDC7E8F85
DFC7D1EAC1FCD1B526FEC7F29FC04E4AA88727E0E3630ABEAD48F353D792F8D3
E554E3D31258667D83E9C78245E59BC72DC754790AD81909CC2FC5636A4AA0A8
FC61C47FB730192C438261D9F17837254054BE0979B4894547C923496072E500
26A6F8F3FB1FA2F1DF885D8A3F17FD007641823772F7E3CF297EA2F28D883FB6
F87BF24F1218E5FD1B6393B789CA37885D82B74A8E903793C0207F1FDE4ADE22
2A7F48EC62BC5972983CA40443E47BF166B28FA8FCC1C41F519A08962BC1E0AB
B4FE88CC1F447CAB325ADFF2251854B41756C99B44E50F8C5D84616509607209
0616EFC6B0642F51F903886F5C1E0F7675270694EE8671F2BF44E5EBC42D82D1
0DE2174BA153B61B46295F8BCAD796CE7FA09B130E96E50FEDEC60E826AE7BC4
CC077D22125F87BD67E1CDA659C5B1A996BBD934D2144B7F3650FBF722F1F93D
4CEE15CC48E6ED8F4349AF8AC5FF4DB05D81B16C054C6296C158B61C0322E6B5
DD7B17293F16719FC15D7E1E13CE256146763AA62585B4DD7B17A9BE36B19F11
F7045DC3496173EA5BCC48091375FDB789A5FE9E7342E1816CCE72BEB8FDD79A
F81FE5507F4FA5FE7E36011F258788DBDF89FF410EF5F7E3D4DF33BEC107C922
F777F2575372A9BFA7517F3F178F29C922F7779A939372A9BFFF4CFDFD7C3C26
2589DCDF65CB30218FFAFB29294C2E1EC0842471FBFB50D9528CCBFF11ECAC14
43B3F663DC5191FB3BF1C714507FCF90C2E8D27E8C392A727F972DC11FE5D4DF
CF537FCFDE873F1E15B7BF0F962DC64839F5DF8BD47F73F661E45171FBEFEBC4
B7B97A88D67F095ECFDD0B9BA39B45E5EBC93E8545E1B70AFFA397B7071647BD
C5EDBFC43729A2FE7E458201F97B607254DCFEAE23A3FE5B4CFD3797FAAF9CFA
EF8F22F4DFA103C6B2157F49674BDF39F35AB41BF48BF783E549F1DAD538E87F
FF05D8AAF1F98AFDE34C1669747D64F8BBB7D93687B3EC72782B2B89256F42D7
A672699B8A656045A45D4B8AD9E8A17334BCBEE3DFABCE649B666532EE1D8A76
510C095821C5C98F043BE051CDFE60B098DE3744A3EB53E5EF5577BA96B23C8A
514A310A7782C5137BFCB0F5B45F5FF80E53E3FB03C2F7AA3EB6992C734B2B93
BA97B68F5BBF47F707BA7EAF6AAA3B937C4F041B65B8B8DDAFF413697E0AB91A
D0EE7B0675653F8BBF6FC99FC0356FDE7DD1243079DCFF177E5D7DBD68EAE5F7
F27BF99DF92F43FF8FFCA413A96A4B53BEBAB17AF9BD7C7A747899FCAE31C49E
FFAAB692288FFB25112BF03C9546793C2C095F3EF945BFCCE5C7AAB33DAC2AC5
35E99AA6D2A8E5535E065FD31802FF7143159AE43FA95473E9D98E18CD378B28
572B9B5F94FFB4A5192DB74BD15253D24D8F1B2A3B7D0E7ECCCBC84F4FF8CFCA
8F20FE9EE7F1A552A9B74422812075F2A310EDE3EF11F8CA8C1D3B76780BFC98
9898A2BCBC3C54555529A4697E84E3B3B3B3E1EFEF5FC8D99191917AD1D1D18F
6EDEBC291ABFA2A2025F7EF9E5A3B56BD70EA2DC38262626360AFBD2D2D2707E
6F80620C2F227E0C3F56E06CDFBEBD71E9D2A50EB1B1B1FB3232329E0A7F8F8F
8F477E7E7EC7FBD4153F861F2BBC3E72E4C8D3D5AB57EFDBB56B576D7171B1E2
6F65656590C96450CE95BAAAACAC048D55C1E0AF793D57AD5A55AB5C73CA55A7
3940B541585818020303E1E7E7075F5F5F787B7BC3D3D3131B366CC0FAF5EBB1
66CD1A78787860D9B265A07C60F9F2E58A47419C238C41F97957DDB871433136
FE59E5723972737371F9F2656465657512675EBA74A9E3B93A7C9EAFF2F27294
9696A2B0B05091EB2B57AE74630B4CE5E7CFE3F3BC5EBF7E1DD7AE5D43515111
0A0A0A909393D331C6E7F1A3A2A23A38D152C90BE7BBAB56AFF4E8C48F8888E8
E05F93AC464F37CE50E6878787BF547E686868470D5F063F2828080101018A7C
8BC557AE87F23A2D16FFD7FA00DF2786BA819D4326F59D1B72A88F535000B30D
D615F5976BC4D659B6A7CE6C6B26F45627B46A3904953387202BB1F07DE7851E
E4EC31FBEB61139A8721FFF81E7D1C832AC48AD1C72930908F9BB3153142448E
41F9D6720A2AE7CC5F8B61E8B5D54CDF2BF024F3F2EAA7510C62508CEBAA62BC
E21A586DE41B566116B9BFD9C83BD05EE3CFA1228675D00518F944DC1B73221B
93CFCA61B275C7851EE56A6EB0999663D07F780CABE00B30DE2A697C27ED0AFE
9A5D0E87BC0A98AE4CBCD3DF267D6E8F62D0E7E8EF1A708B8F7B7CFA157C72E5
3A9CF36F627AE475F479251F03479F6AB6F68B28B3DE167940FF2BFFBFBC289E
D772A86FF8CD093FE76056CE0DCC2FA8C427D115E8DB3F1F6F8C2AC696827A48
6FDDC3A6DC6BF870EFE1BAE1DB765C32DC18F07BB5F99B827FB6DE79A0E9A373
457023F6CC5DFF63075C6DC09E9A073858D78C23771EE250DD43041757627498
ACC67CCB0E4FC6F0FCDFADD21C34FADADFCEC4372CD37C65E26D9E13D3B78B11
52D480F8DA26FC78F7114E34B620B5A1058729C66E8A175AD18059878FDF37DF
127EF10D2F3F63B57FF43AFCB88BDEDBA79BDBD8CD48BEFB0B321EB4E2ECFD56
C5F303146F67D53DF8DDB88B2FAED5C225B3E0A96540F42D139F70D9D08D5B46
A813E3CD0049C5BEDB4DF8A1FE117EBEF718A7899D42EC6F285EF4ADFB08A8B8
0BCFB23AAC2AAE51E493D76C5CCAF9A7A62171B5869B83C39EC71FEE1755CA59
9CCFC7FC1D3DEEA77812AAB13FB1BF22F66A622F9057C296D8EF5DFA0FC69C2F
C5B083694F0D36857CF13CFE88ED91E7626ED42BC6CBF3115BFD0011958DD846
39F95231EEEA0EF614628F25B6D59942E807C554EB7B6EB77C1EDFCA27CC7B5D
46EE539E8B48CA7520D57273F91DFC93F2FD5951355CDB73325931EE12057BC8
8F9930DC1C7A5AADF9FAD5D671D3F67D57EB4FE3F529AF578C796D490D965CBD
857974DEF1F36F525619469F2B810567A7E5417F6B648D81D7560BF5CEE784BE
36DBA32AF9FC5857721B2B8ADAF2619F5B81E9B46E4CB8780DA3328B6176FA2A
86A4E7C32034EE8EA15788DB8B9CD3E65BC2F6CC3999FD74A1BC0A4E79373183
C6CC73FD0EE57A6446118C4F11FB442EF4836575063EA11B5E74CDE0751A1916
57CDF3FCFEE5724CA431F37CF05C1B9E9463C891334F0CB64454197906CCD674
D933F60D4F197BECC293B1ED6336E5F9387286C61C5BA3EF1396A4FF856F8FFE
6F64A857C060BEEE991E3905036942BDC196F02AC3CD61DF1879FA8D14CB0B18
78F94FD1F70DDD61F8D5F677DFF4F27AA1FF2F5CB8F8532C5CBCA843EE9FB669
C1A70BE1B6C81D6E0B1760BEFB02B8BABBC175C17CB8B8CD87B39B2B9CE7BB42
3DFE22B4B4B4E0F1E3C71DE2AF7FF9E5173C7AF408CDCDCD78F0E001EEDDBB87
868606D4D7D7E3CE9D3B98E7EA0275C7CF99ADADAD1D528EF1F0E143343535E1
FEFDFB686C6CC4DDBB7715FCB92ECE6AF395D9CA31043EFF0C5DF94ECE73D5E2
BB537E38EFC993271D52E60B39EACA7798E7A4563D9EC5E739FA35FE9CB98E6A
D5435D3EAFB132DFDEC941AD7AF0B9A84E7EBAF2673BCE51AB1E7C9E3FABBEBF
961F3B07FB6EF550C95FB450A3F9693B6776B77AA8E6BB3FF7FCE27CE5F3ABAE
AE0EB6F6B3BBD543159FAF019CC5998204B6F2D8BBF267D9DB75AB874A3EAD2F
9CC5257005B650D7AEB951C5E7F550C59F4F7CCEE13C8129E44460775D7B6A6B
6B316BB65DB77AA8E2F3759173384F903257602B8FBD8D6FDBAD1E2AF90BDC14
0CCE13C45FF3B171A962DFBE7DBB1B9FE74B15DF85D610FE3E2E65A6C01572A2
CCAFA9A951F0BBD643259FD627CE50A5AE5C3E6ECE6EE3DB75AB87CACB6C5AFB
048EB204A620815D5D5DAD101F6FD77AA8E4D3BACAD73EBE3E3939CF539CE7FC
5CB47774C06C9A7376342F78ED384F59B6A4AEF550A71FF4A41E6AF17B500FB5
6E7BF4A01E6AF17B500F65CE7F01AA970E564C7A080000002000000020000000
FA1100000000000078DAED9C095454579AC76FC6A567FA4C26A6130A454D4C7A
FA24DD718CA1D3D39D4E34715F92B820288AA26892D1563BCE9871A28214A8EC
8B4B04AAD0A88991446D63DA256A5A0141446511447651F67D2D1645CC37DF77
5FBDE25152A8C5AB474E4EBD73FEE7D6F7DEF3FDEEFDEEFADDF7100018586595
5556F5814C1CFD59C0F4E32CE47DBA612053F6E8C7B64E3CCA0EFB020B9A4EFC
A795654F38CABEF1840DC5D9C0FC27125FA5187B0BB20F7BC2829C78F02ECE04
E6FD26309FF1C07C27C8282C93FF14C0FA3DC1EB59ACEFAD9362D9514F58929F
00EC7C387C569E0DEF97A7C1ECCA0C70A8BC219BE6546582535D3EF2A7906F9F
440D6001D36AD8712F587AEB12B0382DB00B1A5484441AF944CF4FDC8F3E984C
7C1BD42016301546E69C865F5CC5F3899116D66E60295F0A7520B4AD6799FBF8
18F6BD17B06B7B8125E13D57B582E8B7DC4A467E7A173ED5C128F67F6363D969
35B08C7DC0D2760BA2DF995FC8AB2C64E77D8DF53F4DE4F7E73E60CC9EE7E12C
FA211BB93958179BA9ED633DF94D914FBCED23DB7352BCBEFE85BE27CD4334E6
A1284AB89FB1A9A80932EB6DD42B7ADFB307F3F0762C4BF00116F82EF15FD2FB
494ED9E8D9FD1F1883843CFC9EF94C2D612133941CFFA47950713F30F69AC2E3
BF780C403DC5C706E5E73F450FEB1AC82AABACB2CA2AABACF1BFCCC740BE8740
7B090FAE3595389EE67B08B497407B0AC2DA52C943457B087C2FE11B4FE07B0B
0FE661000B7AAF81C725149BCB19EBD3DE81F79B7C2F81F614686F81EF3174CD
C3208AC52926A7D85CCE589FF60E680F81F612684F81EF2D1CA53C74A90B158F
C5292637C4FE72C9680F019FCFF7188E637CE733456C932AEE7B8AC92936B770
FC4F7B0CB4D7407B0EFA184CE0534C4EB1B925627EE97E02ED31D05E03ED3930
F62BCEA7789862728ACDE58EF78DF713688F81626CDA7310CB1FF89E8EE7C17F
8ABCB13EED1DD01E02ED25D09E02ED2D086C7B7D9CDB5F1FE3519C39DE0271FE
549E0FDA4BA03D8575636324EC7E9258739005627C15DF3BA03D04DA4BD832B9
86C7F55DD9961FFF680F21607A23FE7E0365ABF018FCB4BE6EFF80B2D3FB5AC9
63A0BE6E07F501DB1AFF5B65D5CFF5FD9CDFE4632C80F6C631ED616D6D01BEF0
8EEC2B0FC86EEF004A4DAC6B2DC117D8073DE0446D058CB87084A7649BCA838C
7C621F61519B20BCEC26B0531A83B88DE7BBCB834CFC01B8462F6387D4B0EE66
1AAEA1702D77861429A468F3F3789DF94CEA920719F8189FBC5BCB8EF9C2BCBC
245CC7E33AEA874841FFD8DDF91BCFF3EB781FF39D764A6C9332F007F11892E2
386AEF5BC6C0BEAA5BC844DFFF43CB536EE3797E9DEE13DE5B3F291BBF737D38
95F98E87DDD5B7918D31C5390D4FB98DE7F5EF8AC6E9D7B64FC9C41FA85FC708
EB39E444D620EF3CF2A3353CE5B6C017DF153D2DBEB790B9FFA988A3215E34F2
63343CD574F25516EEFF2A8A6B7754617F8B417EAC86A7DCA67857217E50559E
1053C6093126B715E4FB55623C1D87FC780D4FB9AD20DFAB3213D9C8BFA8E129
B715E34F04F7CAEBC02E21FB9296A7DCF69DA8187F5D258EB58958FE440D4FB9
AD20FFE38A546097917F59C3536E2BC85F598EE37C12F293343CE5B682FC0FCA
AF004B467EB286A7DC5690EF5A7E09580AF253343CE5B6827CE7B28BC0AE21FF
9A86A7DC568C3F091CCAE280A5690CE2369E578A3FA33C1658BAC6206E2BC89F
5A1E0D2C436310B715E48F2BFF01D80D8D41DC568C3F19DE2C3F032C33C2206E
FB4E568CFF9F15DF03CBC1B26747F094DB0AF25FAB3C092C0FE79E5C2D4FB9AD
14DF7F1A8CAC3F0DAC783FB0A2FD3CE5B6FF3425F836CC73623C67F94EE914D9
74BEF37B2A4BF19FD47F37F5F6237C4F65097E7F3DC3E611BFA7929F4FDF6D52
9C43DFA6FA4D1452B2BB7ECF6939FF23EB935B59B0362F1D3E41F1146D9E07CB
FBDF86F94D80C8F2426027B0EF9FD0F094DB7E134081F6C7E39FC80AE49DA4D8
5FCB536E2B16FF20BF1279A735FAD85F23D80AF223CA0B908DFCB35A9E725BC1
F86F7B39C67B6723843D004CB9AD60FC135896D725FEE7B682FCAD65D8DFCE21
FFBC86A7DC5690EF599AD965FF81DB0AC67FEB4BAE0BB17FAC96A7DC5670FDBD
B6244DFF7E59785FCD6D05F9AB8B5385D83F5ECB536E2BC8FFAFE22421F6BFA8
E529B715E4BB1563BC9780FC042D4FB9AD20DFA528A14BFCCD6D05E32FA7A278
60573406715BC1F8636611C65B573506715B41FEB4A2687DEC2F88DB0AF22714
9DD3C7FE82B8AD60FC35A6E82CB0546CFBA91A9E725BC9F8AB08E38D34AD3EFE
D70AB662FC49F05A21C65BE95A83B86D39FF0FE4DF30D07714F42D87F7381859
F81DB0EB5A83B88DE7F975BA4FF8BB09B9F6DF9F62DE93CFB10BBEC00AA330DE
C4982F6B37C6FDDA4E914DE7E93ADD47F7CBF7FE81D6F4AFF2BF4939AF0696BF
17E3EE488CFB359D229BCED375BA8FEE97EFFD4B7FFDBADE9EAD1B8B79F01458
39C8CCD20829677B02BF2E7C5F6323E3FBA7AE7F9B438C1864DD4266FE6E218D
E9C27E56E6F76FDDE7E18217B0B203C053136C8BBC7F15F3B07EDC451EF7536A
826DB1F7CF028BDEB1BDA54F9F55E8FDB3F13EC0AF4CC5FD8FCA3FF0E1EB206A
FE7C9D45256589F9B3F27F3AFC9ABA3A8BCACAB7F2AD7C2BDFCAFF69F2959495
FFD3E69F3A77D62CC9C937273F56BE956FE55BF98FC177EA4BBEA93C2835FE9A
3AF2C257EAF276AD0073941FBEB22D6FE7F2777AF37741F41C738FB6B27CB8A9
5DD3921FBE7C7C5FF0E5C8436FF9BDCD8331BFEDF65568C9FCA147D13DC6476B
490EB68755AD7DC5A7839ED517FEFF39F11FC5FFA6EAE1E7C0B7A4FFF7ECD9F3
64646464B346A3015172F3E999616161B07DFB7608090969F6F7F7377C2B85D7
9C8E1C39D258565606A2E4E64B9FADD56A1BDDDDDD1D25E5FF363131F147A5F8
67CE9C810D1B367C4BEC43870EF5DBBD7B7773414181E17A717131E511A4F5D1
1BD1B3E899E2F373737361F5EAD5CD6AB5BA3F5E1F77F0E0C12EBE4F4F4F87C3
870F77C9736F44CFA2674ACF6DDCB8B171F9F2E5EF60BB0B8F8989E9905E8B8E
8EE6928BDFDDF3A2A2A23A56AE5C19F6F9E79F576667673F34BFBD5177FE4C4D
4D8555AB5655765757C6E7A8DFECDCB91342434321282808B0EF808F8F0F6CDE
BC19B00E01DB32AC5FBF1ED6AD5B076BD7AE85356BD6D0B361C58A15F0D1471F
1984FEE6929EA3E74BF3656C77A7929212282C2C046AB379797990959505376E
DCE0E5A472252525752BE225272777B11F976FCCA6BA23F6F5EBD77B64CBC5A7
7E74FBF66DC8CFCF879C9C1CC8CCCCE4ECB4B434484949B128BF3BBF67646470
F6C3CA2EF28C6D635E64843C6DAD3BFDF52FCB1FE047444418D8A5A5A57053F3
57B0D441CF36E653DFEA4BFEAE5DBBFA944F75DD977C5A0F886C6ADF4AF3B76D
DB46EB11435BB734DFB84F18AFC52CCD7FD8BA93EEB1A44C829D42DE667343DC
D99CA0C56C56E82045FFC355E71D7BFA2FDCD5F4D4CAA88E818BC275CC29B89A
3904BCA9081CCB3DC065976EF41755F0DBB05C18E19300835645C1138EC12DCC
31F01D8BF3D1E7FF86E526B6FDC1BACE3CACFE5A993C607D0F740DD73DEF7311
FA240FD4D69C82AB06AD8E8247CD83DD86007B1B0FDFD764CB03B535A7A06662
3D2C0F2A8FC037066F0A6C1BAC0E4996D50F54BE87E461A06B509BEDA6A0D697
8FC5C210AFD096C1EB837EA7541E9EDB7206907DEF95BFC7C198A402F88F2FBE
6BB75307ED90BF3F06BDF58453B04EDA1E46EEC906F477FBA8E371F04EF22D98
9E5A08EF5ECA86219EC1BA116AF53F5B320FC3B79C467668FBAB27136042CA2D
78FF5A11CCBB5E02F32F95C22F5FB8D4D1EF99CB45833D7CFF207B3EB02E787D
7B06DF1B8DECC929B761565A112CC82881458965A07A251BC7F20CF8E5D094FB
2F054434D87904B53FBF797B9C6AA3FF2239F2C2DBB967708B3DB2A7A4DE0687
F4625874A314DCAE9481ED2881FDCC886CD874B5163E2B6D84B0E23A5813970A
7F0E3FA01BEE15526DB729D08D3178C21C36F56FEA63F6C7E3612AB2E720DB15
D94B913D78540E673FFB42367827D582B65C075F5436C3D7D52D70B8A6150E55
B782EFF50278353452F7BC7768FC50B5FFB0C7E5DB6C08188DFD2BD9CE2BA4D5
FEC0F176C72BD9B0EC6A57F6D6E45AD85BA1436E2B7C5BDB0627EAEE701DC3DF
746E4F5913387F77BE7DA85770D3508FC0B966F9C1DDFF253B75C8CE21EAE026
6A6BC4B679311B7C53EB613F9699CA7BB2FE0E9C6B6C87F38DF7E04CC35DCE3F
58D50291E8976D250DF071720EBCE8B7AB79983AE4F0739FFA9AF57F99FFFBEA
1DBFE8F74C62E9BF0E4BF9D127A58EB38F20FBFBFABB7041770F2E37DF87D8A6
7B700A6DCAD3DE8A66DE26FC8BEAC1A3A0063ECE2A833FEE3FDA86E5D0D97905
7B0E5DEFF3CC63B7C78DFE2E63F71C6E229F531D53B9639079B9E53EC4E93AE0
3496FD6F356DBC2D84A1EF0391ADBE550B9FE457C18AEC0ADE76A72564C2CB11
512D433C71FCF60E8DA67A7E54BEED26FF09F63BF7D57F85BEA5FA265F47239F
7C4FE53EA26787233BA8B81EBC90FDBFC8FE4B4E052CCE2C05476CC3D49669EC
1C7D310B8686EEBD6BEB1EB0FA51F94336063D3F62CBB6666A5B54C727B0FCE4
03FAFD4DB5E0F35DE873B1DCC6EC6938668E45F6EF2FE7C34B1773C0D6775783
ED46FF3F3D7205A8D5FF64E711D8BEB7B41E0E611D533D535EBEC432535BDBA1
AF6FCF5B35DCE7A6D82F237BD8A92B80E35A2D3EF3B1FE4F562CFF8D4D29B9BC
FDEDAB10B854E690E206D85A5807EED8D6FE27AF0A966797F3FA9E23F1B9C81E
7E210B6CC3BEC2793478CBE3B6C1E15EC19FB91C8FBD4FED6BA79EEB5754C7FD
FDE9CD6AF838B7123ECC2A07978C52989D5EC4C7CDB7AE16807D621EF7F93064
ABFE9E80650FAA37A72F627B796FF48ECF1B02D0CF3E585EAFDBB5B0A1A01AD6
E609FE76CB2C03679C1F66E03C3111E78B3F5FBD09A391FD1B640FBD900936E7
D2C076EBCE661CDB179A330E0CFBEF907F19EA19D4F6697629ACC7F2523DAFCE
ADE065267F535DBF7BAD10C6E11CFDA72B3761D4A55CF8753CCED3B1C88ECE00
55E89E169CC7F7F5665E1AE61D7AE2BD93177E5C85E5FD08EB99DA9833CEC733
D3047F533B7B1DEBFA95845C78212E1B6C636F60B9D341B5635F0BCE67718FDB
E61E1887DC0326FF3A20BC89B8F3D1D70E58CFD3B1CCE3B1CC6FE8FD4D75FD5C
5C16D8C420FB4C32D8FA853563B98FD038DAFB85013C81F352C1F83389DCD713
714D32465FE6917A7FDB89FEFEF2E47D5B75702BCEA51EE6CEC5DD8FC5017386
FB85E9C66079FF78251F5ED597F9792CB30AB93687CE81CA374C87EC24D9D7A8
E278E81512FF9B0327EEFD3601E7372AF3C9CBA0DA7BACC3D63BB459E51592A2
72F77790B3CC0FCCCD1B8387DBAA831A86ECDCDF628B6B712C6B058E697B1E67
4EE9B50F36FABF6EEBEEF7A1ADDAF745399EE7F6E132588A32A41F2C83251F2C
15B4CC0D169396BA81EBD225E0EAB61816A1162E7185858B5DC165F12241AE0B
6101AAB77C37297F99944FEC250FB25D1771EE82452417B3F84BF5FC7BF7EE75
517B7B3BD79D3B77A0ADAD0D5A5B5BA1B9B9199A9A9AA0B1B111EAEBEBA18EBE
B1ACA981F90B5DB8CCE553B93B3A3A0C92E6E1EEDDBB3C0F225FA7D3717E4343
8381EFBC700138BB2C30DBFFC67C310FC6FC9696966EF9F35CE673F5967FFFFE
FD077C20F2A90E443ED581C8AFADAD85B90B9CB9E4E08B7930E64BCB6FCC779A
3F8FCB9C7E21B679916DEC03B10D9AE293FF1D9DE77299D32FC4FE66CAFFD23E
605CFFD407A8FC73E6397199D32FDCF463CDE3B43F63FF3BCC75E432A75F88E3
DCA3F43F69F9A5E574709A03B351E6F40B1AE7688C239E29B674FCE98E3FDB11
F98E0E66F50B29DF78ECEB8E2F32A4FC59C89ED50D5FEC173DF1C5F15D649A62
4BEB5E2C3F31387FCE6C2E53FDA247BE7E6E239E54C496D6BBE87B69F945FE4C
64934CF58B9EF9C2DC26F24489E596D6BBC896FAB8BABA1A663ACCE632D52F7A
E28BF33A71A44CB1DCC67E179F2FE5CF7098C565AA5FF4C8A7797DC962034B2A
69B9A5BE95B27BE28BFDA227BEB8A6209628628A32C5A6E713BBAAAA0A66CC16
F8A6FA458F7C9A3350C43116718DD9E2B345B6946FAA5FF4C42736CD19C41059
5249B9F45CA9DF3BF933791E4CF58B1EF93467E17C45FFCE58C65CE372932A2B
2BBBF8BFBB7ED1135F9CA7A51CE96F2957CA262EA9A2A2C2C037D52F1EC6A7B9
9A18DD49E476C736F01D3AF9DDF58B1EF9FA7502CDD3345FD27C45738693F33C
709C3717E6CC7512FA31F6256ACBBC4ED1A7E2B345CD4499EA173DF185758AB0
4EA0B97ADE02E4CF37E63BF27184F7277D9B12F33053149E33D52FCC5917CAD9
2FCCE2CBD82FCCE1CBD92FCCE5CBD52FCCE2CBD82FCCE1CBD92F8C9FFDFF2E2B
5E2A
4C69020000004C7A0C0000001800000018000000561300000000000078DAED9B
0B5C8C69FBC76F87DDB5BB96B2E960E510B5ECD161EDBBCBE7B5540E593AD0A4
922467E1BF2C5684A2289D4B65264DA17F122AD2413A089D54D2693495166151
2A87D212D77B5F53D33BA651D3F4B4FFF7DDFF3C9FCFEF33CF3C87EF753FD77D
3FF7F57B9E29002020975C322A3535F56D15642BA756154DA1EBBDDAED93416F
2D0AFD54C886196CE2B5A0917EEB47985D7A915FB583BEBEC069500E5A01F4FB
40C6C80AFDD4289B3B2A2510569467C1B8C85DA014BC0A944264D49135F091FF
A22AA231E87BA2F8E108F28BEEA9D149BE4DA373234033271CBE2D898331BC38
18CB8B974DA58930F8EC5E201A8A73698CD90AA76D5F0FBB7E12486620154744
81B2292B08C8C92DC837242AFDBF237B8C32C8258F6672ED30903CBA1F3FF383
6457413090A8AD2D7C420610F581F388834126C93908A4840B24CE8EEEDF2CBB
CE50F661AB2764A4E26CCAEF4DA548943F9E4502165790A20020419640F76DA1
F137C9A88DF47C2BF241DFE16D639390FE8218CE0B7288BFC91BFA7D188EAC6E
A83F55DFB7C63F5EC7C841A664A6969F206FCC2FBD5B63AB52BDCF0470DAB469
3D2AF91C2F975C7249ED7F64532F816742EFD491FF917DE927F04CE89DD04331
BF0C44CF84DE093D546B2D6959460DD2F92860D14BF42C32FB1DEA95D033A177
420F258821BC0E0D457DF42AE85964F53BE895D033A177420F45BD5403F91F1D
CC95AAC043A05741CF22ABDF11F34CE8A5144ED936526FA523E0A35741CFD21D
CF23EA9DD04BA1A752E93F91C63020C14B9B059EA53B9E073D137A27F450E8A5
D053A147E8D75793C658D30DAFB349E095D033A177420F853E07BD488B5F78AF
D58B74C7EB0C23012640DC4D2A89EA2746ADDEA71783E37F00F54C01340F9674
5D89613669F54AAAAD39E923F73F72F5B4DEAE1E7DFB13D309B663426C9E90CD
3AC1926A4837F8BDC8C2F1DBBE8E72A9FE959F0B3A49DC06B26EFA21F11832F2
7B919F35AD879E76AA37C83B0F8A4947616A760CFC9048EBD4A6E96FD5A92EF3
FBF555208B26F92B443ABED2BE9608E43C9DDB13E9FC9BC881AF32A3412B2504
C8165D2E51F8505526FEA84F67107FF35723221D4029720F8CC93C0524291094
D28EC198447F1841B711F6D24632437323CE9332B45F93D6661B3AFF6EF93C78
35E81727014966C3E75911A07FDE0BC814F54374FF7AA2F8E10F38E7C890FFF7
5BE7ED615A216B605E09E5A7B241EB6A04CC4BF4A6CFC70AE6ADEF58F03D4EAF
6E8C1F054DCAFF997701481A9BD6F008F8F9BC806FC8D0F8541845F9B378B48F
2FB36154EE099875DE9351FEC890D5A0C34B0072850D23F3C24127C19D51FE70
CAFFA9341E48061B86E787C34F096E8CF2D5A9479BC28FA51E890DEAD78FC394
04577CFFC118FFB3E095F00F7E0C90AB6CF8AC300CFE91E0C2285F8DF227969D
A5FE890D6A45FF0B13E39D19E5AB04AF806FCBA3A93763834A71287C1BBF8F51
FEE0E0E5F0657914F5906C18CC3B065FC63B32CA57A2FC311591400AD9A07483
CE3F0CF30751FEE84A3ABF15B36110FF188C8EDFC3287F60B0350CAF8C00C263
C3C0B223303CDE9E51FE00CA1F7A2B1CC88D4330A0E2080C8DDFCD28BF7F8835
A8DDA1FC320EF4AF3C026A09BB18E5F7E32C7EAE50E00B24D715FAE57B8242E4
A6263272D05C86F8FDC9740D07A23B3A84E88C3A4274A9B447B99281FDBE6088
8FEF30D12B8CA01AD9FA3984EA43A6F81F781A950CE5AE01F5A0553094BB1A06
F899B5BC7B67283F1A216BC18A970D93B3E2605E7E2AE8C679B5BC7B67A87FB5
82D7526E327D86E380D6A593302FC187D1F95F2B98D6F782648107D24A473EB3
F55793F2E714D0FA9E48EB7B7A04CC89F762B6BE53FECC025ADF93687DCF3801
33E319AEEFD45F6917D2FA9E42EB7B563868C7335CDFE9989C5A48EBFB455ADF
B3C3616A1CC3F59DBB0A2617D1FA7E8903EA39C761721CB3F57D0877254C2A3E
07249D034372C360522CC3F59DF22794D0FA9EC101B5BC309810CB707DE7AE80
6F78B4BE67D3FA9E1F0ADFC4325BDF95B8CB612C8FD6DF1C5A7F0B42616C2CB3
F5F753CAD7BA719ACEFF6CF8B4F01868C5EE6594AFC85D061AA52705FE47B1E8
2868C43A305B7F295F9D4FEBFB75360C283E0AEAB1CCD6F7FE5C5A7FCB68FD2D
A4F59747EBEF3906EAEF900113C99A1F53C9CAEFAF7C1C6809CA6561408A38F0
F18D10503EBB1DC8FA1F8A05FB27A95BCBF47CA4FAC978E2CC4A27D77C9B4979
30F526F4D994C769511917089FEAF08A32326E88B18CCF77F8BBAA3ED9639049
D03BF00FD3186C20A5344EB13F90E3360FC8572ACBE97183657A3E15FD5DF590
450529A2312A688CD24340C229FB87E19BE97E65E16F9832BF1F10FEAEEA6898
4932F735138E55456BBB95BBF57E40FC77D5610AFAD4F7F891AF5597B7FA95BE
0C8D4F61AE06B4FA9E41E2EC8EF8A12BBE039499D933C6246462DCBF0BBFA6B6
9631C9F972BE9CFF36BF27F477E4C725274A2D59F9D2C692F3E57CFAC9EA49BE
780CA6C7BFA4A53CC0E659B9DF1AE84C1501362FCA7D574FEBEA8FB978AE34CB
8BFB157093F34B4345C06AED9EE0CB1A43C87F557F1F1A781724AAB122BD2D46
E35D3ECDD5BAC6AEF2DFBC6C84978F2AE0E5C3F2767A557FEFADEBC0737A223F
DDE177941FA1F098CEF81C0EC781CD668350D2E44720BA0F8F11F24519070F1E
7410F2838282F845454570FFFE7D8164CD8FF0FCFCFC7C7075752D45B6BFBFBF
62606060D3DDBB7719E3575555C18E1D3B9A366EDC3888E6C6243232F289705F
4A4A0A641F7313B4A12BC273F05C21E7C081034F56AE5CC90A0E0E0ECDC8C878
23DC1E1E1E0EC5C5C56DC7492B3C07CF157E8F8E8E7EB361C386D0C3870F5797
959509B65556560297CB05D15C49AB7BF7EE016DAB8081DFB13FD7AF5F5F2DDA
E734576F8D01DA37E0E3E303EEEEEEE0E2E2024E4E4EE0E0E000767676B06DDB
36D8BC7933FCF2CB2F60636303AB56AD029A0F58BD7AB5E05328E408DB20BA2E
AE3B77EE08DA86D7CAE3F1A0B0B010AE5DBB06B9B9B96F09997979796DEBD2F0
315FB76EDD828A8A0A282D2D15E4FAFAF5EBEDD842A6E87A677CCCEBEDDBB7E1
E6CD9BC0E7F3A1A4A4040A0A0ADADAD8193F2020A08D13C8617739DFE2DAB0CE
E62DBE9F9F5F1BFF267B037477418628DFD7D7B747F9DEDEDE6D7DD8137C0F0F
0F70737313E49B29BE687F88CED34CF1DF5507701F136A0736F79ADAC7D4EB74
EF851E6EC4D05381D1BF5CA3ECFEAB8ED68CD89F098A1B229A7BB13C6E1196C7
68A6F07DCCBC4F217B42582D687917C1E0AD67A1B789471553317A2F7477C776
235B10C38BE11834DFBD167ADC42E6BB62A8DAEF1FA16CEF9E46ECEDFBCA1483
32688CDB9262BC67E1FE40CDC9A76A847F58A39A83FB0299AF43420C4D8FABA0
E6E8F77442723E4C4BE781FAFE8357BB952B53CF11BD4C3C7EC718A33DAFC2D0
FDEC27DFA75C07BDFC5BC02AAA8261EB221FBFAF956ADAAD18F43ADEB770FB03
DBFD43EA75987BFD369817DF8559FEB7A1F77BC53070DCA5464D17BF4A4D67FF
E3CA3B5D7FEC2A1EFB728893EFDDC9170BC0A0E00E2C2EB9077303ABA0CFFBC5
F0D9D765B0AFA416387F3C853D853761F6B1A89ACF9D0FE6A9DABA7D21357F8F
E745CD43C71BE664F1C192B2F50FFF9BED76A31E8E3E7C0EA76A1A21FAF10B38
5DF3023CCBEEC1381FEEC391FB0EDA11029DFFDD2A1D836ABB5C8DD49D7C3247
AE8B7C84391936BE0CBCF8F5105EDD00E7EA9A20F9C94B48AC7F095134C6111A
CFBBAA1E0CA2929E8DDCE79BF399BDCB50A9FFE8F5F3A4458AE32F37B6B01B21
BEEE4FC878DE0CE9CF9A05EBC769BC43F79F82CB9D3AD87EB31A166596BC19E5
16F887BAA32F7788EDBE31D2C4F8D28D5D15FAA801626A9BE0E2D3577099B213
28FB048D17F8C73370ABAA03BBCA1A585FF650904FECB34909D96F86798554AB
EEF5F4E98CFFB94B4005B2908F6D3E433FC3683C36ED6357CADE49D91B287B09
EF1E1852F6F4BCDF614276050C3F95F246658FD7F6CEF8630EF86705DDA915B4
17F311FCE039F8DD7B02CE34273B04ED7ED0C6D6A6EC89943DFA4A29287B043D
50B63B30AA33FE68471F874D19856F3017FE34D7EEB42FF7DE7A0CBFD17CAFE5
3F008BD69C4C13B4BB5CC01E7C2E1354F77A5F966ABCEEDC3F4937F44CB52B6D
AFE3AD5A419B37963F841537FE00337ADFE1FD3735B712C665958306B2538A40
79BFFF4315FBFD1AD2DDCF117DB40E04DCC3F1B1A9FC11ACE1B7E463416115CC
A2F3C6E49C9BF07566198CB87C0306A716838A77C863557B2FCBAEDCD323F7F9
1C354ECB7FB394771F1616DD8579B4CD98EBEF69AEC766F061E825CA4E2E0465
4F6E8D8AA3F7B6AECE19D84F637D421E609E675CBB0553689B311F986BD5341E
0C8EBEF25A659FDF7D353BB7F9B24E7B439D7C13269EBFFA7A626B9B87613EA2
AFD036073F5476F48953DEEED4ADFF1B1962EFA684F3DEB0E84BA0C289A855D9
E77B5F75AFCF09353B97B14C7901157B576D6527EF83AA3B0FFCF4A5BD7D97FE
BF70E9F265B074B9759BAC96B568C9B2A560696D05964B97C062AB2560616509
164B16C322CBC5606E6901E68B2D403ABE35BC7CF9125EBD7AD526FCFEE79F7F
42535313343636C2F3E7CFE1E9D3A7505F5F0FB5B5B5F0F8F16330B35804D2B6
1F99CDCDCD6D128DF1E2C50B6868688067CF9EC193274FA0AEAE4EC0375D642E
355F942D1A43C8C76B10E72F3437958A6F45F383BCD7AF5FB749942FCC91389F
65B650AAFEE8888F397A17DFD8D444AAFE90968F7D2CCA5FB09025557FE05894
263FE2FCF926C652F5078EF38EFAF75DF931622D68D71F12F9D64B651A9F86C6
F3DBF58764BE55A7F717F245EFAF9A9A1A305C30BF5D7F48E2E31C802C640A25
648BB65D9C6FB0C0A85D7F48E4D3F90559282157C816F6AB786E24F1B13F24F1
17533E729027640A7322648BCF3DD5D5D56030DFA85D7F48E2E3BC881CE40925
CA15B245DBDEC2376CD71F12F94B2C050CE40985DFB16D2849EC478F1EB5E363
BE24F117D139048F438932855C614E44F90F1F3E14F0C5FB43229FCE4FC89024
712EB61BD92D7CA376FD21F1319BCE7D428EA8844CA184EC070F1E0884ED15EF
0F897C3AAFE2DC87F3D3427333C17D8EF7E2021316CCA763CE888E0BEC3BE489
CA904ABC3FA4A907DDE90FA9F8DDE80FA95E7B74A33FA4E277A33FC87FD1B235
70C94A49B2655B8D6182BFE3E88A672157FC41549EB1BB016330C1DF1DBAB63A
F95622880A63FC9DF85B022DFEB92B746DA4B87684AC0863828FEB87925D21AA
30FC2DED3CB6AA8E293E6E133F0ECF95F3FF6FF9DB02974CB4E55A37E0BAA870
1BEE6382EF11B3AB1D03B7C9F972FEDF858F354DBCCE61ED438663C4C6763510
B7E13E69EA23D6E277D5E95FD9664AB2EC63AABEFF272C1DE5471A617DEDCC23
49EA5F698475156B75677C49E3531A619D96F3BBCFC7FB50BC064A23F4489DF9
30BC0FF15E9746B27A789C4F70CEEA4858D365E54B937F69FC8A9CFF9FD7BF7F
C5F894F5FE9224644953DF6595B4FE41CEEF7E7D94A4AEF81F59F557F91FB6BD
FD476CE7DF86F5143FD06DDBC4C3AEBF71E4FCBF866F6F0FBD757573347EFC31
E3C39EE0CF999313C76215D4CE99935BAAA717F701F24F073A4796A49D195F94
16B58C9F1AA35472E9AC01EF5294E18DA4C84F711BEF52CC0469F7CFD1CBA9F7
F07801C6C6853533666469229FEBB5839B9B1BF3119E1B1111D1A7F0F2394514
AEE336DC27CD7E0FFB84D1B3675FAD9A35EBEA8B9F7FCE8DC55C75961F3C861E
9B40AFBB6EEEDCDCBDEF3A6ED6AC8C413A3A99E93A3A19B3BBD2BF3A3AD95A2C
56611D5EB39E5E8EC4F75953A65CF984B2537574B28CBB3A7E66CC481FA7A797
DB646C5CF0424F2FBB9E32BE11676B6B675ED4D6CE6075757CCE9891FD1DBDDE
6264E298D3D3CBFA82B633936EDB43F3154EAFA7585737A380F2F5BA3AFEA74F
BFFA256515CE9C99FE95E8F669D352FBD1ED315656FCD7BB76D5001D8795D2DE
5F385EE9751A51A6296D5311C690740E6DF3787DFDFCA74B97963751FE1169F9
73E7E6855B59953DD7D7CF6BD6D5CDEAF06FE9A64FCF9A48F36448AFA76F67FC
28EE8198928BD1FF3437CDBEEFE0500BD6D6FC3F9D765E0828488F542E4E3B63
C74B3B3315F7E37A496AAC6AF1A5E8E5C517CFAC9066BF68FB67CFCEFA868E95
02DA77619DB54B3E3FCBF9427E90EBB61B188369A12F417F82317A42C8FE6F7C
9F14C162F549D83E5FAD27D8E776184C3EBF6B7ED5B91DFA9DFE7E146F673027
C99E9596B0CB6869A4ADD1A71D1D9B6ACFEA9FE4601C72D965F1E3027F1BE88C
1F6767382AC9C1A4FACE899D50CC59FFF2A2A3D9E36407D68D0B7B4DEC719FE8
B117EC4D4C92F6B01E961FD9D25C1FEF0AA5C19B3AE49FDF3CF3E34407E3CABB
2777031E2F54F5D97DC00FF9F54DBAEB923ACABB9BE2641A94BCC7E44AB6E7F2
67D567F7B71DD7111F08E97561F7820BFCE05F5F8AB2C5551BEB02BF87D9C29D
70BB76FB3AE227EC3676C9F359F5B42376677A173F61E73C934BCE1635757107
80697E9CADC117171C588F6A62F6778B2D897FE137D6C0F3BBE7FF7EEF947DB7
D9B5F107E002771D70F61B3BB7DD13B6F396151E5AD7247A5C4DBC0B44456C81
83611B20EAE456C889DC0977CFBDFBDA7E8F7182487ADCFE636BC1F1F80670F7
303BF6EF7B4E7F255E93F0D8BCE8DDE01CBA1682D3BC20961F0DE1395C084C3A
009E915BC1256C3D049CD8046722B7437ED42EB81C6907DEE194776A33846672
20B1324EF08C2A897FEFDC3EE0866F04CFD35B05DC773D3FC7F1CFD098C11094
E40241296EED8E15E79FD9A1BF3A22C4069CC3D6C1A96B4719797E17E57B789A
847846DBC2F99B718CBD1F10E5BB78990730FDFE0199F2F733FF3FDEFF6CE35A
6B6C39BC98C5A490F95778897F01DDDD5BDB4C7A0C0000002000000020000000
721900000000000078DAED9C09581457B6C72BA3316F3293899944708D49E6CD
97E425931893596312954D6394457117C56D348A9AD1A8EC8D0BC8EE3222CDE2
169588CA2282A031ACB228A220AB202A28AB8ACAA62839EF9CDB5DD834DD084D
7591C9747DDFFFBB7DABAAEB77EEB9EBB9D500001CE8A4934E3AF582D41C7D39
8F2FA3389F8974433F4EDCA30FB7D9308C3BE2069CD797C47F455CB6411877D8
19ECCA0B81733724BE9E68EC4DC83EE20C338B526043793E701B3E05CE752C70
6E06020ACBE46E0258BF27583DF3F5BDD928910B73867925A9C0FDB80BFE5D59
08132BB3C1BC3A172CAAF304D3E49A7CB0BC5B827C13F2ED4BA8E7398FF1B7B9
2817987F2D0DB8E400E092A4287F054985133D3F7D1FFAC098F80350FD398F71
F07E512CBC701ECFA7076A5941C0657D27AB0359DB7A8D73189BC09D7401EED2
1EE032F19EF30132D167A17501F939EDF854071F70EB3E4FE46225C0E5EE052E
3B4826FA9CBF5F581520BBF87BACFFF13CBF2FF301C78D64369C423F1422B708
EB6223B57DACA72D26C289B57D643B1BA5C8EB5FD6F7146D88471BCA4264F773
DC389481C0FA02F59EDCF75C471BBE48E4525D81F39C40FCB7E57E125203E4EC
BE1DC620990D1F73AEE36E723E93C41CFF146DD0637EE0B88F441EFFF9E379D4
CB6C6C107FFE13F5D0AD8174D249279D74D24917FF0B7CF4637B08B497D071AD
29C6F10ADB43A0BD04DA5390AD2DC53CF4680F81ED251C7606B6B7D0D186E739
AFAFEEB1B884627321637DDA3BD8F029DB4BA03D05DA5B607B0CED6DE84FB138
C5E4149B0B19EBD3DE01ED21D05E02ED29B0BD8530B2A15D5DE8B1589C62F2B6
D85F2829ED21E0F3D91E4314C677AE267C9BD463BEA7989C62732DC7FFB4C740
7B0DB4E7208FC1647C8AC92936D746CCAFB89F407B0CB4D7407B0E1CF77BC6A7
789862728ACD858EF795F713688F81626CDA73E0CBEFF9553DB3C1DD44D8589F
F60E680F81F612684F81F61664EC91F238B7AF3CC6A33873AC16E2FC71CC0EDA
4BA03D85B59F2728B0FB28C49AFDB510E3EBB1BD03DA43A0BD844DC6B7595CDF
9EADFDF18FF6103CBEBC8F9FFF8ED217790C7E455EB77F460D96FB5ACCA39FBC
6EFBF7025B17FFEBA4D32FF5FDDC16E308CE83F6C631ED646DAD05BEEC1DD941
47286C790294AA59D76A832F631F72841377AAE08DA4A32CA5BC3A1B04E413FB
2817E204BB2AAE0217236D13CBE379553608C47F1ED7E8155CA804D65ECDC635
14AEE5E24881B214F3EC3C5EE75C8DDAD920001FE3930977B8083798569C89EB
785C479D0E94E987A0A79FF13CBB8EF7716EE363F8362900BF3F8B21298EA3F6
BEE933D85B730D99E8FB1F0258CAF2789E5DA7FB64EFAD5F128CFF747D388E73
1B0B41B5D7918D31C519294B591ECFCBDF158D91AF6D5F1688DF4FBE8E91ADE7
9013781B793F223F5ECA529697F1F97745AFF0EF2D04EE7F7AC491122F1EF909
52964A9FF2F5B4DCFFF528AEDD5E83FD2D01F9895296B23CC5BB22F1BD6A8A65
3165B22CC6647911F95BAA319E4E467E8A94A52C2F22DFA53A1FD9C83F2B6529
CB8BC6370487EACBC0A5213B2D80A52CEF66281A7F6D358EB5E958FE74294B59
5E44FECAAA8BC065203F43CA52961791BFAC12C7F94CE4674A59CAF222F21756
9E03EE02F22F4859CAF222F2AD2AD380CB427E9694A52C2F227F7AC559E02E21
FF9294A52C2F1ADF082C2A9281CB96B689E5F1BC58FC499589C0E548DBC4F222
F2C755C603972B6D13CB8BC81F53791AB83C699B585E34BE317C5A19075CBE7F
9B58DECD5834FE5FAA4E025784652FF46729CB8BC8FFA83A1AB8629C7BAE04B0
94E5C5E2BB8F87F7EB62812BDF075CD93E96B2BCFB7831F8033867C314C67233
792ACAD3F9A7BFA7D216FF25F9EFA6BEE8C2EFA9B4C1EF2B670CE8E2EFA984E7
D3EF3629CEA1DFA66E3194A5946FFF7B4EEDF91F596BAE15C0EAE21C58836229
E6990DDAF7FF006E8B010456DE00EE04F6FD135296B2FC160310A1FDB1F827B0
0A79D114FB07B094E5458B7F905F8DBC58A93CF697CAF222F2FD2B4B918DFC53
012C657911E3BF6D9518EF9DF297ED0160CAF222C63F9E15C5EDE27F961791BF
B902FBDB19E4FF286529CB8BC877BE95DF6EFF81E5458CFF6C6F5E96C5FE8901
2C657911D7DFAB6F66CBDF2FCBDE57B3BC887C9BF28BB2D83F2580A52C2F22FF
9FE599B2D8FF6C004B595E44BE7539C67BA9C84F0D6029CB8BC89F5596DA2EFE
667911E32FCBB214E0CE49DBC4F222C61FA665186F9D97B689E545E48F2F8B97
C7FE32B1BC887C83B233F2D85F26961731FEFAACEC147017B1ED5F94B294E5C5
8CBFCA30DEC80E90C7FF01B2BC687C23F8E806C65B39016D6279EDF9BF1FFB0D
03FD8E827ECBB1610CBC7F2312B8CB016D62793CCFAED37DB2BF9B106AFFFD65
6E83F1192EC90DB81B21186F62CC571084717FC053519ECED375BA8FEE17EEFD
03ADE93F647F93F2A304B8923D18770762DC2F7D2ACAD379BA4EF7D1FDC2BD7F
E92B5FD78FE4D67E8E3638CB5845C82C90CA52C67606765DF6FB9A0102BE7F6A
FFB739C44840D635649604C9D28476ECD7047EFFA6DA862417E02A0E004BD5B0
B5F2FE95B7C176CC5916F753AA86ADB5F7CF3216BD631B254F5F13E9FDB3F23E
C0EFD5C5FD5DE51F58F409F09A31A35EAB5264F1F6E9F83F1FFEEDBB77B52A1D
5FC7D7F1757C1DFFE7C917533AFECF9B1F73E694461292AF893D3ABE8EAFE3EB
F8DDE05BF6265F9D0D628DBFEA8EE25DCBEA8B772E054D54B26B5973F18E25A3
7BF27741F41C4D8FE68A12B81AB0AAB164D792B1BDC117C2869EF27B6A8332BF
F9FA7968CC3FDDA9E81EE5A3E96611B687E54DBDC5A7839ED51BFEFF25F1BBE2
7F75F5F04BE06BD3FFC1C1C12F0506063648A552E025349F9EE9E7E707DBB66D
031F1F9F067777F7B6DF4AE135CBA3478FDEAFA8A8005E42F3159F1D101070DF
C1C1618A42F9C3D3D3D37F128B1F171707767676E1C40E0D0DED131414D4505A
5ADA76BDBCBC9C6C04C5FAE889E859F44CFEF957AE5C011B1B9B068944D217AF
8F3974E8503BDFE7E4E4C0912347DAD9DC13D1B3E8998AE7ECEDEDEF2F59B264
34B6BB5D0909094F14AFC5C7C73309C557F5BC90909027CB962DF3DBBD7B7775
6161E133EDED8954F9F3E2C58BB07CF9F26A5575A57C8EFACD8E1D3BC0D7D717
BCBCBC00FB0EB8BABAC2C68D1B01EB10B02D83ADAD2DAC5DBB1656AF5E0DAB56
ADA267C3D2A54B61F1E2C56D427F33299EA3E72BDAA59C57A59B376FC28D1B37
80DA6C717131141414405E5E1E2B27952B333353A58877E1C28576F9EEF295D9
5477C4BE7CF972A76CA1F8D48FAE5FBF0E25252550545404F9F9F98C9D9D9D0D
5959595AE5ABF27B6E6E2E633FABEC3C4F39AFCC0BF417A6ADA9D28AAF9774E0
FBFBFBB7B16FDDBA0557A52B405B073D5B994F7DAB37F93B77EEEC553ED5756F
F2693DC0B3A97D8BCDDFBA752BAD47DADABAB6F9CA7D42792DA66DFEB3D69D74
8F36A5166CE9F30537D5C7819BEC359733F3ED2FEA3F5C9DBE3DB8EFEC9D0F5E
5E16F2A4DF9C5DF59CA5772D67E1F1A928702CF7F3B376D68FD85F03EFFA5D81
375C53A1FFF210786E8A772337C573B4D6F9E8F3DF61B9893DF2D0DDA736D87C
2F8E0D58DFFDAC76D50F773D0BBD6203B5354BEF9AFE3621D0551B06DB798C1C
E0E8F6916036505BB3F46A20D6B36CD073F4FCFB4027CFE681129F0B82FA81CA
F70C1BFA597935EB3B7935BD139108835C7C1B07DA7AFD9F5836BCBE290E90FD
F8BDE3C9F0596629FC697F64CB6089D776E1FBA3D7A8E72CBDEB15DBC3FBC185
80FE6EF9202A19465FB8065F5EBC0113D20A6190B377FD1B12C9FF68D386619B
6291EDDBF261742A18645D838997CA60DAE59B3023ED16BCF866DA933EAF6694
0D7474FBB3E076605DB0FA76F67E3C02D9C659D7C12CBB0C66E6DE8439E915A0
F75E218EE5B9F0E290ACD6B73DFCEF0D76F46A19BE715BB29EBDFB1C216C61ED
DCD9BB7124B24D2E5E078B9C729893770BACCF5580FE0732F6AB6F1482D3F93B
F0EF5BF7C1AFFC2EAC4ABE08FFD875A07E988B4FED60274F6B8E83E7346153FF
A63E36322A05C6217B32B2AD903D1FD9033F2862ECD7DE2C840D997720A0B21E
F65737C0F7B58D70E4761384D63681DBE552F8D037B07EF806DF942112F7A1DD
E50FB0F31881FDEBC260179FA69107A25AA69C2B8405E7DBB3375FB8037BAAEA
91DB04E1779AE1C4DD874C11F899CE05573C80E9913FB60C71F17E30C4D173AA
467E70707F7BB0C467C72089F7036A6BC41EF05621B85DAC837D58662A6F74DD
433873BF057EBCFF18E2EE3D62FC43358D10887ED97AF31EACBC50046F6DD9D9
3054E273E4F5F56E1AFD2FF3FFB5D9FE429F57D36FFD7668D64FAE597719FB28
B24FD63D82A4FAC790D1D00A890F1E430CE6C9A63D550DAC4DB897D58163E96D
585950017FDD17D68CE5A81FECE2ED3CC4D6F5D56EB7477BF7599F071F79403E
A73AA672272033A3B11592EB9F402C96FDD8ED66D616FCD0F79EC8965CBB036B
4A6A606961156BBBE353F3E11DFF90C641CE387E6FF08DA77AEE2A5FDFC9DD60
E48EBD7507D1B754DFE4EB78E493EFA9DC47E5EC5DC8F62AAF0317647F8BECAF
8BAA606EFE2D98826D98DA328D9D23CE16C010DF3D8FF41D3C6CBACA1F64EF35
FC8D4D5B1BA86D511D9FC0F2930FE8F3E15A99CF77A2CFF9722BB3C7E398F939
B23FCE2881B7CF1681BEDBCE7BFAF6EE7FEB72054824BF1AECE8D9B2E7561D84
621D533D932DDF6199A9AD6D97D7B7F3B5DBCCE7EAD8EF207B68CC39C071ED0E
3EB35BFF9315CB9FE7947585B5BFBD55322E95D9A7FC1E6CBE71171CB0ADFDAB
B806961456B2FA9EACE0739E3D2CA900F4FD0EE23CEABDA9BB6D70988BF7BF67
4525B652FBDA21E76E29BBCBFCBDFE6A2DACBC520D8B0A2A6156EE2D30CF2963
E3E6A8F3A53032BD98F97C28B2F58EA762D9BDEA34E98BD85EBE1AB17DF73D0F
F4B32B96D7E5FA1DB02BAD85D5C5327F5BE757C0749C1F26E13C6188F3C53FCE
5F8511C8FE23B28724E5C38033D9A0BF7947038EEDB3351907867EE3F3EB21CE
5ECDEB0B6F812D9697EAD9E64A152B33F99BEA7AC2A51B3006E7E8BF9DBB0A1F
A45D813FA4E03C9D88ECF85CD0F30D6EC4797C6F4FE6A5A11B7C4F7C159DF4D3
722CEF62AC676A63D3713E36CD96F99BDAD92758D7EFA55E8137930B413F310F
CB9D037ADBF736E27C96DCDD36D7611C72F030FE83C7AE07C49D81BEB6C07AFE
12CB3C16CBFC77B9BFA9AE5F4F2E800109C88EBB00FA5BFC1AB0DC47691CEDF9
C2009EC379A9746C5C3AF3B521AE493E9397F97DB9BF07F3FEFE2EBA555FE2DD
8473A9A3A673B1EAB1D863F2B02D7EF59F6179FF7AAE043E9497793896590FB9
0342CF809E9B5F3DB233055FA3F2E3A18B4FCA1F0F9C78FC6E2ACE6F54E6E80C
D0DB13F1447F836F839E8B4F969E83BB859065EE3037DB7B0FD39778DD1BB463
5FA33EAEC5B1AC5538A60577674EE9B10FECDD3FD177D8B2485FE2F69610CFB3
5EB400E6A3DAD2850B60DEC2F9322DB086B9A4F9D660357F1E5859CF8539A8D9
F3AC60F65C2B9835778E4C56B36126AAA77C6B45FE02453EB1E775645BCD61DC
997348B334E2CF97F31F3F7EDC4E2D2D2D4C0F1F3E84E6E666686A6A82868606
78F0E001DCBF7F1FEAEAEAE02EFDC6F2F66D98317B1693A67C2AF793274FDAA4
68C3A3478F980D3CBFBEBE9EF1EFDDBBD7C69F3E7B264C9F355363FF2BF3791B
94F98D8D8D2AF9D366CD60EA29BFB5B5B5830F783ED501CFA73AE0F977EEDC81
A933A73309C1E76D50E62B965F996F39631A9326FD826FF33C5BD9077C1B54C7
27FF4F993E9549937EC1F73775FE57EC03CAF54F7D80CA3F799A259326FDC25A
3ED674A7FD29FBDF62EA14264DFA053FCE75A5FF29965FB19C169693C11CA549
BFA0718EC638E2A9632B8E3FAAF8E653903FC542A37EA1C8571EFB54F1798622
DF0CD9662AF87CBFE88CCF8FEF3C531D5BB1EEF9F21383F1279B33A9EB179DF2
E5731BF114456CC57AE77DAF587E9E6F8A6C92BA7ED1395F36B7F13C5E7CB915
EB9D672BFAB8B6B6164C2DCC99D4F58BCEF8FCBC4E1C45265F6E65BFF3CF57E4
4FB2306352D72F3AE5D3BC3E6F6E1B4B518AE556F4AD22BB333EDF2F3AE3F36B
0A62F122262F756C7A3EB16B6A6A6092B98CAFAE5F74CAA73903451C65115799
CD3F9B672BF2D5F58BCEF8C4A63983183C4B518A5C7AAEA2DF9FF24D990DEAFA
45A77C9AB370BEA2EF294B99AB5C6E527575753BFFABEA179DF1F9795A91A3F8
5991ABC8262EA9AAAAAA8DAFAE5F3C8B4F7335315489E7AA62B7F12D9EF255F5
8B4EF9F27502CDD3345FD27C457386E5F4693065DA54983CD552D68FB12F515B
66758A3EE59FCDCB14A5AE5F74C697AD5364EB049AABA7CD44FE0C65FE14368E
B0FE246F53BC0DA6BCF09CBA7EA1C9BA50C87EA1115FC07EA1095FC87EA1295F
A87EA1115FC07EA1095FC87EC1E90EAD1F6B775B4B6DF7CEAF56A7F5BBADD3B4
C9B7DBB720C6FF8C2784E77CDF4107D203806CD0367F6F8A1F9CB97EAA83C806
1DFFE7C75F1764F5CFB54156EBD4695DA095A936F9767B16547945D8B66C8D76
79A42CD7A36B1EDBEF5B18AD4D3E9DA36BAABE43CFA267EAF83AFE7F337FCD6E
2B431C0BA033D13DDAE44B0E2EAB8F2D3E01AA44D7B4CD773968F340D53D24BA
A6E3EBF83ABE8EFF9FC8A7D84055CC40B104CF773AB8B441D53D24BAC6F3BB1B
7F504CD459CC4431D5BA80D9FFB0DD33BF42ED7D788DEEE9EDF84B77FCE71DCF
6A7FDD15C53314537595DF59FFD344144B51DCD61DBEBAF1471351DCA6E3EBF8
DDE1D39C41F39610A23D83EEF069CEA0794B28D17E4577F64C68DEA2B9B3BB12
6AFCA3B993E66F5A437445146B51BC2718BF9BED8FE23D1D5FC7FFC5F07BB9FF
F5F6F823F4F8DB9988A5EDF9479D88D1DDF84F4869127FEAF8FF1D7C21E30F75
D234FE1752BAF8FFE7750479ADBF16E4653FBCD7F89EEBEA76FBAE7F4BC7D7F1
B5798C1993F2B681419A176A85A5655E3F31F9E3C7270D30364E7FB0706149EB
E4C939CD2626E9FB15F969D1FBE7A5A686FE3A2F21E2B3A2F8A8D7F2E2C34764
271E7F3327F9D85BB9C9611F6625850EA06BEC9EF8C87100F05C7E52B8197D3F
2F317212FD1FB5BCA47083E2F498DF61FA97C294C8C19713C3DECD898F7AE7D2
99A821DFAE885F696676E981AF6F33B8B8DC0513938C5A45FEF9B81067F6DDC4
8899F9678E0DCF4D8A30C94F8A1A99931CFE31FB8CE7E85AE6E9D097731322BE
0690FC2A373182C5F7790991FF2A8E8979E17262F882ECB3617A971322CC894B
F6E6C5878D223B8EED3DB9C0C828FDF1D2A5A530756A6EF3B871194734F1FFE8
D1F17D0D0DD347191AA6FEA9ABBE9748E0570606E9C163C7A6E5191B9FFB1EBF
BFD1D838FB37DDE55B5A86F6C1EF9F9D30E17C13FAAF19CBE3D815B6A161DA6E
6C73E7D0F6FE3D69FF63C6A47F3C7EFCF9461F9F26D8B0A10E905FDFF937E039
2CB31FB273A8FDF5B4FF191A66BE6E6C9CF1C4C1A116962FBF416DA8BA3336FA
DCFF59ECAEF2657598B6C7C828ED1ADA50636272AED4C020F50632624D4C3207
29B711BC37A4339F77874FF54ECFC37ACC1C352AB9EDEF86274ECC7C11CF6F43
558F1D9BBA0AEDAAC47B9E605ADA55F6B3F9E4C754293E2F7FF4E8730355D74B
EA4CAC8BC73636653FB9BA3E800913325BD12F537A3AFEF27E542EB7AA03EBA3
E0DB6F2BC0DBBB09264DBAD880ED6EA226FC4F3F4D7969DCB8F321589EEB4646
19173B2BB7E281E535C2FED044630C8EADC964BB267C23A3735BA74FCF7B686F
5F0B13275E68C5722CEAEA7390F9DBD1A3D387525BEDEEFC9775FAC8AE821FC2
5E9D3D33B570D5AA72A0717ADEBCC29645F392037213C267D0188AE3F0373437
5C4E087765E37D62C42ED9F81FB18DE685DCA470C7CB8911C3F212C317D3B84D
F3028ED51373138EFF99CEE5A544BD9E9B18E9909919F522E6B72AF2E3C3FCC7
C5C7C7F75DBE307131B6DFE62953B29B8C8DD3EAD7AF48FE383BFED8D0ECB8B8
DFE42746FD91EEC98F0F7B9F71718EA294E6279A8FC8469A0768DEA279222F3E
7A20893ED339D91C11F62EDD4BDF51D7FE8C8D53DFC13667A1DCAF75EB1F1D5F
C7D712DFC3F60BB2412C29C69B2CFE441B4415327591FF7FDF11B976D2E0185B
534FB1B9A112CB7ED176932431F6A68F4E3A985774F7FB68B35D8CDDC44DD1B6
A67F954824DD5A5F44DB998D38E960967366E3B486FCE06F20CED1BCAA5B6C7B
D369B10EE60F337C163C8A75347F849FEFC538981E88B237358F5B63FC1B75DF
A36B310E66DB91FD28576AD35A17ED0137439DBBC58FB69FF4C94907D3E6B2C3
8E70EFA42753E53117C80D5CD19AE03AB33EDACEB435D6C9FCD209BB89EBD047
6DFFEB24C6CED42AC6D1AC2ED5D3BAB9266273DB77BBC33FB17EC22B687B457E
F0CA9FF8EF2BAB2A7C23E407AF82E42DB39BA2ED4D5BE39C2697A23DC9E8A787
57F67DDBE1FEAEF2A98EF13989193EF31FA9632BEBF6093728F96E1DE4F82F87
DB516E2AEFE92AFFA4A3F9B6C4CDD31BEF46BB4357F95D5157F8D1F666334E39
4F6EAE89DC2C28BB2BFC28BB892395DB9B58FC28C9C4D7621DCDAA0A767FF393
36D89DF1432D2DFBC43A989DCDDCBEE8A1B6D83C1FDB75077E9C93856BC2A619
CD42B7375E75273DE072A40BEC3B60031BFCAD1E77E0A34FCA0F3BA8FCEEB970
07D8B877216CDAB7180243564274E8B79019EE04374FB83E937BFDC46688C2FB
37EF5F0CCEFB1781CF7107700AB26E55C527DF287EF7067ED7FFD00A7039F035
1CCEDA07C7F38EC0813429F89D7205F7D07F81DD6E6B70DEB708FCD0A6C8C36B
2023CC01AE476D86AA982D9070CC16B61E58C6EED916E508872FEC851FAEC5C9
7E27FA0CFEED180F083FBC1A1CF62C803D89DBE0F4B558B5EFB3628A22E1FBF3
BB21F08C07F886AD0527F4D3FAE0B9B03DC28E9D3F5D1ADBE1FD5767FCDC4809
B8EF5F02EE475643645E68B7DFAFFD80BCD8E2A84EDFBFA9E2474A2C6AFDF62F
0527F4E7C18C40ADBEFF53C57791CE7DE21B690F27AF1CD7FAFB47557C3A27D6
FB4F557CFBDDD67562F189D5E1FDEB9EF955A2BDFF45968EAFE32BF3696CD7FA
FB7F64A8E2AF0FB64E65BFED1741C4D245A2B2E3FF017450A9F8
}
end
end

View File

@ -47,7 +47,7 @@ type
YMax : real;
YMin : real;
XProp : real;
Colors : Array[0..11] of integer;
Colors : Array[0..High(DATA_COLORS)] of integer;
procedure Bar2D(Sender: TObject);
procedure Bar3D(Sender: TObject);

View File

@ -11,7 +11,7 @@ uses
Globals, MainDM;
type
TPlotType = (ptLines, ptSymbols, ptLinesAndSymbols, ptHorBars, ptVertBars,
TPlotType = (ptLines, ptSymbols, ptLinesAndSymbols, ptBars,
ptArea);
{ TChartFrame }
@ -173,7 +173,7 @@ begin
TLineSeries(Result).ListSource.YErrorBarData.IndexMinus := -1;
end;
end;
ptHorBars, ptVertBars:
ptBars:
Result := TBarSeries.Create(self);
ptArea:
Result := TAreaSeries.Create(self);

View File

@ -943,7 +943,7 @@ begin
end;
}
function ValidValue(row, col : integer) : boolean;
function ValidValue(row, col: integer): boolean;
var
valid: boolean;
xvalue: string;

View File

@ -73,10 +73,15 @@ const
DEFAULT_ALPHA_LEVEL = 0.05;
DEFAULT_BETA_LEVEL = 0.20;
{
DATA_COLORS: array[0..11] of TColor = (
clMaroon, clRed, clBlue, clGreen, clNavy, clTeal,
clAqua, clLime, clFuchsia, clGray, clSilver, clOlive
);
}
DATA_COLORS: array[0..10] of TColor = (
$A1A45D, $3153C4, $0996E7, $4AE8F6, $A7A2B1, $84A7C9, $51798C, $87CDD8, $536508, $7BD8F3, $846402
);
DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond,
psDownTriangle, psHexagon, psFullStar);
@ -89,8 +94,6 @@ const
GRAPH_WALL_COLOR = clGray;
GRAPH_FLOOR_COLOR = clLtGray;
TWO_PI = 2.0 * PI;
TAB_FILE_FILTER = 'Tab field files (*.tab)|*.tab;*.TAB|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';
CSV_FILE_FILTER = 'Comma field files (*.csv)|*.csv;*.CSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';
SSV_FILE_FILTER = 'Space field files (*.ssv)|*.ssv;*.SSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';

View File

@ -9,9 +9,16 @@ interface
uses
Classes, SysUtils;
const
TWO_PI = 2.0 * PI;
SQRT_PI = 1.7724538509055160;
SQRT2 = sqrt(2.0);
function erf(x: Double): Double;
function erfc(x: Double) : Double;
function NormalDist(x: Double): Double;
function NormalDistDensity(x, AMean, AStdDev: Double): Double;
function Beta(a, b: Double): Extended;
function BetaI(a,b,x: Double): Extended;
@ -27,6 +34,9 @@ function Chi2Density(x: Double; N: Integer): Double;
function CalcC4(n: Integer): Double;
procedure MantisseAndExponent(x: Double; out Mantisse: Double; out Exponent: Integer);
implementation
uses
@ -40,7 +50,6 @@ uses
function erf(x: Double): Double;
const
xup = 6.25;
SQRT_PI = 1.7724538509055160;
c: array[1..18] of Double = (
1.9449071068178803e0, 4.20186582324414e-2, -1.86866103976769e-2,
5.1281061839107e-3, -1.0683107461726e-3, 1.744737872522e-4,
@ -117,8 +126,6 @@ end;
// Cumulative normal distribution
// x = -INF ... INF --> 0 ... 1
function NormalDist(x: Double): Double;
const
SQRT2 = sqrt(2.0);
begin
if x > 0 then
Result := (erf(x / SQRT2) + 1) * 0.5
@ -129,6 +136,11 @@ begin
Result := 0;
end;
function NormalDistDensity(x, AMean, AStdDev: Double): Double;
begin
Result := 1.0 / (sqrt(TWO_PI) * AStdDev) * exp(-0.5 * sqr((x - AMean) / AStdDev));
end;
function Beta(a, b: Double): Extended;
begin
@ -307,5 +319,21 @@ begin
}
end;
procedure MantisseAndExponent(x: Double; out Mantisse: Double; out Exponent: Integer);
var
s, sm, se: String;
p: Integer;
res: Integer;
begin
str(x, s);
p := pos('E', s);
sm := copy(s, 1, p-1);
se := copy(s, p+1, MaxInt);
val(sm, Mantisse, res);
val(se, Exponent, res);
end;
end.