From c6fafbe6f4994200fbbab0ca61fee1d0d9fcf073 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Mon, 16 Jun 2025 11:00:32 -0700 Subject: [PATCH] Synced with other adaptations --- Adaptation/FileHandlers/APC/FileRead.cs | 10 +- Adaptation/FileHandlers/Archive/FileRead.cs | 10 +- .../CellInstanceConnectionName.cs | 2 +- Adaptation/FileHandlers/Dummy/FileRead.cs | 2 +- Adaptation/FileHandlers/IQSSi/FileRead.cs | 10 +- .../MoveMatchingFiles/FileRead.cs | 380 ++++++++++++------ .../FileHandlers/OpenInsight/FileRead.cs | 81 ++-- .../FileHandlers/OpenInsight/FromIQS.cs | 13 +- .../OpenInsightMetrologyViewer/FileRead.cs | 10 +- .../FileRead.cs | 10 +- Adaptation/FileHandlers/Processed/FileRead.cs | 10 +- Adaptation/FileHandlers/SECS/ProcessData.cs | 1 - Adaptation/FileHandlers/SPaCe/FileRead.cs | 10 +- .../MET08ANLYSDIFAAST230-Development.yml | 163 -------- Adaptation/MET08ANLYSDIFAAST230.yml | 379 +++++++++++------ 15 files changed, 578 insertions(+), 513 deletions(-) diff --git a/Adaptation/FileHandlers/APC/FileRead.cs b/Adaptation/FileHandlers/APC/FileRead.cs index 5e2ab67..a9ed0b0 100644 --- a/Adaptation/FileHandlers/APC/FileRead.cs +++ b/Adaptation/FileHandlers/APC/FileRead.cs @@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.APC; public class FileRead : Shared.FileRead, IFileRead { - public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { _MinFileLength = 10; @@ -120,15 +120,15 @@ public class FileRead : Shared.FileRead, IFileRead private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results; - Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); - _Logistics = new Logistics(reportFullPath, pdsf.Item1); + ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath); + _Logistics = new Logistics(reportFullPath, processDataStandardFormat); SetFileParameterLotIDToLogisticsMID(); - JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); List descriptions = GetDuplicatorDescriptions(jsonElements); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) FileCopy(reportFullPath, dateTime, descriptions); - results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/Archive/FileRead.cs b/Adaptation/FileHandlers/Archive/FileRead.cs index 0e79541..26fc9fd 100644 --- a/Adaptation/FileHandlers/Archive/FileRead.cs +++ b/Adaptation/FileHandlers/Archive/FileRead.cs @@ -18,7 +18,7 @@ public class FileRead : Shared.FileRead, IFileRead private readonly string _JobIdParentDirectory; private readonly string _JobIdArchiveParentDirectory; - public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { _MinFileLength = 10; @@ -144,15 +144,15 @@ public class FileRead : Shared.FileRead, IFileRead private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results; - Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); - _Logistics = new Logistics(reportFullPath, pdsf.Item1); + ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath); + _Logistics = new Logistics(reportFullPath, processDataStandardFormat); SetFileParameterLotIDToLogisticsMID(); - JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); List descriptions = GetDuplicatorDescriptions(jsonElements); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) MoveArchive(reportFullPath, dateTime); - results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/CellInstanceConnectionName.cs b/Adaptation/FileHandlers/CellInstanceConnectionName.cs index f9f60a3..6200904 100644 --- a/Adaptation/FileHandlers/CellInstanceConnectionName.cs +++ b/Adaptation/FileHandlers/CellInstanceConnectionName.cs @@ -9,7 +9,7 @@ namespace Adaptation.FileHandlers; public class CellInstanceConnectionName { - internal static IFileRead Get(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, int? connectionCount) + internal static IFileRead Get(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, int? connectionCount) { IFileRead result = cellInstanceConnectionName switch { diff --git a/Adaptation/FileHandlers/Dummy/FileRead.cs b/Adaptation/FileHandlers/Dummy/FileRead.cs index 916f5d7..3b777eb 100644 --- a/Adaptation/FileHandlers/Dummy/FileRead.cs +++ b/Adaptation/FileHandlers/Dummy/FileRead.cs @@ -23,7 +23,7 @@ public class FileRead : Shared.FileRead, IFileRead private int _LastDummyRunIndex; private readonly string[] _CellNames; - public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { _MinFileLength = 10; diff --git a/Adaptation/FileHandlers/IQSSi/FileRead.cs b/Adaptation/FileHandlers/IQSSi/FileRead.cs index 12bc214..a60ec91 100644 --- a/Adaptation/FileHandlers/IQSSi/FileRead.cs +++ b/Adaptation/FileHandlers/IQSSi/FileRead.cs @@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.IQSSi; public class FileRead : Shared.FileRead, IFileRead { - public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { _MinFileLength = 10; @@ -119,15 +119,15 @@ public class FileRead : Shared.FileRead, IFileRead private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results; - Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath); - _Logistics = new Logistics(reportFullPath, pdsf.Item1); + ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath); + _Logistics = new Logistics(reportFullPath, processDataStandardFormat); SetFileParameterLotIDToLogisticsMID(); - JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf); + JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); List descriptions = GetDuplicatorDescriptions(jsonElements); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) FileCopy(reportFullPath, dateTime, descriptions); - results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs index 2d8a495..2ee4e12 100644 --- a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs +++ b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs @@ -5,17 +5,73 @@ using Adaptation.Shared.Duplicator; using Adaptation.Shared.Methods; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; +using System.Linq; using System.Text; using System.Text.Json; using System.Threading; namespace Adaptation.FileHandlers.MoveMatchingFiles; +#nullable enable + public class FileRead : Shared.FileRead, IFileRead { - public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : + internal class PreWith + { + + internal string ErrFile { get; private set; } + internal string CheckFile { get; private set; } + internal string MatchingFile { get; private set; } + internal string CheckDirectory { get; private set; } + internal string NoWaitDirectory { get; private set; } + + internal PreWith(string checkDirectory, + string checkFile, + string errFile, + string matchingFile, + string noWaitDirectory) + { + ErrFile = errFile; + CheckFile = checkFile; + MatchingFile = matchingFile; + CheckDirectory = checkDirectory; + NoWaitDirectory = noWaitDirectory; + } + + } + + internal class Pre + { + + internal string MatchingFile { get; private set; } + internal string CheckFile { get; private set; } + + internal Pre(string matchingFile, string checkFile) + { + MatchingFile = matchingFile; + CheckFile = checkFile; + } + + } + + internal class Post + { + + internal string ErrFile { get; private set; } + internal string CheckFile { get; private set; } + + internal Post(string checkFile, string errFile) + { + ErrFile = errFile; + CheckFile = checkFile; + } + + } + + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { _MinFileLength = 10; @@ -41,7 +97,8 @@ public class FileRead : Shared.FileRead, IFileRead Move(extractResults); } - void IFileRead.WaitForThread() => WaitForThread(thread: null, threadExceptions: null); + void IFileRead.WaitForThread() => + WaitForThread(thread: null, threadExceptions: null); string IFileRead.GetEventDescription() { @@ -88,7 +145,7 @@ public class FileRead : Shared.FileRead, IFileRead DateTime dateTime = DateTime.Now; results = GetExtractResult(reportFullPath, dateTime); if (results.Item3 is null) - results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]"), results.Item4); + results = new Tuple>(results.Item1, Array.Empty(), JsonSerializer.Deserialize("[]") ?? throw new Exception(), results.Item4); if (results.Item3.Length > 0 && _IsEAFHosted) WritePDSF(this, results.Item3); UpdateLastTicksDuration(DateTime.Now.Ticks - dateTime.Ticks); @@ -104,7 +161,73 @@ public class FileRead : Shared.FileRead, IFileRead return results; } - private static List GetSearchDirectories(int numberLength, string parentDirectory) + private static ProcessDataStandardFormatMapping GetProcessDataStandardFormatMapping(string processDataStandardFormatMappingOldColumnNames, string processDataStandardFormatMappingNewColumnNames, string processDataStandardFormatMappingColumnIndices) + { + ProcessDataStandardFormatMapping result; + string[] segmentsB; + List distinct = new(); + Dictionary keyValuePairs = new(); + string args4 = "Time,Test,Count,MesEntity,HeaderUniqueId,UniqueId,Id,Recipe,Date,AreaDeltaFromLastRun,GLimit,HGCV1"; + string args5 = "Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,HGCV1"; + string args6 = "RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09,HGCV1"; + string args7 = "FlatZMean|MeanFlatZ,GradeMean|MeanGrade,NAvgMean|MeanNAvg,NslMean|MeanNsl,PhaseMean|MeanPhase,RhoAvgMean|MeanRhoAvg,RhoslMean|MeanRhosl,RsMean|MeanRs,VdMean|MeanVd,FlatZRadialGradient|RadialGradientFlatZ,GradeRadialGradient|RadialGradientGrade,NAvgRadialGradient|RadialGradientNAvg,NslRadialGradient|RadialGradientNsl,PhaseRadialGradient|RadialGradientPhase,RhoAvgRadialGradient|RadialGradientRhoAvg,RhoslRadialGradient|RadialGradientRhosl,RsRadialGradient|RadialGradientRs,VdRadialGradient|RadialGradientVd,FlatZStdDev|StandardDeviationPercentageFlatZ,GradeStdDev|StandardDeviationPercentageGrade,NAvgStdDev|StandardDeviationPercentageNAvg,NslStdDev|StandardDeviationPercentageNsl,PhaseStdDev|StandardDeviationPercentagePhase,RhoAvgStdDev|StandardDeviationPercentageRhoAvg,RhoslStdDev|StandardDeviationPercentageRhosl,RsStdDev|StandardDeviationPercentageRs,VdStdDev|StandardDeviationPercentageVd,|HGCV1"; + // string args8 = "Time,A_LOGISTICS,B_LOGISTICS,Test,Count,Index,MesEntity,Date,Employee,Lot,PSN,Reactor,Recipe,Area,Folder,HeaderUniqueId,Id,Layer,Model,Pattern,Phase,Plan,RampRate,RDS,SetupFile,StartVoltage,StopVoltage,UniqueId,Wafer,WaferSize,Zone,Ccomp,CondType,FlatZ,FlatZMean,FlatZRadialGradient,FlatZStdDev,GLimit,Grade,GradeMean,GradeRadialGradient,GradeStdDev,NAvg,NAvgMean,NAvgRadialGradient,NAvgStdDev,Nsl,NslMean,NslRadialGradient,NslStdDev,PhaseMean,PhaseRadialGradient,PhaseStdDev,RhoAvg,RhoAvgMean,RhoAvgRadialGradient,RhoAvgStdDev,RhoMethod,Rhosl,RhoslMean,RhoslRadialGradient,RhoslStdDev,RsMean,RsRadialGradient,RsStdDev,Vd,VdMean,VdRadialGradient,VdStdDev,Variation,AreaDeltaFromLastRun,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; + // string args9 = "Time,A_LOGISTICS,B_LOGISTICS,Index,Operator,StartVoltage,Wafer,StopVoltage,Lot,RampRate,Plan,GLimit,Date,Time,SetupFile,WaferSize,Folder,Ccomp,Pattern,Area,CondType,RhoMethod,Model,MeanNAvg,MeanNsl,MeanVd,MeanFlatZ,MeanRhoAvg,MeanRhosl,MeanPhase,MeanGrade,MeanRs,StandardDeviationPercentageNAvg,StandardDeviationPercentageNsl,StandardDeviationPercentageVd,StandardDeviationPercentageFlatZ,StandardDeviationPercentageRhoAvg,StandardDeviationPercentageRhosl,StandardDeviationPercentagePhase,StandardDeviationPercentageGrade,StandardDeviationPercentageRs,RadialGradientNAvg,RadialGradientNsl,RadialGradientVd,RadialGradientFlatZ,RadialGradientRhoAvg,RadialGradientRhosl,RadialGradientPhase,RadialGradientGrade,RadialGradientRs,Site,X,Y,NAvg,RhoAvg,Nsl,Rhosl,Vd,Phase,FlatZ,Grade,XLeft,XRight,BottomY,TopY,RDS,PSN,Reactor,Layer,Zone,Employee,InferredLot,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; + // string args10 = "0,1,2,-1,-1,3,-1,12,70,8,66,67,-1,19,16,-1,-1,68,22,18,58,10,9,65,14,5,7,-1,6,15,69,17,20,59,26,44,35,11,60,30,48,39,53,23,41,32,55,24,42,33,29,47,38,54,27,45,36,21,56,28,46,37,31,49,40,57,25,43,34,81,80,72,73,74,75,76,77,78,79,83,84,85,86,87,88,89,90,91"; + string[] segments = args7.Split(','); + ReadOnlyCollection ignoreColumns = new(args4.Split(',')); + ReadOnlyCollection backfillColumns = new(args5.Split(',')); + ReadOnlyCollection indexOnlyColumns = new(args6.Split(',')); + ReadOnlyCollection newColumnNames = new(processDataStandardFormatMappingNewColumnNames.Split(',')); + ReadOnlyCollection oldColumnNames = new(processDataStandardFormatMappingOldColumnNames.Split(',')); + ReadOnlyCollection columnIndices = new(processDataStandardFormatMappingColumnIndices.Split(',').Select(int.Parse).ToArray()); + foreach (string segment in segments) + { + segmentsB = segment.Split('|'); + if (segmentsB.Length != 2) + continue; + if (distinct.Contains(segmentsB[0])) + continue; + distinct.Add(segmentsB[0]); + keyValuePairs.Add(segmentsB[0], segmentsB[1]); + } + result = new(backfillColumns: backfillColumns, + columnIndices: columnIndices, + newColumnNames: newColumnNames, + ignoreColumns: ignoreColumns, + indexOnlyColumns: indexOnlyColumns, + keyValuePairs: new(keyValuePairs), + oldColumnNames: oldColumnNames); + return result; + } + + private static ReadOnlyCollection GetPreWithCollection(ReadOnlyCollection
 preCollection)
