public void ReportWatsonEvents(UserContext userContext, IList <ClientLogEvent> watsonEvents, Datapoint contextHeader, Datapoint[] context)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();
            int       num       = 0;
            int       num2      = 0;
            List <ClientWatsonDatapointHandler.ClientWatsonReportLogEvent> list = new List <ClientWatsonDatapointHandler.ClientWatsonReportLogEvent>(watsonEvents.Count);
            List <WatsonClientReport> list2 = new List <WatsonClientReport>(watsonEvents.Count);

            foreach (ClientLogEvent clientLogEvent in watsonEvents)
            {
                string ctqName;
                clientLogEvent.TryGetValue <string>("ctq", out ctqName);
                ClientWatsonReportData reportData;
                ProcessingResult       errorResult = this.TryExtractClientWatsonData(clientLogEvent, out reportData);
                if (errorResult.Code != ResultCode.Success)
                {
                    list.Add(new ClientWatsonDatapointHandler.ClientWatsonReportLogEvent(clientLogEvent.Time, userContext, ctqName, reportData.IsUnhandledException, errorResult));
                    num2++;
                }
                else
                {
                    int  hashCode = reportData.OriginalCallStack.GetHashCode();
                    bool flag     = this.parameters.IsErrorOverReportQuota(hashCode);
                    if (flag)
                    {
                        string[] watsonParameters;
                        if (ClientWatsonDatapointHandler.cachedFlavor == null)
                        {
                            ClientWatsonDatapointHandler.CreateClientWatsonReportAndUpdateCache(reportData, out watsonParameters);
                        }
                        else
                        {
                            watsonParameters = WatsonClientReport.BuildWatsonParameters(ClientWatsonDatapointHandler.cachedFlavor, ClientWatsonDatapointHandler.cachedVersion, reportData.TraceComponent, reportData.FunctionName, reportData.ExceptionType, reportData.NormalizedCallStack, reportData.CallStackHash);
                        }
                        list.Add(new ClientWatsonDatapointHandler.ClientWatsonReportLogEvent(clientLogEvent.Time, userContext, ctqName, watsonParameters, reportData.IsUnhandledException, false));
                        num++;
                    }
                    else
                    {
                        string[]           watsonParameters;
                        WatsonClientReport item = ClientWatsonDatapointHandler.CreateClientWatsonReportAndUpdateCache(reportData, out watsonParameters);
                        list2.Add(item);
                        list.Add(new ClientWatsonDatapointHandler.ClientWatsonReportLogEvent(clientLogEvent.Time, userContext, ctqName, watsonParameters, reportData.IsUnhandledException, true));
                    }
                }
            }
            string extraData = ClientWatsonDatapointHandler.BuildExtraDataString(userContext, contextHeader, context, list);

            foreach (WatsonClientReport report in list2)
            {
                this.parameters.ReportAction(report, extraData);
            }
            this.logger.Set(LogDatapointMetadata.WatsonDatapointSkipped, num);
            this.logger.Set(LogDatapointMetadata.WatsonDatapointFailed, num2);
            this.logger.Set(LogDatapointMetadata.WatsonReportingElapsed, stopwatch.ElapsedMilliseconds);
        }