private async void UnpackMRNBtn_OnClick(object sender, RoutedEventArgs e)
        {
            try
            {
                // Find fragment index from row that we click in Datagrid
                if (string.IsNullOrEmpty(_fragmentCollection[_selectedIndex].GUID.Trim()))
                {
                    return;
                }
                var xmlGridData = (XMLFragmentsData)XmlFragmentGrid1.SelectedItem;
                Title = $"{_defaultTitle}::Searching XML Fragment contains GUID {xmlGridData.GUID}";

                // Use fragment index to get Guid value and get most of XML Fragments which contains the same guid,
                // we need some calculation to calculate start index from _messageList data structure. The position of Index user are selecting could be part of fragments.
                // The row that we choose in Datagrid may not be the first one which provide total size.
                // Please note that there could be multiple fragments which use the same GUID so we need more complex logic to handle of this issue.

                var mrnMsgs = _messageList.GetMrnByGuid(xmlGridData.GUID);

                var startIndex = 0;
                if (xmlGridData.MrnFragmentNumber <= 1)
                {
                    startIndex = xmlGridData.Index;
                }
                else
                {
                    // Find the index from mrnMsgs which contains the same GUID and it must has MrnFragmentNumber equals to 1;
                    var currentIndex = mrnMsgs.FindIndex(x => x.FragmentNumber == (_selectedIndex + 1));

                    // Calculate the startIndex from the currentIndex.
                    startIndex =
                        (int)mrnMsgs?.ElementAt <MrnMsg>(currentIndex - (xmlGridData.MrnFragmentNumber - 1))
                        .FragmentNumber;
                }

                var newIndex = mrnMsgs.FindIndex(x => x.FragmentNumber == startIndex);

                // Create New list which contains only all fragments for specific guid so we need to remove the duplicated ones.
                var newList            = new List <MrnMsg>();
                var currentMrnFragment = 1;
                newList.Add(mrnMsgs.ElementAt(newIndex));

                while (++newIndex < mrnMsgs.Count)
                {
                    if (mrnMsgs.ElementAt(newIndex).GetFieldList().ContainsKey(32479))
                    {
                        if (!string.IsNullOrEmpty(mrnMsgs.ElementAt(newIndex).GetFieldList()[32479].Trim()))
                        {
                            currentMrnFragment =
                                HexStringToInt(mrnMsgs.ElementAt(newIndex).GetFieldList()[32479].Trim()) ?? 0;
                        }

                        if (currentMrnFragment == 1)
                        {
                            break;
                        }
                        newList.Add(mrnMsgs.ElementAt(newIndex));
                    }
                }

                Title = $"{_defaultTitle}::Unpacking XML messages containing GUID {xmlGridData.GUID}";

                //Pass the list to MrnFragmentDecoder class and call method UnpackMrnData to unpack it.
                var result = await MrnFragmentDecoder.UnpackMrnDataAsync(newList);

                if (!result.Item1)
                {
                    MessageBox.Show($"Unpack Failed {result.Item3}");
                    return;
                }

                //After passing the steps we expected to receive Json data. Reformat the string and then shows it in Display Windows.
                //We will keep the raw Json data in JsonUnpackToken property so we can save the raw json data to file later.
                var displayWindows = new DisplayMRNData();
                displayWindows.JsonUnpackToken = JToken.Parse(result.Item2);
                displayWindows.RawData         = $"{displayWindows.JsonUnpackToken.ToString(Formatting.Indented)}";
                displayWindows.RawData         = displayWindows.RawData.Replace("\\n", "\r\n");
                displayWindows.RawData         = displayWindows.RawData.Replace("\\t", "\t");
                displayWindows.RawHeaderText   =
                    $"     Found {newList.Count} XML Fragments for GUID {xmlGridData.GUID}    ";

                displayWindows.XmlRawTreeView.Items.Clear();

                foreach (var fragment in newList)
                {
                    var settings = new XmlReaderSettings
                    {
                        ConformanceLevel = ConformanceLevel.Fragment, Async = true, IgnoreWhitespace = true
                    };
                    using (var reader = XmlReader.Create(
                               new StringReader($"{XmlFragments.Get(fragment.FragmentNumber).RawXmlData}"), settings))
                    {
                        var tree = new TreeViewItem
                        {
                            Header =
                                $"{XmlFragments.Get(fragment.FragmentNumber).TimeRawXmlData} {XmlFragments.Get(fragment.FragmentNumber).MsgTypeRawXmlData}",
                            IsExpanded = true
                        };


                        displayWindows.XmlRawTreeView.Items.Add(tree);
                        await BuildTreeAsync(reader, tree);
                    }
                }

                displayWindows.Title = $"DisplayMRNData:: GUID::{xmlGridData.GUID}";
                displayWindows.Show();
                Title = _defaultTitle;
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    $"Unpack compressed data to Json failed: {ex.Message}\r\nData might be corrupted or contains incomplete data");
            }
        }
        private async Task <MrnMsgList> DecodeMrn(XmlFragmentList xmlFragments)
        {
            var messageList = new MrnMsgList();
            await Task.Run(async() =>
            {
                var decodeMrnResult = await MrnFragmentDecoder.DecodeMrnDataAsync(xmlFragments)
                                      .ConfigureAwait(false);
                if (!decodeMrnResult.Item1)
                {
                    MessageBox.Show(decodeMrnResult.Item3);
                    return(null);
                }

                messageList = decodeMrnResult.Item2;

                foreach (var data in xmlFragments.Fragments)
                {
                    var xmlFragment = new XMLFragmentsData
                    {
                        Index          = data.FragmentNumber,
                        RdmMessageType = data.RdmMessageType,
                        TimeStamp      = data.TimeStamp,
                        DomainType     = messageList.Get(data.FragmentNumber).DomainType,
                        MsgDirection   = data.MsgTypeRawXmlData != string.Empty
                            ? data.IsIncomingMsg ? "Incoming" : "Outgoing"
                            : string.Empty,
                        XmlRawData     = data.RawXmlData,
                        GUID           = string.Empty,
                        RequestKeyName = messageList.Get(data.FragmentNumber).RequestKeyName ?? string.Empty,
                        StreamId       = int.Parse(messageList.Get(data.FragmentNumber).GetFragmentAttribs()["streamId"])
                    };

                    if (messageList.Get(data.FragmentNumber).ContainsFieldList)
                    {
                        if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(4271))
                        {
                            if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim()))
                            {
                                var pBuffer =
                                    TraceStringToString(
                                        messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim());
                                xmlFragment.GUID = pBuffer;
                            }
                        }

                        if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(32479))
                        {
                            if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim())
                                )
                            {
                                var mrnFragmentNumber =
                                    HexStringToInt(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim()) ??
                                    0;
                                xmlFragment.MrnFragmentNumber = mrnFragmentNumber;
                            }
                        }
                    }

                    Dispatcher.Invoke(() => { _fragmentCollection.Add(xmlFragment); });
                }

                return(messageList);
            });

            return(messageList);
        }