+    {
+        List results = new();
+        string errFile;
+        PreWith preWith;
+        string? checkDirectory;
+        string noWaitDirectory;
+        foreach (Pre pre in preCollection)
+        {
+            errFile = string.Concat(pre.CheckFile, ".err");
+            checkDirectory = Path.GetDirectoryName(pre.CheckFile);
+            if (string.IsNullOrEmpty(checkDirectory))
+                continue;
+            if (!Directory.Exists(checkDirectory))
+                _ = Directory.CreateDirectory(checkDirectory);
+            noWaitDirectory = Path.Combine(checkDirectory, "NoWaitDirectory");
+            preWith = new(checkDirectory: checkDirectory,
+                          checkFile: pre.CheckFile,
+                          errFile: errFile,
+                          matchingFile: pre.MatchingFile,
+                          noWaitDirectory: noWaitDirectory);
+            results.Add(preWith);
+        }
+        return results.AsReadOnly();
+    }
+
+    private static ReadOnlyCollection GetSearchDirectories(int numberLength, string parentDirectory)
     {
         List results = new();
         string[] directories = Directory.GetDirectories(parentDirectory, "*", SearchOption.TopDirectoryOnly);
@@ -115,10 +238,133 @@ public class FileRead : Shared.FileRead, IFileRead
             results.Add(directory);
         }
         results.Sort();
