mirror of
https://github.com/AxioDL/optick.git
synced 2026-03-30 11:49:24 -07:00
819 lines
64 KiB
C#
819 lines
64 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Collections.ObjectModel;
|
|
using System.Windows.Data;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
using System.Windows.Media;
|
|
using System.ComponentModel;
|
|
|
|
namespace Profiler.Data
|
|
{
|
|
|
|
public class ThreadData
|
|
{
|
|
public ThreadDescription Description { get; set; }
|
|
public List<EventFrame> Events { get; set; }
|
|
public List<Callstack> Callstacks { get; set; }
|
|
public List<SysCallEntry> SysCalls { get; set; }
|
|
public Synchronization Sync { get; set; }
|
|
public FiberSynchronization FiberSync { get; set; }
|
|
public TagsPack TagsPack { get; set; }
|
|
public bool IsDirty { get; set; }
|
|
|
|
public ThreadData(ThreadDescription desc)
|
|
{
|
|
Description = desc;
|
|
Events = new List<EventFrame>();
|
|
}
|
|
|
|
public void ApplyFiberSynchronization()
|
|
{
|
|
if (FiberSync == null)
|
|
return;
|
|
|
|
int currentInterval = 0;
|
|
|
|
foreach (EventFrame frame in Events)
|
|
{
|
|
while (currentInterval < FiberSync.Intervals.Count && FiberSync.Intervals[currentInterval].Finish <= frame.Header.Start)
|
|
++currentInterval;
|
|
|
|
while (currentInterval < FiberSync.Intervals.Count && FiberSync.Intervals[currentInterval].Finish <= frame.Header.Finish)
|
|
frame.FiberSync.Add(FiberSync.Intervals[currentInterval++]);
|
|
|
|
if (currentInterval < FiberSync.Intervals.Count && FiberSync.Intervals[currentInterval].Start <= frame.Header.Finish)
|
|
frame.FiberSync.Add(FiberSync.Intervals[currentInterval]);
|
|
}
|
|
}
|
|
|
|
|
|
public void ApplySynchronization()
|
|
{
|
|
if (Sync == null)
|
|
return;
|
|
|
|
int currentInterval = 0;
|
|
|
|
foreach (EventFrame frame in Events)
|
|
{
|
|
while (currentInterval < Sync.Count && Sync[currentInterval].Finish <= frame.Header.Start)
|
|
++currentInterval;
|
|
|
|
while (currentInterval < Sync.Count && Sync[currentInterval].Finish <= frame.Header.Finish)
|
|
frame.Synchronization.Add(Sync[currentInterval++]);
|
|
|
|
if (currentInterval < Sync.Count && Sync[currentInterval].Start <= frame.Header.Finish)
|
|
frame.Synchronization.Add(Sync[currentInterval]);
|
|
}
|
|
}
|
|
|
|
public void AddWithMerge(EventFrame frame)
|
|
{
|
|
if (frame.Start == frame.Finish)
|
|
return;
|
|
|
|
int indexStart = Utils.BinarySearchExactIndex(Events, frame.Start);
|
|
int indexFinish = Utils.BinarySearchExactIndex(Events, frame.Finish - 1);
|
|
|
|
Debug.Assert(indexStart == indexFinish, "Can merge only events inside the same frame");
|
|
|
|
if (indexStart != -1)
|
|
{
|
|
EventFrame parent = Events[indexStart];
|
|
parent.MergeWith(frame);
|
|
}
|
|
else
|
|
{
|
|
Events.Add(frame);
|
|
IsDirty = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class FrameGroupStats : INotifyPropertyChanged
|
|
{
|
|
public FrameGroupStats(FrameGroup group)
|
|
{
|
|
Duration = group.Board.TimeSlice.Duration;
|
|
foreach (ThreadData thread in group.Threads)
|
|
{
|
|
foreach (EventFrame frame in thread.Events)
|
|
NumScopes = NumScopes + (UInt64)frame.Entries.Count;
|
|
|
|
NumTags = NumTags + (UInt64)(thread.TagsPack != null ? thread.TagsPack.Tags.Count : 0);
|
|
NumSysCalls = NumSysCalls + (UInt64)(thread.SysCalls != null ? thread.SysCalls.Count : 0);
|
|
NumCallstacks = NumCallstacks + (UInt64)(thread.Callstacks != null ? thread.Callstacks.Count : 0);
|
|
}
|
|
}
|
|
|
|
public double Duration { get; set; }
|
|
public UInt64 NumScopes { get; set; }
|
|
public UInt64 NumTags { get; set; }
|
|
public UInt64 NumSysCalls { get; set; }
|
|
public UInt64 NumCallstacks { get; set; }
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
}
|
|
|
|
|
|
public class FrameGroup
|
|
{
|
|
public String Name { get; set; }
|
|
public SysCallBoard SysCallsBoard { get; protected set; }
|
|
public EventDescriptionBoard Board { get; set; }
|
|
public ISamplingBoard SamplingBoard { get; set; }
|
|
public List<ThreadData> Threads { get; set; }
|
|
public List<ThreadData> Cores { get; set; }
|
|
public List<ThreadData> Fibers { get; set; }
|
|
//public ThreadData MainThread { get { return Board.MainThreadIndex != -1 ? Threads[Board.MainThreadIndex] : null; } }
|
|
public FrameList FocusThread { get { return Frames != null ? Frames[FrameList.Type.CPU] : null; } }
|
|
public SummaryPack Summary { get; set; }
|
|
public FramePack Frames { get; set; }
|
|
public SynchronizationMap Synchronization { get; set; }
|
|
public List<DataResponse> Responses { get; set; }
|
|
|
|
public bool IsCoreDataGenerated { get; set; }
|
|
|
|
public FrameList GetFocusThread(ThreadMask mask)
|
|
{
|
|
if (Frames == null)
|
|
return null;
|
|
|
|
if (mask == ThreadMask.GPU)
|
|
{
|
|
FrameList gpuFrames = Frames[FrameList.Type.GPU];
|
|
if (gpuFrames != null && gpuFrames.Events.Count > 0)
|
|
return gpuFrames;
|
|
}
|
|
|
|
if (mask == ThreadMask.Render)
|
|
{
|
|
FrameList renderFrames = Frames[FrameList.Type.Render];
|
|
if (renderFrames != null && renderFrames.Events.Count > 0)
|
|
return renderFrames;
|
|
}
|
|
|
|
FrameList cpuFrames = Frames[FrameList.Type.CPU];
|
|
return (cpuFrames != null && cpuFrames.Events.Count > 0) ? cpuFrames : null;
|
|
}
|
|
|
|
public List<ThreadData> GetThreads(ThreadDescription.Source origin)
|
|
{
|
|
List<ThreadData> threads = new List<ThreadData>();
|
|
for (int i = 0; i < Board.Threads.Count; ++i)
|
|
{
|
|
if (Board.Threads[i].Origin == origin)
|
|
{
|
|
threads.Add(Threads[i]);
|
|
}
|
|
}
|
|
return threads;
|
|
}
|
|
|
|
public FrameGroup(EventDescriptionBoard board)
|
|
{
|
|
//System.Diagnostics.Debug.Assert(board != null && board.Response != null, "Invalid EventDescriptionBoard response");
|
|
|
|
Board = board;
|
|
|
|
if (board.Threads != null)
|
|
{
|
|
Threads = new List<ThreadData>(board.Threads.Count);
|
|
foreach (ThreadDescription desc in board.Threads)
|
|
Threads.Add(new ThreadData(desc));
|
|
}
|
|
|
|
Fibers = new List<ThreadData>();
|
|
Responses = new List<DataResponse>();
|
|
|
|
if (board.Response != null)
|
|
Responses.Add(board.Response);
|
|
}
|
|
|
|
public void AddFrame(EventFrame frame)
|
|
{
|
|
System.Diagnostics.Debug.Assert(frame != null && frame.Response != null, "Invalid EventFrame response");
|
|
|
|
Responses.Add(frame.Response);
|
|
|
|
int threadIndex = frame.Header.ThreadIndex;
|
|
if (threadIndex >= 0)
|
|
{
|
|
while (threadIndex >= Threads.Count)
|
|
{
|
|
Threads.Add(new ThreadData(Board.Threads[threadIndex]));
|
|
}
|
|
Threads[threadIndex].Events.Add(frame);
|
|
}
|
|
else
|
|
{
|
|
int fiberIndex = frame.Header.FiberIndex;
|
|
if (fiberIndex >= 0)
|
|
{
|
|
while (fiberIndex >= Fibers.Count)
|
|
{
|
|
Fibers.Add(new ThreadData(null));
|
|
}
|
|
Fibers[fiberIndex].Events.Add(frame);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void GenerateDummyCoreThreads()
|
|
{
|
|
if (Cores == null)
|
|
{
|
|
Cores = new List<ThreadData>(Board.CPUCoreCount);
|
|
|
|
foreach (KeyValuePair<UInt64, Synchronization> pair in Synchronization.SyncMap)
|
|
{
|
|
foreach (SyncInterval interval in pair.Value)
|
|
{
|
|
while (Cores.Count <= interval.Core)
|
|
{
|
|
ThreadDescription desc = new ThreadDescription() { Name = String.Format("CPU Core {0:00}", Cores.Count), ThreadID = UInt64.MaxValue, Origin = ThreadDescription.Source.Core };
|
|
Cores.Add(AddThread(desc));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void GenerateRealCoreThreads()
|
|
{
|
|
if (Cores != null && !IsCoreDataGenerated)
|
|
{
|
|
foreach (KeyValuePair<UInt64, Synchronization> pair in Synchronization.SyncMap)
|
|
{
|
|
ThreadDescription threadDesc = null;
|
|
Board.ThreadDescriptions.TryGetValue(pair.Key, out threadDesc);
|
|
|
|
if (threadDesc != null && threadDesc.IsIdle)
|
|
continue;
|
|
|
|
EventDescription eventDesc = new EventDescription(threadDesc != null ? String.Format("{0}:0x{1:X}", threadDesc.FullName, threadDesc.ThreadID) : pair.Key.ToString("X"));
|
|
if (threadDesc != null && threadDesc.ProcessID != Board.ProcessID)
|
|
eventDesc.Color = Colors.SlateGray;
|
|
|
|
foreach (SyncInterval interval in pair.Value)
|
|
{
|
|
byte core = interval.Core;
|
|
|
|
Entry entry = new Entry(eventDesc, interval.Start, interval.Finish);
|
|
|
|
EventFrame frame = new EventFrame(new FrameHeader(interval, Cores[interval.Core].Description.ThreadIndex), new List<Entry>() { entry }, this);
|
|
entry.Frame = frame;
|
|
|
|
Cores[interval.Core].Events.Add(frame);
|
|
}
|
|
}
|
|
|
|
Cores.ForEach(core => core.Events.Sort());
|
|
IsCoreDataGenerated = true;
|
|
}
|
|
}
|
|
|
|
private void GenerateMiscThreads()
|
|
{
|
|
foreach (KeyValuePair<UInt64, ThreadDescription> pair in Board.ThreadDescriptions)
|
|
{
|
|
ThreadDescription desc = pair.Value;
|
|
if (desc.ProcessID == Board.ProcessID && !desc.IsIdle)
|
|
{
|
|
ThreadData threadData = GetThread(pair.Key);
|
|
if (threadData == null || threadData.Events.Count == 0)
|
|
{
|
|
Synchronization sync = null;
|
|
if (Synchronization.SyncMap.TryGetValue(pair.Key, out sync))
|
|
{
|
|
if (threadData == null)
|
|
threadData = AddThread(pair.Value);
|
|
|
|
EventDescription eventDesc = new EventDescription(desc.FullName);
|
|
|
|
foreach (SyncInterval interval in sync)
|
|
{
|
|
Entry entry = new Entry(eventDesc, interval.Start, interval.Finish);
|
|
EventFrame frame = new EventFrame(new FrameHeader(interval, Threads.Count - 1), new List<Entry>() { entry }, this);
|
|
entry.Frame = frame;
|
|
|
|
threadData.Events.Add(frame);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public void Save(Stream stream)
|
|
{
|
|
Responses.ForEach(response => response.Serialize(stream));
|
|
}
|
|
|
|
public void AddSynchronization(SynchronizationMap syncMap)
|
|
{
|
|
Responses.Add(syncMap.Response);
|
|
Synchronization = syncMap;
|
|
|
|
for (int i = 0; i < Math.Min(Board.Threads.Count, Threads.Count); ++i)
|
|
{
|
|
ThreadDescription desc = Board.Threads[i];
|
|
Synchronization sync = null;
|
|
if (syncMap.SyncMap.TryGetValue(desc.ThreadID, out sync))
|
|
{
|
|
Threads[i].Sync = sync;
|
|
}
|
|
}
|
|
|
|
GenerateDummyCoreThreads();
|
|
GenerateMiscThreads();
|
|
}
|
|
|
|
public void AddFiberSynchronization(FiberSynchronization fiberSync)
|
|
{
|
|
System.Diagnostics.Debug.Assert(fiberSync != null && fiberSync.Response != null, "Invalid FiberSynchronization response");
|
|
|
|
Responses.Add(fiberSync.Response);
|
|
|
|
int index = fiberSync.FiberIndex;
|
|
while (index >= Fibers.Count)
|
|
{
|
|
Fibers.Add(new ThreadData(null));
|
|
}
|
|
Fibers[index].FiberSync = fiberSync;
|
|
|
|
SplitFiber(index);
|
|
}
|
|
|
|
|
|
public void AddSysCalls(SysCallBoard sysCallsBoard)
|
|
{
|
|
System.Diagnostics.Debug.Assert(sysCallsBoard != null && sysCallsBoard.Response != null, "Invalid SysCallResponse response");
|
|
|
|
Responses.Add(sysCallsBoard.Response);
|
|
SysCallsBoard = sysCallsBoard;
|
|
|
|
foreach (var pair in sysCallsBoard.SysCallMap)
|
|
{
|
|
ThreadData thread = GetThread(pair.Key);
|
|
if (thread != null)
|
|
thread.SysCalls = pair.Value;
|
|
}
|
|
}
|
|
|
|
public void AddCallStackPack(CallstackPack pack)
|
|
{
|
|
System.Diagnostics.Debug.Assert(pack != null && pack.Response != null, "Invalid CallstackPack response");
|
|
|
|
Responses.Add(pack.Response);
|
|
|
|
for (int i = 0; i < Threads.Count; ++i)
|
|
{
|
|
List<Callstack> callstacks;
|
|
if (pack.CallstackMap.TryGetValue(Board.Threads[i].ThreadID, out callstacks))
|
|
{
|
|
Threads[i].Callstacks = callstacks;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddSymbolPack(SamplingDescriptionPack pack)
|
|
{
|
|
System.Diagnostics.Debug.Assert(pack != null && pack.Response != null, "Invalid SamplingDescriptionPack response");
|
|
|
|
Responses.Add(pack.Response);
|
|
SamplingBoard = pack;
|
|
}
|
|
|
|
public void AddSummary(SummaryPack summary)
|
|
{
|
|
Responses.Insert(0, summary.Response);
|
|
Summary = summary;
|
|
}
|
|
|
|
public void AddFramePack(FramePack pack)
|
|
{
|
|
Responses.Add(pack.Response);
|
|
Frames = pack;
|
|
}
|
|
|
|
private void SplitFiber(int fiberIndex)
|
|
{
|
|
ThreadData data = Fibers[fiberIndex];
|
|
data.ApplyFiberSynchronization();
|
|
|
|
foreach (EventFrame frame in data.Events)
|
|
{
|
|
foreach (FiberSyncInterval fiberSync in frame.FiberSync)
|
|
{
|
|
int threadIndex = 0;
|
|
if (!Board.ThreadID2ThreadIndex.TryGetValue(fiberSync.threadId, out threadIndex))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
Durable border = new Durable(Math.Max(frame.Start, fiberSync.Start), Math.Min(frame.Finish, fiberSync.Finish));
|
|
|
|
int lastIndex = Utils.BinarySearchClosestIndex(frame.Entries, border.Finish);
|
|
|
|
List<Entry> entries = null;
|
|
for (int i = 0; i <= lastIndex; i++)
|
|
{
|
|
Entry entry = frame.Entries[i];
|
|
if (entry.Intersect(border))
|
|
{
|
|
if (entries == null)
|
|
{
|
|
entries = new List<Entry>();
|
|
}
|
|
entries.Add(new Entry(entry.Description, Math.Max(border.Start, entry.Start), Math.Min(border.Finish, entry.Finish)));
|
|
}
|
|
}
|
|
|
|
if (entries != null && entries.Count > 0)
|
|
{
|
|
FrameHeader header = new FrameHeader(border, threadIndex, fiberIndex);
|
|
EventFrame block = new EventFrame(header, entries, this);
|
|
entries.ForEach(e => e.Frame = block);
|
|
Threads[threadIndex].AddWithMerge(block);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public void UpdateEventsSynchronization()
|
|
{
|
|
foreach (ThreadData data in Threads)
|
|
{
|
|
if (data.IsDirty)
|
|
{
|
|
data.Events.Sort();
|
|
data.IsDirty = false;
|
|
}
|
|
|
|
data.ApplySynchronization();
|
|
}
|
|
}
|
|
|
|
public void Add(TagsPack pack)
|
|
{
|
|
Responses.Add(pack.Response);
|
|
if (0 <= pack.ThreadIndex && pack.ThreadIndex < Threads.Count)
|
|
Threads[pack.ThreadIndex].TagsPack = pack;
|
|
}
|
|
|
|
public ThreadData GetThread(UInt64 threadID)
|
|
{
|
|
int threadIndex = -1;
|
|
if (Board.ThreadID2ThreadIndex.TryGetValue(threadID, out threadIndex))
|
|
{
|
|
return Threads[threadIndex];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public ThreadData AddThread(ThreadDescription desc)
|
|
{
|
|
int index = Threads.Count;
|
|
desc.ThreadIndex = index;
|
|
if (desc.ThreadID != UInt64.MaxValue)
|
|
Board.ThreadID2ThreadIndex.Add(desc.ThreadID, index);
|
|
ThreadData threadData = new ThreadData(desc);
|
|
Threads.Add(threadData);
|
|
Board.Threads.Add(desc);
|
|
return threadData;
|
|
}
|
|
|
|
public List<Callstack> GetCallstacks(EventDescription desc, CallStackReason type = CallStackReason.AutoSample)
|
|
{
|
|
List<Callstack> callstacks = new List<Callstack>();
|
|
|
|
foreach (ThreadData thread in Threads)
|
|
{
|
|
HashSet<Callstack> accumulator = new HashSet<Callstack>();
|
|
foreach (EventFrame currentFrame in thread.Events)
|
|
{
|
|
List<Entry> entries = null;
|
|
if (currentFrame.ShortBoard.TryGetValue(desc, out entries))
|
|
{
|
|
foreach (Entry entry in entries)
|
|
{
|
|
Utils.ForEachInsideIntervalStrict(thread.Callstacks, entry, c => {
|
|
if ((c.Reason & type) != 0)
|
|
accumulator.Add(c);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
callstacks.AddRange(accumulator);
|
|
}
|
|
|
|
return callstacks;
|
|
}
|
|
|
|
public SamplingFrame CreateSamplingFrame(EventDescription desc, CallStackReason type = CallStackReason.AutoSample)
|
|
{
|
|
return new SamplingFrame(GetCallstacks(desc, type), this);
|
|
}
|
|
|
|
public static uint? GetFrameNumber(EventFrame frame)
|
|
{
|
|
TagUInt32 tag = frame.FindTag<TagUInt32>("Frame");
|
|
if (tag != null)
|
|
return tag.Value;
|
|
return null;
|
|
}
|
|
|
|
public bool UpdateDescriptionMask(EventDescription description)
|
|
{
|
|
if (description.Mask != null)
|
|
return false;
|
|
|
|
ThreadMask mask = ThreadMask.None;
|
|
|
|
foreach (ThreadData thread in Threads)
|
|
{
|
|
foreach (EventFrame frame in thread.Events)
|
|
{
|
|
if (frame.ShortBoard.ContainsKey(description))
|
|
{
|
|
mask |= (ThreadMask)thread.Description.Mask;
|
|
}
|
|
}
|
|
}
|
|
|
|
description.Mask = mask;
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
public class FrameCollection : ObservableCollection<Frame>
|
|
{
|
|
Dictionary<int, FrameGroup> groups = new Dictionary<int, FrameGroup>();
|
|
Dictionary<int, SummaryPack> summaries = new Dictionary<int, SummaryPack>();
|
|
|
|
public void AddGroup(FrameGroup group)
|
|
{
|
|
groups[group.Board.ID] = group;
|
|
}
|
|
|
|
public void Flush()
|
|
{
|
|
foreach (FrameGroup group in groups.Values)
|
|
{
|
|
group.UpdateEventsSynchronization();
|
|
group.Frames.FinishUpdate();
|
|
|
|
FrameList frameList = group.Frames[FrameList.Type.CPU];
|
|
foreach (EventFrame frame in frameList.Frames)
|
|
Add(frame);
|
|
}
|
|
|
|
groups.Clear();
|
|
summaries.Clear();
|
|
}
|
|
|
|
public void UpdateName(String name, bool force = false)
|
|
{
|
|
foreach (FrameGroup group in groups.Values)
|
|
if (String.IsNullOrEmpty(group.Name) || force)
|
|
group.Name = name;
|
|
}
|
|
|
|
public void Add(DataResponse response)
|
|
{
|
|
switch (response.ResponseType)
|
|
{
|
|
case DataResponse.Type.SummaryPack:
|
|
{
|
|
SummaryPack summary = new SummaryPack(response);
|
|
summaries[summary.BoardID] = summary;
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.FrameDescriptionBoard:
|
|
{
|
|
EventDescriptionBoard board = EventDescriptionBoard.Read(response);
|
|
FrameGroup group = new FrameGroup(board);
|
|
|
|
AddGroup(group);
|
|
|
|
SummaryPack summary = null;
|
|
if (summaries.TryGetValue(board.ID, out summary))
|
|
group.AddSummary(summary);
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.EventFrame:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
EventFrame frame = new EventFrame(response, group);
|
|
|
|
group.AddFrame(frame);
|
|
|
|
if (group.Board.MainThreadIndex != -1 && group.Board.MainThreadIndex == frame.Header.ThreadIndex)
|
|
{
|
|
Add(frame);
|
|
}
|
|
else if (frame.Header.FrameType != FrameList.Type.None)
|
|
{
|
|
if (frame.Header.Duration > 0.0)
|
|
{
|
|
FrameList frameList = group.Frames[frame.Header.FrameType];
|
|
if (frameList != null)
|
|
{
|
|
frameList.Frames.Add(frame);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.SynchronizationData:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
group.AddSynchronization(new SynchronizationMap(response, group));
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.FiberSynchronizationData:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
group.AddFiberSynchronization(new FiberSynchronization(response, group));
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.CallstackDescriptionBoard:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
group.AddSymbolPack(SamplingDescriptionPack.CreatePack(response));
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.SyscallPack:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
SysCallBoard sysCallsBoard = SysCallBoard.Create(response, group);
|
|
group.AddSysCalls(sysCallsBoard);
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.CallstackPack:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
ISamplingBoard samplingBoard = group.SamplingBoard;
|
|
|
|
if (samplingBoard == null)
|
|
{
|
|
// TODO: replace Dummy Sampling Board with proper Platform-dependent ISamplingBoard
|
|
samplingBoard = DummySamplingBoard.Instance;
|
|
}
|
|
|
|
CallstackPack pack = CallstackPack.Create(response, samplingBoard, group.SysCallsBoard);
|
|
group.AddCallStackPack(pack);
|
|
|
|
break;
|
|
}
|
|
|
|
case DataResponse.Type.TagsPack:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
if (groups.ContainsKey(id))
|
|
{
|
|
FrameGroup group = groups[id];
|
|
|
|
TagsPack pack = new TagsPack(response, group);
|
|
group.Add(pack);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
case DataResponse.Type.FramesPack:
|
|
{
|
|
int id = response.Reader.ReadInt32();
|
|
FrameGroup group = groups[id];
|
|
|
|
FramePack pack = FramePack.Create(response, group.Board);
|
|
group.AddFramePack(pack);
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
Debug.Fail("Skipping response: ", response.ResponseType.ToString());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class TestFrameCollection : FrameCollection
|
|
{
|
|
// Encoded network stream with test frames
|
|
static String descriptionBoard = "BQAAAGADAAAAAAAAAQAAAMcWLgAAAAAAx4pn3kUAAAAHzIneRQAAAAMAAADUDwAABgAAAFdvcmtlctAUAAAGAAAAV29ya2VyOCQAAAoAAABNYWluVGhyZWFkAgAAABEAAAAFAAAAU2xlZXAMAAAAS2VybmVsMzIuZGxsAAAAAP////8ABwAAAFNsZWVwRXgMAAAAS2VybmVsMzIuZGxsAAAAAP////8AEwAAAFdhaXRGb3JTaW5nbGVPYmplY3QMAAAAS2VybmVsMzIuZGxsAAAAAP////8AFQAAAFdhaXRGb3JTaW5nbGVPYmplY3RFeAwAAABLZXJuZWwzMi5kbGwAAAAA/////wAWAAAAV2FpdEZvck11bHRpcGxlT2JqZWN0cwwAAABLZXJuZWwzMi5kbGwAAAAA/////wAYAAAAV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4DAAAAEtlcm5lbDMyLmRsbAAAAAD/////AAUAAABTbGVlcAgAAABIb29rLmNwcPsAAAD/////AAUAAABGcmFtZQ4AAABUZXN0RW5naW5lLmNwcDcAAAAAAAAAAAsAAABVcGRhdGVJbnB1dA4AAABUZXN0RW5naW5lLmNwcEgAAAC0gkb/ACYAAAB2b2lkIF9fY2RlY2wgVGVzdDo6U2xvd0Z1bmN0aW9uMih2b2lkKQ4AAABUZXN0RW5naW5lLmNwcCgAAAAAAAAAAA0AAABVcGRhdGVQaHlzaWNzDgAAAFRlc3RFbmdpbmUuY3BwYQAAALPe9f8ADgAAAFVwZGF0ZU1lc3NhZ2VzDgAAAFRlc3RFbmdpbmUuY3BwTQAAAACl//8ALgAAAHZvaWQgX19jZGVjbCBUZXN0OjpTbG93RnVuY3Rpb248MHg0MDAwMD4odm9pZCkOAAAAVGVzdEVuZ2luZS5jcHAfAAAAAAAAAAALAAAAVXBkYXRlTG9naWMOAAAAVGVzdEVuZ2luZS5jcHBSAAAA1nDa/wALAAAAVXBkYXRlU2NlbmUOAAAAVGVzdEVuZ2luZS5jcHBXAAAA686H/wAEAAAARHJhdw4AAABUZXN0RW5naW5lLmNwcFwAAABygPr/ABMAAABXYWl0Rm9yU2luZ2xlT2JqZWN0CAAAAEhvb2suY3BwCwEAAP////8A";
|
|
static String eventFrame = "BQAAANwLAAABAAAAAQAAAAIAAAC76WreRQAAAIhubt5FAAAABgAAALzpat5FAAAAbmxr3kUAAAAIAAAAcWxr3kUAAAAz/2veRQAAAAsAAAA0/2veRQAAAA56bN5FAAAADQAAAA96bN5FAAAA2gZt3kUAAAAOAAAA2wZt3kUAAADW8m3eRQAAAAoAAADY8m3eRQAAAIdubt5FAAAADwAAAKUAAADf62reRQAAALjsat5FAAAA/uxq3kUAAAA17WreRQAAAEztat5FAAAAXO1q3kUAAADk7WreRQAAAKTuat5FAAAArO5q3kUAAACy7mreRQAAAFXzat5FAAAAgPNq3kUAAACCAmveRQAAAJMCa95FAAAAAgNr3kUAAABkBGveRQAAABMFa95FAAAAKgVr3kUAAAAtBWveRQAAADIFa95FAAAANgVr3kUAAABABWveRQAAAEYFa95FAAAAUwVr3kUAAABdBWveRQAAAGoFa95FAAAAcAVr3kUAAAB2BWveRQAAAH4Fa95FAAAAhQVr3kUAAACIBWveRQAAAIwFa95FAAAAkQVr3kUAAACoBWveRQAAALEFa95FAAAAyAVr3kUAAADQBWveRQAAANMFa95FAAAA1wVr3kUAAADvBWveRQAAAPoFa95FAAAA/gVr3kUAAAAMBmveRQAAACgGa95FAAAAKwZr3kUAAAAsBmveRQAAADAGa95FAAAANQZr3kUAAAB/CGveRQAAALoIa95FAAAA2RRr3kUAAACjI2veRQAAADAma95FAAAAPiZr3kUAAAC0JmveRQAAAIMoa95FAAAAjChr3kUAAADKKGveRQAAAJMpa95FAAAAqylr3kUAAADyhmveRQAAAPeGa95FAAAA+oZr3kUAAAAGh2veRQAAAAiHa95FAAAAv4dr3kUAAAAJiGveRQAAAAyIa95FAAAAt5Jr3kUAAADWkmveRQAAAM2Ua95FAAAA9pRr3kUAAACIlmveRQAAAJyWa95FAAAAgpdr3kUAAACLl2veRQAAAK2Xa95FAAAAK5hr3kUAAACwmGveRQAAAIyaa95FAAAAmZpr3kUAAAChmmveRQAAAM+aa95FAAAA0Zpr3kUAAAD9mmveRQAAAAGba95FAAAATJtr3kUAAABOm2veRQAAAHKba95FAAAAdZtr3kUAAACUm2veRQAAAJaba95FAAAArZtr3kUAAACwm2veRQAAAHqca95FAAAAfJxr3kUAAACRnGveRQAAAJSca95FAAAArpxr3kUAAACvnGveRQAAAMica95FAAAAy5xr3kUAAADynGveRQAAAPSca95FAAAAC51r3kUAAAAOnWveRQAAACSda95FAAAAJZ1r3kUAAAA4nWveRQAAADuda95FAAAAz51r3kUAAADRnWveRQAAAOada95FAAAA6Z1r3kUAAAAAnmveRQAAAAKea95FAAAAGZ5r3kUAAAAcnmveRQAAAD+ea95FAAAAQZ5r3kUAAABXnmveRQAAAFqea95FAAAAcJ5r3kUAAABxnmveRQAAAIiea95FAAAAQJ9r3kUAAAAnpWveRQAAACula95FAAAAVaVr3kUAAABYpWveRQAAAHGla95FAAAAdKVr3kUAAACgpWveRQAAAKKla95FAAAAWqpr3kUAAABcqmveRQAAAGCqa95FAAAAYqpr3kUAAACQqmveRQAAAJOqa95FAAAAu6pr3kUAAAC9qmveRQAAANKqa95FAAAA1apr3kUAAADrqmveRQAAAOyqa95FAAAA/qpr3kUAAAACq2veRQAAAIGra95FAAAAg6tr3kUAAACXq2veRQAAAJqra95FAAAAsatr3kUAAACyq2veRQAAAMmra95FAAAAzKtr3kUAAADtq2veRQAAAO+ra95FAAAABKxr3kUAAAAHrGveRQAAABysa95FAAAAHaxr3kUAAAAwrGveRQAAADOsa95FAAAAtaxr3kUAAAC3rGveRQAAAMusa95FAAAAzqxr3kUAAADkrGveRQAAAOasa95FAAAA/Kxr3kUAAAAArWveRQAAACGta95FAAAAIq1r3kUAAAA2rWveRQAAADmta95FAAAATq1r3kUAAABPrWveRQAAAGGta95FAAAAZK1r3kUAAADkrWveRQAAAOata95FAAAA+61r3kUAAAD+rWveRQAAABSua95FAAAAFq5r3kUAAAAtrmveRQAAADCua95FAAAAUa5r3kUAAABTrmveRQAAAGiua95FAAAAa65r3kUAAAB/rmveRQAAAIGua95FAAAAlK5r3kUAAACWrmveRQAAABeva95FAAAAGa9r3kUAAAAsr2veRQAAAC+va95FAAAARa9r3kUAAABHr2veRQAAAF2va95FAAAAYK9r3kUAAACCr2veRQAAAISva95FAAAAmK9r3kUAAACcr2veRQAAALCva95FAAAAsq9r3kUAAADEr2veRQAAAMeva95FAAAATLBr3kUAAABWsGveRQAAAAPKa95FAAAAYMpr3kUAAACi2WveRQAAAHnqa95FAAAA3O1r3kUAAADm7WveRQAAAELua95FAAAAT+5r3kUAAADR7mveRQAAAOvua95FAAAA5+9r3kUAAADp72veRQAAAMQ4bN5FAAAAyjhs3kUAAADXOGzeRQAAAOY4bN5FAAAA6Ths3kUAAADxOGzeRQAAAPo4bN5FAAAA/jhs3kUAAAABOWzeRQAAABE5bN5FAAAAHTls3kUAAAAmOWzeRQAAADI5bN5FAAAAnDls3kUAAACnOWzeRQAAAKs5bN5FAAAAxjls3kUAAADOOWzeRQAAANA5bN5FAAAA0zls3kUAAADWOWzeRQAAANo5bN5FAAAADjps3kUAAAAWOmzeRQAAAGk6bN5FAAAAezps3kUAAACjimzeRQAAALeKbN5FAAAAXZ5s3kUAAABnqWzeRQAAAEuqbN5FAAAATaps3kUAAACXqmzeRQAAAL2qbN5FAAAAxaps3kUAAADQqmzeRQAAAE6rbN5FAAAAhLJs3kUAAACgDG3eRQAAAKEMbd5FAAAApQxt3kUAAACuDG3eRQAAALANbd5FAAAAuw1t3kUAAAAzY23eRQAAAD5jbd5FAAAAx2ht3kUAAAAWaW3eRQAAAB5pbd5FAAAALGlt3kUAAACAam3eRQAAAI9qbd5FAAAAmWpt3kUAAACjam3eRQAAAPJqbd5FAAAAVGtt3kUAAABMbG3eRQAAAIxsbd5FAAAA22xt3kUAAAAPbW3eRQAAAF18bd5FAAAAZHxt3kUAAACggm3eRQAAALCCbd5FAAAAAaZt3kUAAAAAqW3eRQAAAHipbd5FAAAAeqlt3kUAAACmqW3eRQAAALqpbd5FAAAADqpt3kUAAAAfqm3eRQAAADqqbd5FAAAAVapt3kUAAAC3t23eRQAAAOO3bd5FAAAATtVt3kUAAABU1W3eRQAAAFntbd5FAAAAXO1t3kUAAAD8J27eRQAAAAYobt5FAAAAHyhu3kUAAAAsKG7eRQAAAFcobt5FAAAAWyhu3kUAAACZKG7eRQAAAKoobt5FAAAA3yhu3kUAAADkKG7eRQAAAM8tbt5FAAAA9y1u3kUAAAABLm7eRQAAAAoubt5FAAAAGi9u3kUAAAAfL27eRQAAAEsvbt5FAAAAxi9u3kUAAAC0M27eRQAAAMozbt5FAAAAIjRu3kUAAAAxNG7eRQAAAME3bt5FAAAA5Ddu3kUAAAAMAAAAu+lq3kUAAACIbm7eRQAAAAcAAAC86WreRQAAAG5sa95FAAAACAAAALzpat5FAAAAbWxr3kUAAAAJAAAAcWxr3kUAAAAz/2veRQAAAAsAAABxbGveRQAAADL/a95FAAAADAAAADT/a95FAAAADnps3kUAAAANAAAANf9r3kUAAAANemzeRQAAAAwAAAAPemzeRQAAANoGbd5FAAAADgAAAA96bN5FAAAA2QZt3kUAAAAMAAAA2wZt3kUAAADW8m3eRQAAAAoAAADY8m3eRQAAAIdubt5FAAAADwAAANnybd5FAAAAh25u3kUAAAAMAAAA";
|
|
static String samplingFrame = "BAAAAExxAAACAAAAXAMAAIYAAADkEOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAIAAAAbQBhAGkAbgBeAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdAAuAGMAcABwAA4AAADHKeoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAiAAAAXwBfAHQAbQBhAGkAbgBDAFIAVABTAHQAYQByAHQAdQBwAF4AAABmADoAXABkAGQAXAB2AGMAdABvAG8AbABzAFwAYwByAHQAXwBiAGwAZABcAHMAZQBsAGYAXwB4ADgANgBcAGMAcgB0AFwAcwByAGMAXABjAHIAdABlAHgAZQAuAGMAKwIAAGZOUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAE06T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAApk1ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAA5k5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAA4pJWdwAAAAA6AAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFMAeQBzAFcATwBXADYANABcAG4AdABkAGwAbAAuAGQAbABsADYAAABSAHQAbABJAG4AaQB0AGkAYQBsAGkAegBlAEUAeABjAGUAcAB0AGkAbwBuAEMAaABhAGkAbgAAAAAAAAAAANYY6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACYAAABUAGUAcwB0ADoAOgBTAGwAbwB3AEYAdQBuAGMAdABpAG8AbgAyAFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAxAAAAVjDqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUACgAAAEMASQBzAGkAbgAAAAAAAAAAAL4Z6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADoAAADeGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAMQAAADseSXIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFAAMQAwADAALgBkAGwAbAC6AAAAcwB0AGQAOgA6AGIAYQBzAGkAYwBfAG8AcwB0AHIAZQBhAG0APABjAGgAYQByACwAcwB0AGQAOgA6AGMAaABhAHIAXwB0AHIAYQBpAHQAcwA8AGMAaABhAHIAPgAgAD4AOgA6AGIAYQBzAGkAYwBfAG8AcwB0AHIAZQBhAG0APABjAGgAYQByACwAcwB0AGQAOgA6AGMAaABhAHIAXwB0AHIAYQBpAHQAcwA8AGMAaABhAHIAPgAgAD4AAAAAAAAAAAB6Mxx2AAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdwBvAHcANgA0AFwAawBlAHIAbgBlAGwAMwAyAC4AZABsAGwAJgAAAEIAYQBzAGUAVABoAHIAZQBhAGQASQBuAGkAdABUAGgAdQBuAGsAAAAAAAAAAAB7GuoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAyAAAAVABlAHMAdAA6ADoARQBuAGcAaQBuAGUAOgA6AFUAcABkAGEAdABlAEkAbgBwAHUAdABaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAASgAAAM0Y6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACYAAABUAGUAcwB0ADoAOgBTAGwAbwB3AEYAdQBuAGMAdABpAG8AbgAyAFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAwAAAAs0ZPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcABvAHcAAAAAAAAAAACgH+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQBqAAAAcwB0AGQAOgA6AHYAZQBjAHQAbwByADwAZgBsAG8AYQB0ACwAcwB0AGQAOgA6AGEAbABsAG8AYwBhAHQAbwByADwAZgBsAG8AYQB0AD4AIAA+ADoAOgBvAHAAZQByAGEAdABvAHIAWwBdAIoAAABjADoAXABwAHIAbwBnAHIAYQBtACAAZgBpAGwAZQBzACAAKAB4ADgANgApAFwAbQBpAGMAcgBvAHMAbwBmAHQAIAB2AGkAcwB1AGEAbAAgAHMAdAB1AGQAaQBvACAAMQAwAC4AMABcAHYAYwBcAGkAbgBjAGwAdQBkAGUAXAB2AGUAYwB0AG8AcgCgAwAAyBjqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAJgAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADIAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADAAAACQGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAALgAAAA9PUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAJAf6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlAF4AAABzAHQAZAA6ADoAdgBlAGMAdABvAHIAPABmAGwAbwBhAHQALABzAHQAZAA6ADoAYQBsAGwAbwBjAGEAdABvAHIAPABmAGwAbwBhAHQAPgAgAD4AOgA6AHMAaQB6AGUAigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAHYAZQBjAHQAbwByAG4DAACPTlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAACzGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAALwAAANsY6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACYAAABUAGUAcwB0ADoAOgBTAGwAbwB3AEYAdQBuAGMAdABpAG8AbgAyAFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAxAAAAATpPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcwBpAG4AAAAAAAAAAAAbJeoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQA0AAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4APAAyADYAMgAxADQANAA+AFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAkAAAA+k5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAA2BjqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAJgAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADIAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADEAAADDGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAMAAAAGJPUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAMMZ6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADwAAACpGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAALgAAAPodwFYAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAQwBvAHIAZQAuAGQAbABsAEoAAABQAHIAbwBmAGkAbABlAHIAOgA6AEMAbwByAGUAOgA6AEQAdQBtAHAAQwBhAHAAdAB1AHIAaQBuAGcAUAByAG8AZwByAGUAcwBzAE4AAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAYwBvAHIAZQBcAGMAbwByAGUALgBjAHAAcADBAAAA4xjqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAJgAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADIAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADEAAAC6GOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAALwAAAOA5T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAAlxjqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAJgAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADIAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAC4AAAC2TVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAAD2TlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAACxGOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAmAAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4AMgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAALgAAAM8Y6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACYAAABUAGUAcwB0ADoAOgBTAGwAbwB3AEYAdQBuAGMAdABpAG8AbgAyAFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAxAAAAbk5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAHRvqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAOAAAAFQAZQBzAHQAOgA6AEUAbgBnAGkAbgBlADoAOgBVAHAAZABhAHQAZQBNAGUAcwBzAGEAZwBlAHMAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAE8AAABwF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAGAAAAcwBpAG4AigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoABoCAABLF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAIAAAAcwBpAG4AZgCKAAAAYwA6AFwAcAByAG8AZwByAGEAbQAgAGYAaQBsAGUAcwAgACgAeAA4ADYAKQBcAG0AaQBjAHIAbwBzAG8AZgB0ACAAdgBpAHMAdQBhAGwAIABzAHQAdQBkAGkAbwAgADEAMAAuADAAXAB2AGMAXABpAG4AYwBsAHUAZABlAFwAbQBhAHQAaAAuAGgArgEAAPE5T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAAYjpPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcwBpAG4AAAAAAAAAAACbTlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAACgTVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAABSOk9yAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwACgAAAEMASQBzAGkAbgAAAAAAAAAAAItOUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAE86T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAARTpPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcwBpAG4AAAAAAAAAAAC+TVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAABQOk9yAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwACgAAAEMASQBzAGkAbgAAAAAAAAAAAPJOUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAFM6T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAAx01ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAh05ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAxE5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAODpPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcwBpAG4AAAAAAAAAAAD5TVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAAAXT1JyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAABAF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAIAAAAcwBpAG4AZgCKAAAAYwA6AFwAcAByAG8AZwByAGEAbQAgAGYAaQBsAGUAcwAgACgAeAA4ADYAKQBcAG0AaQBjAHIAbwBzAG8AZgB0ACAAdgBpAHMAdQBhAGwAIABzAHQAdQBkAGkAbwAgADEAMAAuADAAXAB2AGMAXABpAG4AYwBsAHUAZABlAFwAbQBhAHQAaAAuAGgArgEAAOw5T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAARhfqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUACAAAAHMAaQBuAGYAigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoAK4BAAAMOk9yAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwACgAAAEMASQBzAGkAbgAAAAAAAAAAAFEX6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlAAgAAABzAGkAbgBmAIoAAABjADoAXABwAHIAbwBnAHIAYQBtACAAZgBpAGwAZQBzACAAKAB4ADgANgApAFwAbQBpAGMAcgBvAHMAbwBmAHQAIAB2AGkAcwB1AGEAbAAgAHMAdAB1AGQAaQBvACAAMQAwAC4AMABcAHYAYwBcAGkAbgBjAGwAdQBkAGUAXABtAGEAdABoAC4AaACuAQAAThfqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUACAAAAHMAaQBuAGYAigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoAK4BAABrF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAGAAAAcwBpAG4AigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoABoCAABkF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAGAAAAcwBpAG4AigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoABoCAABgF+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAGAAAAcwBpAG4AigAAAGMAOgBcAHAAcgBvAGcAcgBhAG0AIABmAGkAbABlAHMAIAAoAHgAOAA2ACkAXABtAGkAYwByAG8AcwBvAGYAdAAgAHYAaQBzAHUAYQBsACAAcwB0AHUAZABpAG8AIAAxADAALgAwAFwAdgBjAFwAaQBuAGMAbAB1AGQAZQBcAG0AYQB0AGgALgBoABoCAAAIJeoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQA0AAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4APAAyADYAMgAxADQANAA+AFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAkAAAAISXqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUANAAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADwAMgA2ADIAMQA0ADQAPgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAJAAAADEl6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlADQAAABUAGUAcwB0ADoAOgBTAGwAbwB3AEYAdQBuAGMAdABpAG8AbgA8ADIANgAyADEANAA0AD4AWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwACQAAAArJeoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQA0AAAAVABlAHMAdAA6ADoAUwBsAG8AdwBGAHUAbgBjAHQAaQBvAG4APAAyADYAMgAxADQANAA+AFoAAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdABcAHQAZQBzAHQAZQBuAGcAaQBuAGUALgBjAHAAcAAkAAAAdRfqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUABgAAAHMAaQBuAIoAAABjADoAXABwAHIAbwBnAHIAYQBtACAAZgBpAGwAZQBzACAAKAB4ADgANgApAFwAbQBpAGMAcgBvAHMAbwBmAHQAIAB2AGkAcwB1AGEAbAAgAHMAdAB1AGQAaQBvACAAMQAwAC4AMABcAHYAYwBcAGkAbgBjAGwAdQBkAGUAXABtAGEAdABoAC4AaAAaAgAAEiXqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUANAAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADwAMgA2ADIAMQA0ADQAPgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAJAAAAMgZ6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAD4AAAC9G+oAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAyAAAAVABlAHMAdAA6ADoARQBuAGcAaQBuAGUAOgA6AFUAcABkAGEAdABlAEwAbwBnAGkAYwBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAVAAAAAlPUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAABNPUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAC86T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAAPTpPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcwBpAG4AAAAAAAAAAAA2Rk9yAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwACgAAAEMASQBwAG8AdwAAAAAAAAAAAL9iwFYAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAQwBvAHIAZQAuAGQAbABsACwAAABQAHIAbwBmAGkAbABlAHIAOgA6AFMAbwBjAGsAZQB0ADoAOgBTAGUAbgBkAE4AAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAYwBvAHIAZQBcAHMAbwBjAGsAZQB0AC4AaACQAAAADU5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAJUZPcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAAoAAABDAEkAcABvAHcAAAAAAAAAAADDTVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAADLTVJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAACzTlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAAACT1JyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAACLRk9yAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwACgAAAEMASQBwAG8AdwAAAAAAAAAAAFU6T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAAACXqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUANAAAAFQAZQBzAHQAOgA6AFMAbABvAHcARgB1AG4AYwB0AGkAbwBuADwAMgA2ADIAMQA0ADQAPgBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAJAAAAM0Z6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAEAAAABdHOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAyAAAAVABlAHMAdAA6ADoARQBuAGcAaQBuAGUAOgA6AFUAcABkAGEAdABlAFMAYwBlAG4AZQBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAWQAAAOJOUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAEZOUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAM9NUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAH5OUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAG06T3IAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAQwBJAHMAaQBuAAAAAAAAAAAA1U5ScgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsAD4AAABfAGMAbABlAGEAbgBfAHQAeQBwAGUAXwBpAG4AZgBvAF8AbgBhAG0AZQBzAF8AaQBuAHQAZQByAG4AYQBsAAAAAAAAAAAAZxfqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUABgAAAHMAaQBuAIoAAABjADoAXABwAHIAbwBnAHIAYQBtACAAZgBpAGwAZQBzACAAKAB4ADgANgApAFwAbQBpAGMAcgBvAHMAbwBmAHQAIAB2AGkAcwB1AGEAbAAgAHMAdAB1AGQAaQBvACAAMQAwAC4AMABcAHYAYwBcAGkAbgBjAGwAdQBkAGUAXABtAGEAdABoAC4AaAAaAgAA0hnqAAAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBUAGUAcwB0AC4AZQB4AGUAKAAAAFQAZQBzAHQAOgA6AEUAbgBnAGkAbgBlADoAOgBVAHAAZABhAHQAZQBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAQgAAAJod6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlADYAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAUABoAHkAcwBpAGMAcwBaAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXAB0AGUAcwB0AGUAbgBnAGkAbgBlAC4AYwBwAHAAYwAAAKVE6nYAAAAARAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB3AG8AdwA2ADQAXABLAEUAUgBOAEUATABCAEEAUwBFAC4AZABsAGwACgAAAFMAbABlAGUAcAAAAAAAAAAAAN39VHcAAAAAOgAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABTAHkAcwBXAE8AVwA2ADQAXABuAHQAZABsAGwALgBkAGwAbAAgAAAAWgB3AEQAZQBsAGEAeQBFAHgAZQBjAHUAdABpAG8AbgAAAAAAAAAAANcZ6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAEQAAAD9HOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAkAAAAVABlAHMAdAA6ADoARQBuAGcAaQBuAGUAOgA6AEQAcgBhAHcAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAF4AAABWTlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAAAxTlJyAAAAAEAAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdABlAG0AMwAyAFwATQBTAFYAQwBSADEAMAAwAC4AZABsAGwAPgAAAF8AYwBsAGUAYQBuAF8AdAB5AHAAZQBfAGkAbgBmAG8AXwBuAGEAbQBlAHMAXwBpAG4AdABlAHIAbgBhAGwAAAAAAAAAAADxHOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAkAAAAVABlAHMAdAA6ADoARQBuAGcAaQBuAGUAOgA6AEQAcgBhAHcAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwAFwAAACwQMBWAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAEMAbwByAGUALgBkAGwAbAA4AAAAUAByAG8AZgBpAGwAZQByADoAOgBDAGEAdABlAGcAbwByAHkAOgA6AEMAYQB0AGUAZwBvAHIAeQBQAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAGMAbwByAGUAXABlAHYAZQBuAHQALgBjAHAAcABMAAAAwT7AVgAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBDAG8AcgBlAC4AZABsAGwALAAAAFAAcgBvAGYAaQBsAGUAcgA6ADoARQB2AGUAbgB0ADoAOgBTAHQAYQByAHQAUAAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgBjAG8AcgBlAFwAZQB2AGUAbgB0AC4AYwBwAHAAJAAAAGkZ6gAAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAVABlAHMAdAAuAGUAeABlACgAAABUAGUAcwB0ADoAOgBFAG4AZwBpAG4AZQA6ADoAVQBwAGQAYQB0AGUAWgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgB0AGUAcwB0AFwAdABlAHMAdABlAG4AZwBpAG4AZQAuAGMAcABwADcAAAC2G8BWAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAEMAbwByAGUALgBkAGwAbAAsAAAAUAByAG8AZgBpAGwAZQByADoAOgBDAG8AcgBlADoAOgBVAHAAZABhAHQAZQBOAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAGMAbwByAGUAXABjAG8AcgBlAC4AYwBwAHAAkgAAAI0SwFYAAAAAVAAAAEQAOgBcAEIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAFIAZQBsAGUAYQBzAGUAXABQAHIAbwBmAGkAbABlAHIAQwBvAHIAZQAuAGQAbABsADgAAABQAHIAbwBmAGkAbABlAHIAOgA6AEMAbwByAGUAOgA6AEQAdQBtAHAAUAByAG8AZwByAGUAcwBzAE4AAABkADoAXABiAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABwAHIAbwBmAGkAbABlAHIAYwBvAHIAZQBcAGMAbwByAGUALgBjAHAAcAAlAAAA/2XAVgAAAABUAAAARAA6AFwAQgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAUgBlAGwAZQBhAHMAZQBcAFAAcgBvAGYAaQBsAGUAcgBDAG8AcgBlAC4AZABsAGwALAAAAFAAcgBvAGYAaQBsAGUAcgA6ADoAUwBlAHIAdgBlAHIAOgA6AFMAZQBuAGQAYgAAAGQAOgBcAGIAcgBvAGYAaQBsAGUAcgBcAHQAcgB1AG4AawBcAHAAcgBvAGYAaQBsAGUAcgBjAG8AcgBlAFwAcAByAG8AZgBpAGwAZQByAHMAZQByAHYAZQByAC4AYwBwAHAALgAAAE2JUnIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAA+AAAAXwBjAGwAZQBhAG4AXwB0AHkAcABlAF8AaQBuAGYAbwBfAG4AYQBtAGUAcwBfAGkAbgB0AGUAcgBuAGEAbAAAAAAAAAAAAPUSHHYAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB3AG8AdwA2ADQAXABrAGUAcgBuAGUAbAAzADIALgBkAGwAbAASAAAAVwByAGkAdABlAEYAaQBsAGUAAAAAAAAAAAB5b0V2AAAAADwAAABDADoAXABXAGkAbgBkAG8AdwBzAFwAcwB5AHMAdwBvAHcANgA0AFwAVwBTADIAXwAzADIALgBkAGwAbAAIAAAAcwBlAG4AZAAAAAAAAAAAAG35VHcAAAAAOgAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABTAHkAcwBXAE8AVwA2ADQAXABuAHQAZABsAGwALgBkAGwAbAAqAAAATgB0AEQAZQB2AGkAYwBlAEkAbwBDAG8AbgB0AHIAbwBsAEYAaQBsAGUAAAAAAAAAAADcEOoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQAIAAAAbQBhAGkAbgBeAAAAZAA6AFwAYgByAG8AZgBpAGwAZQByAFwAdAByAHUAbgBrAFwAcAByAG8AZgBpAGwAZQByAHQAZQBzAHQAXABwAHIAbwBmAGkAbABlAHIAdABlAHMAdAAuAGMAcABwAA4AAADTFeoAAAAAAFQAAABEADoAXABCAHIAbwBmAGkAbABlAHIAXAB0AHIAdQBuAGsAXABSAGUAbABlAGEAcwBlAFwAUAByAG8AZgBpAGwAZQByAFQAZQBzAHQALgBlAHgAZQBQAAAAcwB0AGQAOgA6AG8AcABlAHIAYQB0AG8AcgA8ADwAPABzAHQAZAA6ADoAYwBoAGEAcgBfAHQAcgBhAGkAdABzADwAYwBoAGEAcgA+ACAAPgCMAAAAYwA6AFwAcAByAG8AZwByAGEAbQAgAGYAaQBsAGUAcwAgACgAeAA4ADYAKQBcAG0AaQBjAHIAbwBzAG8AZgB0ACAAdgBpAHMAdQBhAGwAIABzAHQAdQBkAGkAbwAgADEAMAAuADAAXAB2AGMAXABpAG4AYwBsAHUAZABlAFwAbwBzAHQAcgBlAGEAbQBBAwAATt5IcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUAAxADAAMAAuAGQAbABsAHIAAABzAHQAZAA6ADoAYgBhAHMAaQBjAF8AcwB0AHIAZQBhAG0AYgB1AGYAPABjAGgAYQByACwAcwB0AGQAOgA6AGMAaABhAHIAXwB0AHIAYQBpAHQAcwA8AGMAaABhAHIAPgAgAD4AOgA6AHMAcAB1AHQAYwAAAAAAAAAAAOgUSXIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFAAMQAwADAALgBkAGwAbADCAAAAcwB0AGQAOgA6AGIAYQBzAGkAYwBfAHMAdAByAGUAYQBtAGIAdQBmADwAYwBoAGEAcgAsAHMAdABkADoAOgBjAGgAYQByAF8AdAByAGEAaQB0AHMAPABjAGgAYQByAD4AIAA+ADoAOgBiAGEAcwBpAGMAXwBzAHQAcgBlAGEAbQBiAHUAZgA8AGMAaABhAHIALABzAHQAZAA6ADoAYwBoAGEAcgBfAHQAcgBhAGkAdABzADwAYwBoAGEAcgA+ACAAPgAAAAAAAAAAAM01VXIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAIAAAAcAB1AHQAYwAAAAAAAAAAAOHsUHIAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB0AGUAbQAzADIAXABNAFMAVgBDAFIAMQAwADAALgBkAGwAbAAKAAAAdwByAGkAdABlAAAAAAAAAAAAt/BQcgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHQAZQBtADMAMgBcAE0AUwBWAEMAUgAxADAAMAAuAGQAbABsABoAAABmAGYAbAB1AHMAaABfAG4AbwBsAG8AYwBrAAAAAAAAAAAA6hIcdgAAAABAAAAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAHMAeQBzAHcAbwB3ADYANABcAGsAZQByAG4AZQBsADMAMgAuAGQAbABsABIAAABXAHIAaQB0AGUARgBpAGwAZQAAAAAAAAAAAD0THHYAAAAAQAAAAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABzAHkAcwB3AG8AdwA2ADQAXABrAGUAcgBuAGUA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";
|
|
|
|
public EventFrame EventFrame
|
|
{
|
|
get
|
|
{
|
|
return this[0] as EventFrame;
|
|
}
|
|
}
|
|
|
|
public SamplingFrame SamplingFrame
|
|
{
|
|
get
|
|
{
|
|
return this[Count - 1] as SamplingFrame;
|
|
}
|
|
}
|
|
|
|
public TestFrameCollection()
|
|
{
|
|
DataResponse descriptionResponse = DataResponse.Create(descriptionBoard);
|
|
Add(descriptionResponse);
|
|
|
|
for (int i = 0; i < 32; ++i)
|
|
{
|
|
DataResponse eventResponse = DataResponse.Create(eventFrame);
|
|
Add(eventResponse);
|
|
}
|
|
|
|
DataResponse samplingResponse = DataResponse.Create(samplingFrame);
|
|
Add(samplingResponse);
|
|
}
|
|
}
|
|
|
|
public class TestEventFrame
|
|
{
|
|
public static EventFrame Frame
|
|
{
|
|
get
|
|
{
|
|
return (new TestFrameCollection()).EventFrame;
|
|
}
|
|
}
|
|
|
|
|
|
public static Board<EventBoardItem, EventDescription, EventNode> Board
|
|
{
|
|
get
|
|
{
|
|
return Frame.Board;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class TestSamplingFrame
|
|
{
|
|
public static SamplingFrame Frame
|
|
{
|
|
get
|
|
{
|
|
return (new TestFrameCollection()).SamplingFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class TestSamplingNode
|
|
{
|
|
public static SamplingNode Node
|
|
{
|
|
get
|
|
{
|
|
return (new TestFrameCollection()).SamplingFrame.Root;
|
|
}
|
|
}
|
|
}
|
|
}
|