+        return results.AsReadOnly();
+    }
+
+    private static void CreatePointerFile(int numberLength, string parentDirectory, ReadOnlyCollection matchingFiles)
+    {
+        string checkFile;
+        string writeFile;
+        string? directoryName;
+        int parentDirectoryLength = parentDirectory.Length;
+        foreach (string matchingFile in matchingFiles)
+        {
+            directoryName = Path.GetDirectoryName(matchingFile);
+            if (directoryName is null)
+                continue;
+            checkFile = $"{matchingFile[0]}{directoryName.Substring(parentDirectoryLength + numberLength + 1)}";
+            writeFile = Path.Combine(parentDirectory, $"{directoryName.Substring(parentDirectory.Length + 1, numberLength)}.txt");
+            if (File.Exists(writeFile))
+                continue;
+            File.AppendAllLines(writeFile, new string[] { parentDirectory, matchingFile, directoryName, checkFile });
+        }
+    }
+
+    private static ReadOnlyCollection
 GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection matchingFiles)
+    {
+        List
 results = new();
+        Pre pre;
+        string checkFile;
+        int parentDirectoryLength = parentDirectory.Length;
+        foreach (string matchingFile in matchingFiles)
+        {
+            checkFile = $"{matchingFile[0]}{matchingFile.Substring(parentDirectoryLength + numberLength + 1)}";
+            pre = new(matchingFile, checkFile);
+            results.Add(pre);
+        }
+        return results.AsReadOnly();
+    }
+
+    private void MoveCollection(DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, ReadOnlyCollection preWithCollection)
+    {
+        ReadOnlyCollection postCollection = GetPostCollection(dateTime, processDataStandardFormat, preWithCollection);
+        if (postCollection.Count != 0)
+        {
+            Thread.Sleep(500);
+            StringBuilder stringBuilder = new();
+            foreach (Post post in postCollection)
+            {
+                if (File.Exists(post.ErrFile))
+                    _ = stringBuilder.AppendLine(File.ReadAllText(post.ErrFile));
+                if (File.Exists(post.CheckFile))
+                    _ = stringBuilder.AppendLine($"<{post.CheckFile}> was not consumed by the end!");
+            }
+            if (stringBuilder.Length > 0)
+                throw new Exception(stringBuilder.ToString());
+        }
+    }
+
+    private ReadOnlyCollection GetPostCollection(DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, ReadOnlyCollection preWithCollection)
+    {
+        List results = new();
+        Post post;
+        long preWait;
+        foreach (PreWith preWith in preWithCollection)
+        {
+            if (!_IsEAFHosted)
+                continue;
+            if (!_StaticRuns.TryGetValue(_Logistics.Sequence, out List? wsResults))
+                wsResults = null;
+            ProcessDataStandardFormat.Write(preWith.CheckFile, processDataStandardFormat, wsResults);
+            File.Delete(preWith.MatchingFile);
+            if (Directory.Exists(preWith.NoWaitDirectory))
+            {
+                post = new(preWith.CheckFile, preWith.ErrFile);
+                results.Add(post);
+                continue;
+            }
+            if (_FileConnectorConfiguration?.FileHandleWaitTime is null)
+                preWait = DateTime.Now.AddMilliseconds(1234).Ticks;
+            else
+                preWait = DateTime.Now.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
+            for (short i = 0; i < short.MaxValue; i++)
+            {
+                if (DateTime.Now.Ticks > preWait)
+                    break;
+                Thread.Sleep(500);
+            }
+            for (int i = 0; i < int.MaxValue; i++)
+            {
+                if (File.Exists(preWith.ErrFile))
+                    throw new Exception(File.ReadAllText(preWith.ErrFile));
+                if (!File.Exists(preWith.CheckFile))
+                    break;
+                if (new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks).TotalSeconds > _BreakAfterSeconds)
+                    throw new Exception($"Not all files were consumed after {_BreakAfterSeconds} second(s)!");
+                Thread.Sleep(500);
+            }
+        }
+        return results.AsReadOnly();
+    }
+
+    private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
+    {
+        Tuple> results = new(string.Empty, Array.Empty(), Array.Empty(), new List());
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
+        if (!_IsEAFHosted)
+            ProcessDataStandardFormat.Write("../../.pdsf", processDataStandardFormat, wsResults: null);
+        SetFileParameterLotIDToLogisticsMID();
+        int numberLength = 2;
+        long ticks = dateTime.Ticks;
+        string parentParentDirectory = GetParentParent(reportFullPath);
+        ReadOnlyCollection searchDirectories = GetSearchDirectories(numberLength, parentParentDirectory);
+        ReadOnlyCollection matchingFiles = GetMatchingFiles(ticks, reportFullPath, searchDirectories);
+        if (matchingFiles.Count != searchDirectories.Count)
+            throw new Exception($"Didn't find all files after {_BreakAfterSeconds} second(s)!");
+        if (_IsEAFHosted)
+        {
+            try
+            { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
+            catch (Exception) { }
+        }
+        ReadOnlyCollection
 preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles);
+        ReadOnlyCollection preWithCollection = GetPreWithCollection(preCollection);
+        MoveCollection(dateTime, processDataStandardFormat, preWithCollection);
         return results;
     }
 
-    private List GetMatchingFiles(long ticks, string reportFullPath, List searchDirectories)
+    private ReadOnlyCollection GetMatchingFiles(long ticks, string reportFullPath, ReadOnlyCollection searchDirectories)
     {
         List results = new();
         string[] found;
@@ -137,129 +383,7 @@ public class FileRead : Shared.FileRead, IFileRead
                     break;
             }
         }
-        return results;
-    }
-
-    private static List<(string matchingFile, string checkFile)> GetCollection(int numberLength, string parentDirectory, List matchingFiles)
-    {
-        List<(string matchingFile, string checkFile)> results = new();
-        string checkFile;
-        int parentDirectoryLength = parentDirectory.Length;
-        foreach (string matchingFile in matchingFiles)
-        {
-            checkFile = $"{matchingFile[0]}{matchingFile.Substring(parentDirectoryLength + numberLength + 1)}";
-            results.Add(new(matchingFile, checkFile));
-        }
-        return results;
-    }
-
-    private static List<(string, string, string, string, string)> GetCollection(List<(string matchingFile, string checkFile)> collection)
-    {
-        List<(string, string, string, string, string)> results = new();
-        string errFile;
-        string checkDirectory;
-        string noWaitDirectory;
-        foreach ((string matchingFile, string checkFile) in collection)
-        {
-            errFile = string.Concat(checkFile, ".err");
-            checkDirectory = Path.GetDirectoryName(checkFile);
-            if (!Directory.Exists(checkDirectory))
-                _ = Directory.CreateDirectory(checkDirectory);
-            noWaitDirectory = Path.Combine(checkDirectory, "NoWaitDirectory");
-            results.Add(new(matchingFile, checkFile, errFile, checkDirectory, noWaitDirectory));
-        }
-        return results;
-    }
-
-    private void MoveCollection(DateTime dateTime, List<(string matchingFile, string checkFile)> collection)
-    {
-        long preWait;
-        List<(string checkFile, string errFile)> postCollection = new();
-        foreach ((string matchingFile, string checkFile, string errFile, string checkDirectory, string noWaitDirectory) in GetCollection(collection))
-        {
-            File.Move(matchingFile, checkFile);
-            if (Directory.Exists(noWaitDirectory))
-            {
-                postCollection.Add(new(checkFile, errFile));
-                continue;
-            }
-            if (_FileConnectorConfiguration?.FileHandleWaitTime is null)
-                preWait = DateTime.Now.AddMilliseconds(1234).Ticks;
-            else
-                preWait = DateTime.Now.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
-            for (short i = 0; i < short.MaxValue; i++)
-            {
-                if (DateTime.Now.Ticks > preWait)
-                    break;
-                Thread.Sleep(500);
-            }
-            for (int i = 0; i < int.MaxValue; i++)
-            {
-                if (File.Exists(errFile))
-                    throw new Exception(File.ReadAllText(errFile));
-                if (!File.Exists(checkFile))
-                    break;
-                if (new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks).TotalSeconds > _BreakAfterSeconds)
-                    throw new Exception($"Not all files were consumed after {_BreakAfterSeconds} second(s)!");
-                Thread.Sleep(500);
-            }
-        }
-        if (postCollection.Count != 0)
-        {
-            Thread.Sleep(500);
-            StringBuilder stringBuilder = new();
-            foreach ((string checkFile, string errFile) in postCollection)
-            {
-                if (File.Exists(errFile))
-                    _ = stringBuilder.AppendLine(File.ReadAllText(errFile));
-                if (File.Exists(checkFile))
-                    _ = stringBuilder.AppendLine($"<{checkFile}> was not consumed by the end!");
-            }
-            if (stringBuilder.Length > 0)
-                throw new Exception(stringBuilder.ToString());
-        }
-    }
-
-    private static void CreatePointerFile(int numberLength, string parentDirectory, List matchingFiles)
-    {
-#nullable enable
-        string checkFile;
-        string writeFile;
-        string? directoryName;
-        int parentDirectoryLength = parentDirectory.Length;
-        foreach (string matchingFile in matchingFiles)
-        {
-            directoryName = Path.GetDirectoryName(matchingFile);
-            if (directoryName is null)
-                continue;
-            checkFile = $"{matchingFile[0]}{directoryName.Substring(parentDirectoryLength + numberLength + 1)}";
-            writeFile = Path.Combine(parentDirectory, $"{directoryName.Substring(parentDirectory.Length + 1, numberLength)}.txt");
-            if (File.Exists(writeFile))
-                continue;
-            File.AppendAllLines(writeFile, new string[] { parentDirectory, matchingFile, directoryName, checkFile });
-        }
-#nullable disable
-    }
-
-    private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
-    {
-        Tuple> results = new(string.Empty, null, null, new List());
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
-        SetFileParameterLotIDToLogisticsMID();
-        int numberLength = 2;
-        long ticks = dateTime.Ticks;
-        string parentParentDirectory = GetParentParent(reportFullPath);
-        List searchDirectories = GetSearchDirectories(numberLength, parentParentDirectory);
-        List matchingFiles = GetMatchingFiles(ticks, reportFullPath, searchDirectories);
-        if (matchingFiles.Count != searchDirectories.Count)
-            throw new Exception($"Didn't find all files after {_BreakAfterSeconds} second(s)!");
-        try
-        { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
-        catch (Exception) { }
-        List<(string matchingFile, string checkFile)> collection = GetCollection(numberLength, parentParentDirectory, matchingFiles);
-        MoveCollection(dateTime, collection);
-        return results;
+        return results.AsReadOnly();
     }
 
 }
\ No newline at end of file
diff --git a/Adaptation/FileHandlers/OpenInsight/FileRead.cs b/Adaptation/FileHandlers/OpenInsight/FileRead.cs
index ddbe48f..d495eb9 100644
--- a/Adaptation/FileHandlers/OpenInsight/FileRead.cs
+++ b/Adaptation/FileHandlers/OpenInsight/FileRead.cs
@@ -9,7 +9,6 @@ using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Linq;
-using System.Text;
 using System.Text.Json;
 
 namespace Adaptation.FileHandlers.OpenInsight;
@@ -18,10 +17,9 @@ public class FileRead : Shared.FileRead, IFileRead
 {
 
     private readonly string _IqsConnectionString;
-    private readonly string _OpenInsightFilePattern;
     private readonly string _OpenInsightApiECDirectory;
 
-    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
         base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
     {
         _MinFileLength = 10;
@@ -35,7 +33,6 @@ public class FileRead : Shared.FileRead, IFileRead
             throw new Exception(cellInstanceConnectionName);
         _IqsConnectionString = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.ConnectionString");
         _OpenInsightApiECDirectory = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "API.EC.Directory");
-        _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern");
     }
 
     void IFileRead.Move(Tuple> extractResults, Exception exception)
@@ -113,23 +110,9 @@ public class FileRead : Shared.FileRead, IFileRead
         return results;
     }
 
-    internal static string GetLines(Logistics logistics, List descriptions)
-    {
-        StringBuilder results = new();
-        SECS.Description x = descriptions[0];
-        char del = logistics.MesEntity == x.Reactor ? '\t' : '~';
-        _ = results.Append(x.PSN).Append(del)
-            .Append(x.Reactor).Append(del)
-            .Append(logistics.MesEntity).Append(del)
-            .Append(x.RDS).Append(del)
-            .Append(x.Recipe).Append(del)
-            .Append(x.Employee).Append(del)
-            .Append(x.SlotNumber).Append(del);
-        return results.ToString();
-    }
-
-    private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, string logistics, List descriptions, Test[] tests)
+    private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, List descriptions, Test[] tests)
     {
+        string duplicateFile;
         bool isDummyRun = false;
         List<(Shared.Properties.IScopeInfo, string)> collection = new();
         string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName);
@@ -145,49 +128,51 @@ public class FileRead : Shared.FileRead, IFileRead
             if (!Directory.Exists(duplicateDirectory))
                 _ = Directory.CreateDirectory(duplicateDirectory);
         }
-        string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath));
-        if (descriptions.Count != 0 && tests.Length != 0)
+        if (descriptions.Count == 0 || tests.Length == 0)
+            duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath));
+        else
         {
-            string lines = GetLines(_Logistics, descriptions);
-            if (!string.IsNullOrEmpty(lines))
+            long? subgroupId;
+            string fileName = Path.GetFileName(reportFullPath);
+            long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks;
+            long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
+            if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN))
+                subgroupId = null;
+            else
+                (subgroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait);
+            if (_StaticRuns.TryGetValue(_Logistics.Sequence, out List wsResults))
             {
-                long? subGroupId;
-                long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks;
-                long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks;
-                if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN))
-                    subGroupId = null;
-                else
-                    (subGroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait);
-                if (subGroupId is null)
-                    collection.Add(new(new ScopeInfo(tests[0], _OpenInsightFilePattern), lines));
-                else
-                    collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} {_OpenInsightFilePattern}"), lines));
-                if (_StaticRuns.TryGetValue(_Logistics.Sequence, out List values))
-                {
-                    if (values.Count != 1)
-                        throw new Exception($"{nameof(_StaticRuns)} {values.Count} != 1 {_Logistics.Sequence}!");
-                    values[0] = $"{values[0]}|{subGroupId}";
-                }
-                string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
-                FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, logistics, descriptions.First(), lines, subGroupId, weekOfYear);
+                if (wsResults is null || wsResults.Count != 1)
+                    throw new NullReferenceException($"{nameof(wsResults)} {wsResults?.Count} != 1 {_Logistics.Sequence}!");
+                lock (_StaticRuns)
+                    wsResults[0] = WS.Results.Get(wsResults[0], subgroupId);
             }
+            if (!fileName.StartsWith("Viewer"))
+                duplicateFile = Path.Combine(duplicateDirectory, $"{subgroupId} {fileName}".TrimStart());
+            else
+                duplicateFile = Path.Combine(duplicateDirectory, $"{$"Viewer {subgroupId}".TrimEnd()} {fileName.Replace("Viewer", string.Empty)}");
+            string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
+            FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, processDataStandardFormat, descriptions.First(), subgroupId, weekOfYear);
         }
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
+        {
+            File.Copy(reportFullPath, duplicateFile, overwrite: true);
             WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile);
+        }
     }
 
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results;
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
         SetFileParameterLotIDToLogisticsMID();
-        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf);
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
         List descriptions = SECS.ProcessData.GetDescriptions(jsonElements);
         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
-            SaveOpenInsightFile(reportFullPath, dateTime, pdsf.Item1, descriptions, tests);
-        results = new Tuple>(pdsf.Item1, tests, jsonElements, new List());
+            SaveOpenInsightFile(reportFullPath, dateTime, processDataStandardFormat, descriptions, tests);
+        results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List());
         return results;
     }
 
diff --git a/Adaptation/FileHandlers/OpenInsight/FromIQS.cs b/Adaptation/FileHandlers/OpenInsight/FromIQS.cs
index dcb41d9..1a0a234 100644
--- a/Adaptation/FileHandlers/OpenInsight/FromIQS.cs
+++ b/Adaptation/FileHandlers/OpenInsight/FromIQS.cs
@@ -227,7 +227,7 @@ public class FromIQS
     private static void FlagDuplicates(string connectionString, string json)
     {
         JsonElement[]? jsonElements = JsonSerializer.Deserialize(json);
-        JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true};
+        JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
         if (jsonElements is not null && jsonElements.Length != 0 && jsonElements[0].ValueKind == JsonValueKind.Object)
         {
             Root? root;
@@ -324,7 +324,7 @@ public class FromIQS
         return new(result, count, commandText);
     }
 
-    private static string GetJson(Logistics logistics, string logisticLines, SECS.Description description)
+    private static string GetJson(Logistics logistics, ProcessDataStandardFormat processDataStandardFormat, SECS.Description description)
     {
         string result;
         StringBuilder stringBuilder = new();
@@ -344,7 +344,7 @@ public class FromIQS
         string safeValue;
         string[] segments;
         string serializerValue;
-        foreach (string line in logisticLines.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
+        foreach (string line in processDataStandardFormat.Logistics)
         {
             segments = line.Split('\t');
             if (segments.Length < 2)
@@ -375,11 +375,11 @@ public class FromIQS
         return result;
     }
 
-    internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, string logisticLines, SECS.Description description, string lines, long? subGroupId, string weekOfYear)
+    internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, ProcessDataStandardFormat processDataStandardFormat, SECS.Description description, long? subGroupId, string weekOfYear)
     {
         string checkFile;
         string fileName = Path.GetFileName(reportFullPath);
-        string json = GetJson(logistics, logisticLines, description);
+        string json = GetJson(logistics, processDataStandardFormat, description);
         string? ecPathRoot = Path.GetPathRoot(openInsightApiECDirectory);
         bool ecExists = ecPathRoot is not null && Directory.Exists(ecPathRoot);
         string weekYear = $"{logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}";
@@ -389,9 +389,6 @@ public class FromIQS
         checkFile = Path.Combine(ecDirectory, fileName);
         if (ecExists && !File.Exists(checkFile))
             File.Copy(reportFullPath, checkFile);
-        checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt");
-        if (ecExists && !File.Exists(checkFile))
-            File.WriteAllText(checkFile, lines);
         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json");
         if (ecExists && !File.Exists(checkFile))
             File.WriteAllText(checkFile, json);
diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs
index 4f44e03..b54550b 100644
--- a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs
+++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs
@@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.OpenInsightMetrologyViewer;
 public class FileRead : Shared.FileRead, IFileRead
 {
 
-    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
         base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
     {
         _MinFileLength = 10;
@@ -112,15 +112,15 @@ public class FileRead : Shared.FileRead, IFileRead
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results;
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
         SetFileParameterLotIDToLogisticsMID();
-        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf);
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
         List descriptions = SECS.ProcessData.GetDescriptions(jsonElements);
         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
             SendData(reportFullPath, dateTime, descriptions);
-        results = new Tuple>(pdsf.Item1, tests, jsonElements, new List());
+        results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List());
         return results;
     }
 
diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs
index 5d9562b..c2e8d52 100644
--- a/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs
+++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs
@@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.OpenInsightMetrologyViewerAttachments;
 public class FileRead : Shared.FileRead, IFileRead
 {
 
-    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
         base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
     {
         _MinFileLength = 10;
@@ -114,15 +114,15 @@ public class FileRead : Shared.FileRead, IFileRead
 #pragma warning restore IDE0060
     {
         Tuple> results;
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
         SetFileParameterLotIDToLogisticsMID();
-        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf);
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
         List descriptions = SECS.ProcessData.GetDescriptions(jsonElements);
         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
             PostOpenInsightMetrologyViewerAttachments(descriptions);
-        results = new Tuple>(pdsf.Item1, tests, jsonElements, new List());
+        results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List());
         return results;
     }
 
diff --git a/Adaptation/FileHandlers/Processed/FileRead.cs b/Adaptation/FileHandlers/Processed/FileRead.cs
index 1d0131b..ef41a9b 100644
--- a/Adaptation/FileHandlers/Processed/FileRead.cs
+++ b/Adaptation/FileHandlers/Processed/FileRead.cs
@@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.Processed;
 public class FileRead : Shared.FileRead, IFileRead
 {
 
-    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
         base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
     {
         _MinFileLength = 10;
@@ -112,13 +112,13 @@ public class FileRead : Shared.FileRead, IFileRead
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results;
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
         SetFileParameterLotIDToLogisticsMID();
-        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf);
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
         List descriptions = GetDuplicatorDescriptions(jsonElements);
         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
-        results = new Tuple>(pdsf.Item1, tests, jsonElements, new List());
+        results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List());
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
             DirectoryMove(reportFullPath, dateTime, descriptions);
         return results;
diff --git a/Adaptation/FileHandlers/SECS/ProcessData.cs b/Adaptation/FileHandlers/SECS/ProcessData.cs
index e0fc96e..fadd3f2 100644
--- a/Adaptation/FileHandlers/SECS/ProcessData.cs
+++ b/Adaptation/FileHandlers/SECS/ProcessData.cs
@@ -26,7 +26,6 @@ public class ProcessData : IProcessData
 
     public ProcessData(IFileRead fileRead, Logistics logistics, List fileInfoCollection, string ghostPCLFileName, string pdfTextStripperFileName)
     {
-        fileInfoCollection.Clear();
         _Details = new List();
         JobID = logistics.JobID;
         MesEntity = logistics.MesEntity;
diff --git a/Adaptation/FileHandlers/SPaCe/FileRead.cs b/Adaptation/FileHandlers/SPaCe/FileRead.cs
index a8155b6..2e0f55a 100644
--- a/Adaptation/FileHandlers/SPaCe/FileRead.cs
+++ b/Adaptation/FileHandlers/SPaCe/FileRead.cs
@@ -14,7 +14,7 @@ namespace Adaptation.FileHandlers.SPaCe;
 public class FileRead : Shared.FileRead, IFileRead
 {
 
-    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
+    public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
         base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null)
     {
         _MinFileLength = 10;
@@ -117,15 +117,15 @@ public class FileRead : Shared.FileRead, IFileRead
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results;
-        Tuple pdsf = ProcessDataStandardFormat.GetLogisticsColumnsAndBody(reportFullPath);
-        _Logistics = new Logistics(reportFullPath, pdsf.Item1);
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
         SetFileParameterLotIDToLogisticsMID();
-        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(pdsf);
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
         List descriptions = GetDuplicatorDescriptions(jsonElements);
         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
             FileCopy(reportFullPath, dateTime, descriptions);
-        results = new Tuple>(pdsf.Item1, tests, jsonElements, new List());
+        results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List());
         return results;
     }
 
diff --git a/Adaptation/MET08ANLYSDIFAAST230-Development.yml b/Adaptation/MET08ANLYSDIFAAST230-Development.yml
index 22ae64d..e69de29 100644
--- a/Adaptation/MET08ANLYSDIFAAST230-Development.yml
+++ b/Adaptation/MET08ANLYSDIFAAST230-Development.yml
@@ -1,163 +0,0 @@
-trigger:
-  branches:
-    include:
-      - Development
-  paths:
-    include:
-      - "Adaptation/*"
-
-pool:
-  name: eaf
-  demands: MET08ANLYSDIFAAST230-Development
-
-steps:
-  - script: |
-      set coreVersion=net7.0
-      echo %coreVersion%
-      echo ##vso[task.setvariable variable=CoreVersion;]%coreVersion%
-      echo $(CoreVersion)
-    displayName: CoreVersion
-
-  - script: |
-      set configuration=Debug
-      echo %configuration%
-      echo ##vso[task.setvariable variable=Configuration;]%configuration%
-      echo $(Configuration)
-    displayName: Configuration
-
-  - script: |
-      set nugetSource=https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/index.json;D:/vsts-agent-win-x64-2.210.1-eaf/nuget
-      echo %nugetSource%
-      echo ##vso[task.setvariable variable=NugetSource;]%nugetSource%
-      echo $(NugetSource)
-    displayName: NugetSource
-
-  - script: |
-      set gitCommit=$(Build.SourceVersion)
-      set gitCommitSeven=%gitCommit:~0,7%
-      echo %gitCommitSeven%
-      echo ##vso[task.setvariable variable=GitCommitSeven;]%gitCommitSeven%
-      echo $(GitCommitSeven)
-    displayName: GitCommitSeven
-
-  - script: |
-      echo $(Build.BuildId)
-      echo $(Build.Reason)
-      echo $(Build.Repository.Id)
-      echo $(Build.Repository.Name)
-      echo $(Build.SourceVersion)
-      echo $(CoreVersion)
-      echo $(Configuration)
-      echo $(NugetSource)
-      echo $(GitCommitSeven)
-      REM echo $(pipelinePassword)
-    displayName: "Echo Check"
-
-  - script: '"C:\program files\dotnet\dotnet.exe" nuget locals all --clear'
-    displayName: "Nuget Clear"
-    enabled: false
-
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" user-secrets init
-      "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)"
-      "C:\program files\dotnet\dotnet.exe" user-secrets set "GitCommitSeven" "$(GitCommitSeven)"
-      "C:\program files\dotnet\dotnet.exe" user-secrets list
-    workingDirectory: Adaptation
-    displayName: "Safe storage of app secrets - Adaptation"
-
-  - script: '"C:\program files\dotnet\dotnet.exe" build --configuration $(Configuration) --source $(NugetSource)'
-    workingDirectory: Adaptation
-    displayName: "Core Build - Adaptation"
-
-  - powershell: Get-ChildItem .\ -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
-    workingDirectory: "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)"
-    displayName: "PowerShell Script"
-    continueOnError: true
-
-  - script: "dotnet test --configuration $(Configuration)"
-    workingDirectory: Adaptation
-    displayName: "Core Test"
-
-  - script: 'move /y "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)/05_TestResults/TestResults" $(System.DefaultWorkingDirectory)'
-    displayName: "Move Results"
-
-  - script: '"C:\program files\dotnet\dotnet.exe" tool restore'
-    workingDirectory: Adaptation
-    displayName: "Tool Restore"
-    enabled: false
-
-  - script: '"C:\program files\dotnet\dotnet.exe" ReportGenerator -reports:$(System.DefaultWorkingDirectory)/TestResults/**/coverage.cobertura.xml -targetDir:$(Build.ArtifactStagingDirectory)\Coverage -reportTypes:Html_Dark'
-    workingDirectory: Adaptation
-    displayName: "Report Generator"
-    enabled: false
-
-  - task: PublishTestResults@2
-    displayName: "Publish Test Results **/*.trx"
-    inputs:
-      testResultsFormat: VSTest
-      testResultsFiles: "**/*.trx"
-      testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
-      searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
-
-  - task: PublishTestResults@2
-    displayName: "Publish Test Results */coverage.cobertura.xml"
-    inputs:
-      testResultsFormat: VSTest
-      testResultsFiles: "*/coverage.cobertura.xml"
-      testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
-      searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
-
-  - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1
-    displayName: "Create work item"
-    inputs:
-      teamProject: "Mesa_FI"
-      workItemType: Bug
-      title: $(GitCommitSeven)-$(Build.BuildId)-$(Build.Repository.Name)-$(Configuration)
-      assignedTo: "$(Build.RequestedForId)"
-    enabled: false
-
-  - script: '"C:\program files\dotnet\dotnet.exe" publish --configuration $(Configuration) --runtime win-x64 --self-contained -o $(Build.ArtifactStagingDirectory)\Adaptation --source $(NugetSource)'
-    workingDirectory: Adaptation
-    displayName: "Core Publish"
-    enabled: false
-
-  - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Restore /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8 /p:RestoreSources="$(NugetSource)"'
-    displayName: "MSBuild Restore"
-
-  - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Build /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8'
-    displayName: MSBuild
-
-  - script: 'echo $(Build.SourceVersion)-$(Build.BuildId)-$(Build.Repository.Name)>bin\$(Configuration)\$(Build.Repository.Name).txt'
-    displayName: "Commit Id"
-
-  - task: CopyFiles@2
-    displayName: 'Copy Files to: D:\Framework4.8'
-    inputs:
-      Contents: "*$(Build.Repository.Name)*"
-      SourceFolder: 'bin\$(Configuration)'
-      TargetFolder: 'D:\Framework4.8\$(GitCommitSeven)-$(Build.BuildId)-$(Build.Repository.Name)-$(Configuration)'
-      OverWrite: true
-    enabled: false
-
-  - task: CopyFiles@2
-    displayName: 'Copy Files to: Local D EAF Deployment Storage'
-    inputs:
-      Contents: "*$(Build.Repository.Name)*"
-      SourceFolder: 'bin\$(Configuration)'
-      TargetFolder: 'D:\EAF\EAF Deployment Storage\Adaptation_$(Build.Repository.Name)'
-      OverWrite: true
-    enabled: false
-
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
-    workingDirectory: Adaptation
-    displayName: "Core Clean - Tests"
-
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
-    workingDirectory: Adaptation
-    displayName: "Core Clean - Adaptation"
-
-  - script: 'echo $(Build.SourceVersion)-$(Build.BuildId)>bin_x_x_\$(Configuration)\$(CoreVersion)\win-x64\$(Build.Repository.Name).txt'
-    displayName: "Force Fail"
-    enabled: false
diff --git a/Adaptation/MET08ANLYSDIFAAST230.yml b/Adaptation/MET08ANLYSDIFAAST230.yml
index 966cb80..2da7b1e 100644
--- a/Adaptation/MET08ANLYSDIFAAST230.yml
+++ b/Adaptation/MET08ANLYSDIFAAST230.yml
@@ -1,3 +1,9 @@
+# D:
+# cd D:\EAF-Mesa-Integration
+# config --url https://tfs.intra.infineon.com/tfs/FactoryIntegration --pool "EAF Mesa Integration" --agent mestsa003-meseafsvc --work _work --runAsService --auth negotiate --userName infineon\phares
+# D:
+# cd D:\EAF-Mesa-Integration
+# config --url https://tfs.intra.infineon.com/tfs/FactoryIntegration --pool "EAF Mesa Integration" --agent mestsa07ec-ecmeseaf --work _work --runAsService --auth negotiate --userName infineon\phares
 trigger:
   branches:
     include:
@@ -6,156 +12,273 @@ trigger:
     include:
       - "Adaptation/*"
 
-pool:
-  name: eaf
-  demands: MET08ANLYSDIFAAST230
+stages:
+  - stage: DevServer
+    displayName: DevServer
 
-steps:
-  - script: |
-      set coreVersion=net7.0
-      echo %coreVersion%
-      echo ##vso[task.setvariable variable=CoreVersion;]%coreVersion%
-      echo $(CoreVersion)
-    displayName: CoreVersion
+    pool:
+      name: EAF Mesa Integration
+      demands: MET08ANLYSDIFAAST230-Development
 
-  - script: |
-      set configuration=Release
-      echo %configuration%
-      echo ##vso[task.setvariable variable=Configuration;]%configuration%
-      echo $(Configuration)
-    displayName: Configuration
+    variables:
+      coreVersion: "net8.0"
+      nugetSource: "https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/"
 
-  - script: |
-      set nugetSource=https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/index.json;D:/vsts-agent-win-x64-2.210.1-eaf/nuget
-      echo %nugetSource%
-      echo ##vso[task.setvariable variable=NugetSource;]%nugetSource%
-      echo $(NugetSource)
-    displayName: NugetSource
+    jobs:
+      - job: SetupEnvironment
+        steps:
+          - script: |
+              echo $(Build.BuildId)
+              echo $(Build.Reason)
+              echo $(Build.Repository.Id)
+              echo $(Build.Repository.Name)
+              echo $(Build.SourceVersion)
+              echo $(CoreVersion)
+              echo $(NugetSource)
+            displayName: "Echo Check"
 
-  - script: |
-      set gitCommit=$(Build.SourceVersion)
-      set gitCommitSeven=%gitCommit:~0,7%
-      echo %gitCommitSeven%
-      echo ##vso[task.setvariable variable=GitCommitSeven;]%gitCommitSeven%
-      echo $(GitCommitSeven)
-    displayName: GitCommitSeven
+          - script: '"C:\program files\dotnet\dotnet.exe" nuget locals all --clear'
+            displayName: "Nuget Clear"
+            enabled: false
 
-  - script: |
-      echo $(Build.BuildId)
-      echo $(Build.Reason)
-      echo $(Build.Repository.Id)
-      echo $(Build.Repository.Name)
-      echo $(Build.SourceVersion)
-      echo $(CoreVersion)
-      echo $(Configuration)
-      echo $(NugetSource)
-      echo $(GitCommitSeven)
-      REM echo $(pipelinePassword)
-    displayName: "Echo Check"
+          - script: |
+              "C:\program files\dotnet\dotnet.exe" user-secrets init
+              "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)"
+              "C:\program files\dotnet\dotnet.exe" user-secrets set "GitCommit" "$(Build.SourceVersion)"
+              "C:\program files\dotnet\dotnet.exe" user-secrets list
+            workingDirectory: Adaptation
+            displayName: "Safe storage of app secrets - Adaptation"
 
-  - script: '"C:\program files\dotnet\dotnet.exe" nuget locals all --clear'
-    displayName: "Nuget Clear"
-    enabled: false
+      - job: BuildDebug
+        dependsOn:
+          - SetupEnvironment
+        steps:
+          - script: |
+              set configuration=Debug
+              echo %configuration%
+              echo ##vso[task.setvariable variable=Configuration;]%configuration%
+              echo $(Configuration)
+            displayName: Configuration
 
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" user-secrets init
-      "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)"
-      "C:\program files\dotnet\dotnet.exe" user-secrets set "GitCommitSeven" "$(GitCommitSeven)"
-      "C:\program files\dotnet\dotnet.exe" user-secrets list
-    workingDirectory: Adaptation
-    displayName: "Safe storage of app secrets - Adaptation"
+          - script: '"C:\program files\dotnet\dotnet.exe" build --configuration $(Configuration) --source $(NugetSource)'
+            workingDirectory: Adaptation
+            displayName: "Core Build - Adaptation"
 
-  - script: '"C:\program files\dotnet\dotnet.exe" build --configuration $(Configuration) --source $(NugetSource)'
-    workingDirectory: Adaptation
-    displayName: "Core Build - Adaptation"
+      - job: BuildRelease
+        dependsOn:
+          - SetupEnvironment
+        steps:
+          - script: |
+              set configuration=Release
+              echo %configuration%
+              echo ##vso[task.setvariable variable=Configuration;]%configuration%
+              echo $(Configuration)
+            displayName: Configuration
 
-  - powershell: Get-ChildItem .\ -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
-    workingDirectory: "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)"
-    displayName: "PowerShell Script"
-    continueOnError: true
+          - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Restore /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8 /p:RestoreSources=$(NugetSource)'
+            displayName: "MSBuild Restore"
 
-  - script: "dotnet test --configuration $(Configuration)"
-    workingDirectory: Adaptation
-    displayName: "Core Test"
+          - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Build /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8'
+            displayName: MSBuild
 
-  - script: 'move /y "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)/05_TestResults/TestResults" $(System.DefaultWorkingDirectory)'
-    displayName: "Move Results"
+          - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Build /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8'
+            displayName: MSBuild
 
-  - script: '"C:\program files\dotnet\dotnet.exe" tool restore'
-    workingDirectory: Adaptation
-    displayName: "Tool Restore"
-    enabled: false
+          - script: 'echo $(Build.Repository.Name)-$(Build.BuildId)-$(Build.SourceVersion)>bin\$(Configuration)\$(Build.Repository.Name).txt'
+            displayName: "Commit Id"
 
-  - script: '"C:\program files\dotnet\dotnet.exe" ReportGenerator -reports:$(System.DefaultWorkingDirectory)/TestResults/**/coverage.cobertura.xml -targetDir:$(Build.ArtifactStagingDirectory)\Coverage -reportTypes:Html_Dark'
-    workingDirectory: Adaptation
-    displayName: "Report Generator"
-    enabled: false
+          - task: CopyFiles@2
+            displayName: 'Copy Files to: D:\EAF'
+            inputs:
+              Contents: "*$(Build.Repository.Name)*"
+              SourceFolder: 'bin\$(Configuration)'
+              TargetFolder: 'D:\EAF\EAF Deployment Storage\Adaptation_$(Build.Repository.Name)'
+              OverWrite: true
+            enabled: true
 
-  - task: PublishTestResults@2
-    displayName: "Publish Test Results **/*.trx"
-    inputs:
-      testResultsFormat: VSTest
-      testResultsFiles: "**/*.trx"
-      testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
-      searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
+      - job: TestDebug
+        dependsOn:
+          - SetupEnvironment
+          - BuildDebug
+          - BuildRelease
+        steps:
+          - script: |
+              set configuration=Debug
+              echo %configuration%
+              echo ##vso[task.setvariable variable=Configuration;]%configuration%
+              echo $(Configuration)
+            displayName: Configuration
 
-  - task: PublishTestResults@2
-    displayName: "Publish Test Results */coverage.cobertura.xml"
-    inputs:
-      testResultsFormat: VSTest
-      testResultsFiles: "*/coverage.cobertura.xml"
-      testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
-      searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
+          - powershell: Get-ChildItem .\ -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
+            workingDirectory: "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)"
+            displayName: "PowerShell Script"
+            continueOnError: true
 
-  - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1
-    displayName: "Create work item"
-    inputs:
-      teamProject: "Mesa_FI"
-      workItemType: Bug
-      title: $(GitCommitSeven)-$(Build.BuildId)-$(Build.Repository.Name)-$(Configuration)
-      assignedTo: "$(Build.RequestedForId)"
-    enabled: false
+          - script: "dotnet test --configuration $(Configuration)"
+            workingDirectory: Adaptation
+            displayName: "Core Test"
 
-  - script: '"C:\program files\dotnet\dotnet.exe" publish --configuration $(Configuration) --runtime win-x64 --self-contained -o $(Build.ArtifactStagingDirectory)\Adaptation --source $(NugetSource)'
-    workingDirectory: Adaptation
-    displayName: "Core Publish"
-    enabled: false
+          - script: 'move /y "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)/05_TestResults/TestResults" $(System.DefaultWorkingDirectory)'
+            displayName: "Move Results"
 
-  - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Restore /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8 /p:RestoreSources="$(NugetSource)"'
-    displayName: "MSBuild Restore"
+          - script: '"C:\program files\dotnet\dotnet.exe" tool restore'
+            workingDirectory: Adaptation
+            displayName: "Tool Restore"
+            enabled: false
 
-  - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Build /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8'
-    displayName: MSBuild
+          - script: '"C:\program files\dotnet\dotnet.exe" ReportGenerator -reports:$(System.DefaultWorkingDirectory)/TestResults/**/coverage.cobertura.xml -targetDir:$(Build.ArtifactStagingDirectory)\Coverage -reportTypes:Html_Dark'
+            workingDirectory: Adaptation
+            displayName: "Report Generator"
+            enabled: false
 
-  - script: 'echo $(Build.SourceVersion)-$(Build.BuildId)-$(Build.Repository.Name)>bin\$(Configuration)\$(Build.Repository.Name).txt'
-    displayName: "Commit Id"
+          - task: PublishTestResults@2
+            displayName: "Publish Test Results **/*.trx"
+            inputs:
+              testResultsFormat: VSTest
+              testResultsFiles: "**/*.trx"
+              testRunTitle: "$(Build.BuildId)-$(Build.SourceVersion)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
+              searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
 
-  - task: CopyFiles@2
-    displayName: 'Copy Files to: D:\Framework4.8'
-    inputs:
-      Contents: "*$(Build.Repository.Name)*"
-      SourceFolder: 'bin\$(Configuration)'
-      TargetFolder: 'D:\Framework4.8\$(GitCommitSeven)-$(Build.BuildId)-$(Build.Repository.Name)-$(Configuration)'
-      OverWrite: true
+          - task: PublishTestResults@2
+            displayName: "Publish Test Results */coverage.cobertura.xml"
+            inputs:
+              testResultsFormat: VSTest
+              testResultsFiles: "*/coverage.cobertura.xml"
+              testRunTitle: "$(Build.BuildId)-$(Build.SourceVersion)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
+              searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
 
-  - task: CopyFiles@2
-    displayName: 'Copy Files to: Local D EAF Deployment Storage'
-    inputs:
-      Contents: "*$(Build.Repository.Name)*"
-      SourceFolder: 'bin\$(Configuration)'
-      TargetFolder: 'D:\EAF\EAF Deployment Storage\Adaptation_$(Build.Repository.Name)'
-      OverWrite: true
+          - script: |
+              "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
+            workingDirectory: Adaptation
+            displayName: "Core Clean - Adaptation"
 
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
-    workingDirectory: Adaptation
-    displayName: "Core Clean - Tests"
+          - script: 'echo $(Build.BuildId)-$(Build.SourceVersion)-bin_x_x_\$(Configuration)\$(CoreVersion)\win-x64\$(Build.Repository.Name).txt'
+            displayName: "Force Fail"
+            enabled: false
 
-  - script: |
-      "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
-    workingDirectory: Adaptation
-    displayName: "Core Clean - Adaptation"
+  - stage: ProductionServer
+    displayName: ProductionServer
 
-  - script: 'echo $(Build.SourceVersion)-$(Build.BuildId)>bin_x_x_\$(Configuration)\$(CoreVersion)\win-x64\$(Build.Repository.Name).txt'
-    displayName: "Force Fail"
-    enabled: false
+    pool:
+      name: EAF Mesa Integration
+      demands: MET08ANLYSDIFAAST230
+
+    variables:
+      coreVersion: "net8.0"
+      nugetSource: "https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/"
+
+    jobs:
+      - job: SetupEnvironment
+        steps:
+          - script: |
+              echo $(Build.BuildId)
+              echo $(Build.Reason)
+              echo $(Build.Repository.Id)
+              echo $(Build.Repository.Name)
+              echo $(Build.SourceVersion)
+              echo $(CoreVersion)
+              echo $(NugetSource)
+            displayName: "Echo Check"
+
+          - script: '"C:\program files\dotnet\dotnet.exe" nuget locals all --clear'
+            displayName: "Nuget Clear"
+            enabled: false
+
+          - script: |
+              "C:\program files\dotnet\dotnet.exe" user-secrets init
+              "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)"
+              "C:\program files\dotnet\dotnet.exe" user-secrets set "GitCommit" "$(Build.SourceVersion)"
+              "C:\program files\dotnet\dotnet.exe" user-secrets list
+            workingDirectory: Adaptation
+            displayName: "Safe storage of app secrets - Adaptation"
+
+      - job: BuildRelease
+        dependsOn:
+          - SetupEnvironment
+        steps:
+          - script: |
+              set configuration=Release
+              echo %configuration%
+              echo ##vso[task.setvariable variable=Configuration;]%configuration%
+              echo $(Configuration)
+            displayName: Configuration
+
+          - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Restore /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8 /p:RestoreSources=$(NugetSource)'
+            displayName: "MSBuild Restore"
+
+          - script: '"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe" /target:Build /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=$(Configuration);TargetFrameworkVersion=v4.8'
+            displayName: MSBuild
+
+          - script: 'echo $(Build.Repository.Name)-$(Build.BuildId)-$(Build.SourceVersion)>bin\$(Configuration)\$(Build.Repository.Name).txt'
+            displayName: "Commit Id"
+
+          - task: CopyFiles@2
+            displayName: 'Copy Files to: D:\EAF'
+            inputs:
+              Contents: "*$(Build.Repository.Name)*"
+              SourceFolder: 'bin\$(Configuration)'
+              TargetFolder: 'D:\EAF\EAF Deployment Storage\Adaptation_$(Build.Repository.Name)'
+              OverWrite: true
+
+          - script: '"C:\program files\dotnet\dotnet.exe" build --configuration $(Configuration) --source $(NugetSource)'
+            workingDirectory: Adaptation
+            displayName: "Core Build - Adaptation"
+
+      - job: TestRelease
+        dependsOn:
+          - SetupEnvironment
+          - BuildRelease
+        steps:
+          - script: |
+              set configuration=Release
+              echo %configuration%
+              echo ##vso[task.setvariable variable=Configuration;]%configuration%
+              echo $(Configuration)
+            displayName: Configuration
+
+          - powershell: Get-ChildItem .\ -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
+            workingDirectory: "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)"
+            displayName: "PowerShell Script"
+            continueOnError: true
+
+          - script: "dotnet test --configuration $(Configuration)"
+            workingDirectory: Adaptation
+            displayName: "Core Test"
+
+          - script: 'move /y "$(System.DefaultWorkingDirectory)/../../../$(Build.Repository.Name)/05_TestResults/TestResults" $(System.DefaultWorkingDirectory)'
+            displayName: "Move Results"
+
+          - script: '"C:\program files\dotnet\dotnet.exe" tool restore'
+            workingDirectory: Adaptation
+            displayName: "Tool Restore"
+            enabled: false
+
+          - script: '"C:\program files\dotnet\dotnet.exe" ReportGenerator -reports:$(System.DefaultWorkingDirectory)/TestResults/**/coverage.cobertura.xml -targetDir:$(Build.ArtifactStagingDirectory)\Coverage -reportTypes:Html_Dark'
+            workingDirectory: Adaptation
+            displayName: "Report Generator"
+            enabled: false
+
+          - task: PublishTestResults@2
+            displayName: "Publish Test Results **/*.trx"
+            inputs:
+              testResultsFormat: VSTest
+              testResultsFiles: "**/*.trx"
+              testRunTitle: "$(Build.BuildId)-$(Build.SourceVersion)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
+              searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
+
+          - task: PublishTestResults@2
+            displayName: "Publish Test Results */coverage.cobertura.xml"
+            inputs:
+              testResultsFormat: VSTest
+              testResultsFiles: "*/coverage.cobertura.xml"
+              testRunTitle: "$(Build.BuildId)-$(Build.SourceVersion)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
+              searchFolder: "$(System.DefaultWorkingDirectory)/TestResults"
+
+          - script: |
+              "C:\program files\dotnet\dotnet.exe" clean --configuration $(Configuration)
+            workingDirectory: Adaptation
+            displayName: "Core Clean - Adaptation"
+
+          - script: 'echo $(Build.BuildId)-$(Build.SourceVersion)-bin_x_x_\$(Configuration)\$(CoreVersion)\win-x64\$(Build.Repository.Name).txt'
+            displayName: "Force Fail"
+            enabled: true