From a6552335164ce062567b76aa7d097fd046129474 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 금, 23 7월 2021 10:07:55 +0900
Subject: [PATCH] Ongoing90 #3517 CF AOI Review 자가진단 기능 개선

---
 ReviewHistory/ReveiwHistory/DitGlassRawStruct.h                                |  253 +++---
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h                       |    2 
 ReviewSystem/ReviewSystem/ReviewProcessor.h                                    |    6 
 DitGlassRawMessenger/Extern/DitGlassRawClient.cpp                              |   29 
 DitGlassRawMessenger/Extern/DitGlassRawStruct.h                                |  253 +++---
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h            |    3 
 ReviewSystem/ReviewSystem/DitGlassRawStruct.h                                  |  253 +++---
 ReviewSystem/ReviewSystem/resource.h                                           |    3 
 DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h                       |    3 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp                |   11 
 ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h                               |   24 
 ReviewHistory/bin/ReviewHistroy.exe                                            |    0 
 ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp                             |  137 +--
 ReviewSystem/ReviewSystem/DitGlassRawClient.cpp                                |    4 
 ReviewSystem/ReviewSystem/DitGlassRawClient.h                                  |    1 
 ReviewSystem/ReviewSystem/ReviewSystem.rc                                      |   65 -
 ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp                              |   11 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp          |  122 +-
 ReviewHistory/ReveiwHistory/DitGlassRawServer.h                                |    3 
 ReviewSystem/ReviewSystem/SequenceProcessor.h                                  |    7 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters |    6 
 ReviewSystem/ReviewSystem/ReviewInterface.cpp                                  |   55 +
 DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp                  |  396 +++++++++++
 DitGlassRawMessenger/Extern/DitGlassRawClient.h                                |   16 
 ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp                     |   94 +-
 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp                           |    3 
 ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h               |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc              |   21 
 DitGlassRawMessenger/DitGlassRawMessenger/resource.h                           |    2 
 ReviewSystem/ReviewSystem/SequenceProcessor.cpp                                |    6 
 ReviewSystem/ReviewSystem/ReviewInterface.h                                    |   13 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h                       |   14 
 DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h                    |   65 +
 ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp                                 |    4 
 ReviewHistory/bin/Config/PathSetting.ini                                       |    2 
 ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp                             |   39 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h                  |    3 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj         |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp                     |   77 +
 39 files changed, 1,288 insertions(+), 722 deletions(-)

diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
index b942e78..f723721 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
@@ -131,20 +131,23 @@
     LTEXT           "-",IDC_STATIC_SERVERCMD,451,61,102,8
     PUSHBUTTON      "Test1",IDC_TEST1,136,45,43,14,NOT WS_VISIBLE
     PUSHBUTTON      "Test2",IDC_TEST2,136,60,43,14,NOT WS_VISIBLE
-    GROUPBOX        "Stack File",IDC_STATIC,7,82,216,75
-    CONTROL         "Use Stack File Read",IDC_CHECK_STACKFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,97,77,10
-    EDITTEXT        IDC_EDIT_STACK_LOCALSAVEPATH,57,115,163,14,ES_AUTOHSCROLL
-    LTEXT           "Local Path :",IDC_STATIC,14,117,40,8
+    GROUPBOX        "DownLoad File",IDC_STATIC,7,82,216,75
+    CONTROL         "",IDC_CHECK_STACKFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,99,16,10
+    EDITTEXT        IDC_EDIT_STACK_LOCALSAVEPATH,94,96,121,14,ES_AUTOHSCROLL
     PUSHBUTTON      "Apply",IDC_BTN_STACKAPPLY,180,139,39,14
     PUSHBUTTON      "Send",IDC_TEST_CMD,110,60,20,14,WS_DISABLED
     LTEXT           "Command : ",IDC_STATIC,17,63,39,8
     COMBOBOX        IDC_CMB_COMMAND,61,61,48,128,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
-    EDITTEXT        IDC_EDIT_STACK_EQUIPID,45,133,32,14,ES_AUTOHSCROLL
-    LTEXT           "Equip ID :",IDC_STATIC,11,136,32,8
-    EDITTEXT        IDC_EDIT_STACK_PARAM1,113,134,24,14,ES_AUTOHSCROLL
-    LTEXT           "Param :",IDC_STATIC,85,137,28,8
-    EDITTEXT        IDC_EDIT_STACK_PARAM2,139,134,24,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_EDIT_STACK_EQUIPID,45,133,32,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
+    LTEXT           "Equip ID :",IDC_STATIC,11,136,32,8,NOT WS_VISIBLE
+    EDITTEXT        IDC_EDIT_STACK_PARAM1,113,134,24,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
+    LTEXT           "Param :",IDC_STATIC,85,137,28,8,NOT WS_VISIBLE
+    EDITTEXT        IDC_EDIT_STACK_PARAM2,139,134,24,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
     PUSHBUTTON      "Manual\nFTP Upload",IDC_BTN_FTP_MANUALUPLOAD,418,20,39,31,BS_MULTILINE | WS_DISABLED
+    LTEXT           "Stack File",IDC_STATIC,16,100,30,8
+    LTEXT           "RawMerge File",IDC_STATIC,15,115,46,8
+    CONTROL         "",IDC_CHECK_RAWMERGEFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,115,16,10
+    EDITTEXT        IDC_EDIT_RAWMERGE_LOCALSAVEPATH,94,112,121,14,ES_AUTOHSCROLL
 END
 
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj
index 5305d18..f54cbca 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj
@@ -234,6 +234,7 @@
     <ClCompile Include="GlassRawRTMS.cpp" />
     <ClCompile Include="InterfaceFTP.cpp" />
     <ClCompile Include="MacroResultFile.cpp" />
+    <ClCompile Include="RawResultReader.cpp" />
     <ClCompile Include="StackResultCPJT.cpp" />
     <ClCompile Include="StackResultCSOT.cpp" />
     <ClCompile Include="stdafx.cpp">
@@ -261,6 +262,7 @@
     <ClInclude Include="GlassRawRTMS.h" />
     <ClInclude Include="InterfaceFTP.h" />
     <ClInclude Include="MacroResultFile.h" />
+    <ClInclude Include="RawResultReader.h" />
     <ClInclude Include="Resource.h" />
     <ClInclude Include="StackResultCPJT.h" />
     <ClInclude Include="StackResultCSOT.h" />
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters
index a18de26..81b1bc2 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters
@@ -93,6 +93,9 @@
     <ClCompile Include="StackResultCPJT.cpp">
       <Filter>RawInterface\Stack</Filter>
     </ClCompile>
+    <ClCompile Include="RawResultReader.cpp">
+      <Filter>RawInterface\Stack</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="akLoggerExt.h">
@@ -161,6 +164,9 @@
     <ClInclude Include="StackResultCPJT.h">
       <Filter>RawInterface\Stack</Filter>
     </ClInclude>
+    <ClInclude Include="RawResultReader.h">
+      <Filter>RawInterface\Stack</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\DitGlassRawMessenger.ico">
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
index 4f22cb1..e2290d6 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -1,5 +1,5 @@
 
-// DitGlassRawMessengerDlg.cpp : 占쏙옙占쏙옙 占쏙옙占쏙옙
+// DitGlassRawMessengerDlg.cpp : 구현 파일
 //
 
 #include "stdafx.h"
@@ -23,20 +23,20 @@
 #define GRID_TEXT_COLOR			RGB(255,255,255)
 #define GRID_ALARM_TEXT_COLOR	RGB(255,0,0)
 #define GRID_LINE_COLOR			GRID_FIX_COLOR
-// 占쏙옙占쏙옙 占쏙옙占싸그뤄옙 占쏙옙占쏙옙占쏙옙 占쏙옙占실댐옙 CAboutDlg 占쏙옙화 占쏙옙占쏙옙占쌉니댐옙.
+// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
 
 class CAboutDlg : public CDialog
 {
 public:
 	CAboutDlg();
 
-// 占쏙옙화 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쌉니댐옙.
+// 대화 상자 데이터입니다.
 	enum { IDD = IDD_ABOUTBOX };
 
 	protected:
-	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 占쏙옙占쏙옙占쌉니댐옙.
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.
 
-// 占쏙옙占쏙옙占쌉니댐옙.
+// 구현입니다.
 protected:
 	DECLARE_MESSAGE_MAP()
 };
@@ -54,7 +54,7 @@
 END_MESSAGE_MAP()
 
 
-// CDitGlassRawMessengerDlg 占쏙옙화 占쏙옙占쏙옙
+// CDitGlassRawMessengerDlg 대화 상자
 
 
 
@@ -127,7 +127,7 @@
 	m_vecStrGridDefectHeader.push_back("CellY(mm)");
 	m_vecStrGridDefectHeader.push_back("ScrtRatio");
 	m_vecStrGridDefectHeader.push_back("Density");
-	//201207 CJH - Merge 占쏙옙占쏙옙 확占쏙옙
+	//201207 CJH - Merge 여부 확인
 	m_vecStrGridDefectHeader.push_back("MergeState");
 
 }
@@ -192,16 +192,16 @@
 	if (timestruct.tm_mon>11 || timestruct.tm_mon<0 )
 		ASSERT(FALSE);
 }
-// CDitGlassRawMessengerDlg 占쌨쏙옙占쏙옙 처占쏙옙占쏙옙
+// CDitGlassRawMessengerDlg 메시지 처리기
 
 BOOL CDitGlassRawMessengerDlg::OnInitDialog()
 {
 	CDialog::OnInitDialog();
 
 	DragAcceptFiles(TRUE);
-	// 占시쏙옙占쏙옙 占쌨댐옙占쏙옙 "占쏙옙占쏙옙..." 占쌨댐옙 占쌓몌옙占쏙옙 占쌩곤옙占쌌니댐옙.
+	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
 
-	// IDM_ABOUTBOX占쏙옙 占시쏙옙占쏙옙 占쏙옙占� 占쏙옙占쏙옙占쏙옙 占쌍억옙占� 占쌌니댐옙.
+	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
 	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 	ASSERT(IDM_ABOUTBOX < 0xF000);
 
@@ -219,16 +219,16 @@
 		}
 	}
 
-	// 占쏙옙 占쏙옙화 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌌니댐옙. 占쏙옙占쏙옙 占쏙옙占싸그뤄옙占쏙옙 占쏙옙 창占쏙옙 占쏙옙화 占쏙옙占쌘곤옙 占싣댐옙 占쏙옙荑∽옙占�
-	//  占쏙옙占쏙옙占쌈울옙크占쏙옙 占쏙옙 占쌜억옙占쏙옙 占쌘듸옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌌니댐옙.
-	SetIcon(m_hIcon, TRUE);			// 큰 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌌니댐옙.
-	SetIcon(m_hIcon, FALSE);		// 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌌니댐옙.
+	// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
+	//  프레임워크가 이 작업을 자동으로 수행합니다.
+	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
+	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.
 
-	//트占쏙옙占싱억옙占쏙옙占쏙옙 占쏙옙占쏙옙
+	//트레이아이콘 구성
 	m_TrayIcon = FALSE;
 	ResTrayIcon();
 
-	//占쏙옙占� 占쏙옙占쏙옙
+	//빌드 정보
 	{
 		CString strBuild;
 		tm tmBuild;
@@ -237,7 +237,7 @@
 		SetDlgItemText(IDC_BUILDDATE, strBuild);
 	}
 
-	//占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占싻억옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/20]
+	//설정파일 정보 읽어 오기 [김태현 2018/11/20]
 	{
 		m_strConfigFile;
 		{
@@ -254,6 +254,8 @@
 		akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "c:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
 		akFileDB.getItem("Stack_Use", &m_ConfigOption.m_bUseStack, 0);
 		akFileDB.getItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath, "D:\\DIT_ResultData\\Stack");
+		akFileDB.getItem("RawMerge_Use", &m_ConfigOption.m_bUseRawMerge, 0);
+		akFileDB.getItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath, "D:\\DIT_ResultData\\RawMerge");
 		akFileDB.getItem("Stack_EquipID",m_ConfigOption.m_strStackEquipID, "AAAAA");
 		akFileDB.getItem("Stack_Param1",m_ConfigOption.m_strStackParam1, "");
 		akFileDB.getItem("Stack_Param2",m_ConfigOption.m_strStackParam2, "");
@@ -263,12 +265,14 @@
 
 		((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->SetCheck(m_ConfigOption.m_bUseStack);
 		SetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH, m_ConfigOption.m_strStackLocalPath);
+		((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->SetCheck(m_ConfigOption.m_bUseRawMerge);
+		SetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath);
 		SetDlgItemText(IDC_EDIT_STACK_EQUIPID, m_ConfigOption.m_strStackEquipID);
 		SetDlgItemText(IDC_EDIT_STACK_PARAM1, m_ConfigOption.m_strStackParam1);
 		SetDlgItemText(IDC_EDIT_STACK_PARAM2, m_ConfigOption.m_strStackParam2);
 	}
 
-	//占싸깍옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/20]
+	//로그 관련 [김태현 2018/11/20]
 	{
 		CakFileUtil fileutil;
 		char strPath[256];
@@ -371,30 +375,30 @@
 
 	if(m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE)
 	{
-		AfxMessageBox("占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쌌니댐옙.");
+		AfxMessageBox("서버 생성 실패 종료 합니다.");
 		exit(0);
 	}
 
-	//占쏙옙占썹값 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/12]
+	//현재값 적용 [김태현 2019/1/12]
 	{
 		CDitGlassRawServer* pServer = (CDitGlassRawServer*) &m_Server;
 		CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
 		pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
 	}
 	
-	//占쌜억옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/13]
+	//작업 쓰레드 생성 [김태현 2018/11/13]
 	{
 		_beginthread(threadMain, NULL, this);
 	}
 	
 	PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
 
-	return TRUE;  // 占쏙옙커占쏙옙占쏙옙 占쏙옙트占싼울옙 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 TRUE占쏙옙 占쏙옙환占쌌니댐옙.
+	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
 }
 
 void CDitGlassRawMessengerDlg::OnBnClickedOk()
 {
-	// TODO: 占쏙옙占썩에 占쏙옙트占쏙옙 占싯몌옙 처占쏙옙占쏙옙 占쌘드를 占쌩곤옙占쌌니댐옙.
+	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 	OnOK();
 }
 
@@ -403,14 +407,14 @@
 {
 	NOTIFYICONDATA nid;
 	nid.cbSize = sizeof(nid);
-	nid.hWnd = m_hWnd; // 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쌘듸옙
-	nid.uID = IDR_MAINFRAME; // 占쏙옙占쏙옙占쏙옙 占쏙옙占쌀쏙옙 ID
-	nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 占시뤄옙占쏙옙 占쏙옙占쏙옙
-	nid.uCallbackMessage = UM_TRAYICON_MSG; // 占쌥뱄옙聘占쏙옙占� 占쏙옙占쏙옙
-	nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 占쏙옙占쏙옙占쏙옙 占싸듸옙
+	nid.hWnd = m_hWnd; // 메인 윈도우 핸들
+	nid.uID = IDR_MAINFRAME; // 아이콘 리소스 ID
+	nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정
+	nid.uCallbackMessage = UM_TRAYICON_MSG; // 콜백메시지 설정
+	nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 아이콘 로드
 
 	char strTitle[256];
-	GetWindowText(strTitle, sizeof(strTitle)); // 캡占실바울옙 占쏙옙쨉占� 占쏙옙占쌘울옙 占쏙옙占쏙옙
+	GetWindowText(strTitle, sizeof(strTitle)); // 캡션바에 출력된 문자열 얻음
 	lstrcpy(nid.szTip, strTitle);
 	Shell_NotifyIcon(NIM_ADD, &nid);
 	SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon);
@@ -433,7 +437,7 @@
 		GetCursorPos(&pos);
 		{
 			HMENU hMenu = CreatePopupMenu();
-			AppendMenu(hMenu, MF_STRING, 0, "占쏙옙占쏙옙占쏙옙2占쏙옙트占쏙옙품");
+			AppendMenu(hMenu, MF_STRING, 0, "연구소2파트작품");
 			AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit");
 			TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL);
 		}
@@ -461,19 +465,19 @@
 	}
 }
 
-// 占쏙옙화 占쏙옙占쌘울옙 占쌍쇽옙화 占쏙옙占쌩몌옙 占쌩곤옙占쏙옙 占쏙옙占� 占쏙옙占쏙옙占쏙옙占쏙옙 占쌓몌옙占쏙옙占쏙옙
-//  占싣뤄옙 占쌘드가 占십울옙占쌌니댐옙. 占쏙옙占쏙옙/占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙求占� MFC 占쏙옙占쏙옙 占쏙옙占싸그뤄옙占쏙옙 占쏙옙荑∽옙占�
-//  占쏙옙占쏙옙占쌈울옙크占쏙옙占쏙옙 占쏙옙 占쌜억옙占쏙옙 占쌘듸옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌌니댐옙.
+// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
+//  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
+//  프레임워크에서 이 작업을 자동으로 수행합니다.
 
 void CDitGlassRawMessengerDlg::OnPaint()
 {
 	if (IsIconic())
 	{
-		CPaintDC dc(this); // 占쌓몌옙占썩를 占쏙옙占쏙옙 占쏙옙占쏙옙決占� 占쏙옙占쌔쏙옙트
+		CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
 
 		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
-		// 클占쏙옙占싱억옙트 占썹각占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏘데占쏙옙 占쏙옙占쏙옙求占�.
+		// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
 		int cxIcon = GetSystemMetrics(SM_CXICON);
 		int cyIcon = GetSystemMetrics(SM_CYICON);
 		CRect rect;
@@ -481,7 +485,7 @@
 		int x = (rect.Width() - cxIcon + 1) / 2;
 		int y = (rect.Height() - cyIcon + 1) / 2;
 
-		// 占쏙옙占쏙옙占쏙옙占쏙옙 占쌓몌옙占싹댐옙.
+		// 아이콘을 그립니다.
 		dc.DrawIcon(x, y, m_hIcon);
 	}
 	else
@@ -490,8 +494,8 @@
 	}
 }
 
-// 占쏙옙占쏙옙微占� 占쌍쇽옙화占쏙옙 창占쏙옙 占쏙옙占� 占쏙옙占싫울옙 커占쏙옙占쏙옙 표占시되듸옙占쏙옙 占시쏙옙占쌜울옙占쏙옙
-//  占쏙옙 占쌉쇽옙占쏙옙 호占쏙옙占쌌니댐옙.
+// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
+//  이 함수를 호출합니다.
 HCURSOR CDitGlassRawMessengerDlg::OnQueryDragIcon()
 {
 	return static_cast<HCURSOR>(m_hIcon);
@@ -501,15 +505,15 @@
 void CDitGlassRawMessengerDlg::OnDropFiles(HDROP hDropInfo)
 {
 	int nFiles;
-	char szPathName[MAX_PATH];  // 占쏙옙占쏙옙 占쏙옙罐占쏙옙占� 占쏙옙載o옙占�.
+	char szPathName[MAX_PATH];  // 파일 경로면이 들어간다.
 	CString strFileName;
 
-	// 占쏙옙撻占� 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
+	// 드롭된 파일의 갯수
 	nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH );
 
-	for(int i = nFiles-1 ; i >= 0; i--)  //占쏙옙撻占� 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙큼 占쏙옙占쏙옙占쏙옙 占쏙옙占썽서 占쏙옙占쏙옙 占쏙옙罐占� 占쌨쇽옙占쏙옙 占쌘쏙옙占쏙옙 占쏙옙占�
+	for(int i = nFiles-1 ; i >= 0; i--)  //드롭된 파일 갯수만큼 루프를 돌면서 파일 경로를 메세지 박스로 출력
 	{
-		// 占쏙옙占쏙옙占쏙옙 占쏙옙占� 占쏙옙占쏙옙
+		// 파일의 경로 얻어옴
 		::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
 
 		SetDlgItemText(IDC_EDIT_RAWFILENAME, szPathName);
@@ -601,18 +605,18 @@
 
 	if(pRawInfo->m_nCommandIdxWrite != pRawInfo->m_nCommandIdxRead)
 	{
-		int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙트占쏙옙占쏙옙占쏙옙 占싹놂옙 占쏙옙占쏙옙占쏙옙占싼쇽옙 占싻는댐옙. [占쏙옙占쏙옙占쏙옙 2018/11/13]
+		int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //현재는 읽은 마지막 포인트임으로 하나 증가시켜서 읽는다. [김태현 2018/11/13]
 		_grmDitCommand::_grmCommand* pCommand = &pRawInfo->m_nCommandBuffer[nReadIdx];
 		AKLOG("Recv Command ID:%d(r%d/w%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite);
 		pRawInfo->m_nCommandIdxRead = nReadIdx;
 
-		if(pCommand->nResult == -1) //占쏙옙占� 占쏙옙占쏙옙 占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/13]
+		if(pCommand->nResult == -1) //명령 수행 전 [김태현 2018/11/13]
 		{
 			pCommand->nResult = ProcessCommand( (emGlassRawCommand)pCommand->nCommand, pCommand->strParam );
 		}
 		else
 		{
-			//占싱뱄옙 처占쏙옙 占싫곤옙 [占쏙옙占쏙옙占쏙옙 2018/11/13]
+			//이미 처리 된거 [김태현 2018/11/13]
 		}
 
 		AKLOG("Recv Command ID:%d(r%d/w%d) Process End(Result:%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite, pCommand->nResult);
@@ -658,7 +662,7 @@
 		{
 			nResult = m_pGlassRawMaker->SequenceInspectEnd(pRawDataBuffer);
 			pServer->GetGlassRawInfo()->m_ServerProcStep = APS_InspectEnd;
-			//Stack 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쌨모리울옙 占쌥울옙 占싹깍옙 占쏙옙占쏙옙 Export
+			//Stack 정보를 공유메모리에 반영 하기 위한 Export
 			//pRawDataBuffer->ExportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
 			break;
 		}
@@ -677,7 +681,7 @@
 	case grcSequenceCustomReviewDataRead:
 		{
 			nResult = m_pGlassRawMaker->SequenceCustomizeReview(pRawDataBuffer);
-			////Customize Review占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙트
+			////Customize Review를 위한 업데이트
 			//{
 			//	memcpy(pServer->GetDefectData(0), pRawDataBuffer->GetDefectData(0), sizeof(_grmDefectData)*pServer->GetGlassRawInfo()->m_nDefectMaxDataNum);
 			//	memcpy(pServer->GetCellData(0), pRawDataBuffer->GetCellData(0), sizeof(_grmCellData)*pServer->GetGlassRawInfo()->m_nCellMaxDataNum);
@@ -777,14 +781,14 @@
 	
 	if(m_pGlassRawMaker) delete m_pGlassRawMaker;
 	
-	if(m_TrayIcon) // 占쏙옙占쏙옙 트占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占실억옙占쏙옙占쏙옙 확占쏙옙
+	if(m_TrayIcon) // 현재 트레이 아이콘으로 설정되었는지 확인
 	{
 		NOTIFYICONDATA nid;
 		nid.cbSize = sizeof(nid);
-		nid.hWnd = m_hWnd; // 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쌘듸옙
+		nid.hWnd = m_hWnd; // 메인 윈도우 핸들
 		nid.uID = IDR_MAINFRAME;
 
-		// 占쌜억옙 표占쏙옙占쏙옙(TaskBar)占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占싼댐옙.
+		// 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
 		Shell_NotifyIcon(NIM_DELETE, &nid);
 	}
 
@@ -942,7 +946,7 @@
 
 BOOL CDitGlassRawMessengerDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
 {
-	// TODO: 占쏙옙占썩에 특占쏙옙화占쏙옙 占쌘드를 占쌩곤옙 占쏙옙/占실댐옙 占썩본 클占쏙옙占쏙옙占쏙옙 호占쏙옙占쌌니댐옙.
+	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
 	if (m_gridCellInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridCellInfo.GetDlgCtrlID())
 	{
 		*pResult = 1;
@@ -1264,7 +1268,7 @@
 					CString		str;
 					strItem = _T("          ");
 
-					// Panel x占쏙옙, y占쏙옙占쏙옙 占쌜라스울옙 占쌥댐옙 [6/9/2017 bhs]
+					// Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
 					if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
 						str.Format("% 5.3f", (double)pDefect->m_nUMCellX / 1000.0);
 					else
@@ -1287,7 +1291,7 @@
 					CString		str;
 					strItem = _T("          ");
 
-					// Panel x占쏙옙, y占쏙옙占쏙옙 占쌜라스울옙 占쌥댐옙 [6/9/2017 bhs]
+					// Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
 					if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
 						str.Format("% 5.3f", (double)pDefect->m_nUMCellY / 1000.0);
 					else
@@ -1345,6 +1349,8 @@
 
 	akFileDB.setItem("Stack_Use", m_ConfigOption.m_bUseStack);
 	akFileDB.setItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath);
+	akFileDB.setItem("RawMerge_Use", m_ConfigOption.m_bUseRawMerge);
+	akFileDB.setItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath);
 	akFileDB.setItem("Stack_EquipID", m_ConfigOption.m_strStackEquipID);
 	akFileDB.setItem("Stack_Param1",m_ConfigOption.m_strStackParam1);
 	akFileDB.setItem("Stack_Param2",m_ConfigOption.m_strStackParam2);
@@ -1439,7 +1445,7 @@
 
 void CDitGlassRawMessengerDlg::OnBnClickedBtnImportRaw()
 {
-	AKLOG("占싱깍옙占쏙옙占� 占쏙옙占쏙옙占쏙옙 占십요가 占쌍겠놂옙.. 占쏙옙占쏙옙占쏙옙...");
+	AKLOG("이기능은 가급적 필요가 있겠나.. 싶으네...");
 	PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
 }
 
@@ -1524,6 +1530,8 @@
 {
 	m_ConfigOption.m_bUseStack = ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->GetCheck();
 	GetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH,m_ConfigOption.m_strStackLocalPath, 256);
+	m_ConfigOption.m_bUseRawMerge = ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->GetCheck();
+	GetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath, 256);
 	GetDlgItemText(IDC_EDIT_STACK_EQUIPID,m_ConfigOption.m_strStackEquipID, 32);
 	GetDlgItemText(IDC_EDIT_STACK_PARAM1,m_ConfigOption.m_strStackParam1, 32);
 	GetDlgItemText(IDC_EDIT_STACK_PARAM2,m_ConfigOption.m_strStackParam2, 32);
@@ -1574,13 +1582,13 @@
 
 	
 	
-		CString str = _T("All(*.*)|*.*|");	// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+		CString str = _T("All(*.*)|*.*|");	// 선택할 파일 종류
 		CString File;
 		CString strFileList; 
 
 		CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this);
 
-		const int c_cMaxFiles = 400 /*占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙*/ ;	// 占쌨몌옙 占쏙옙占쏙옙占쏙옙占쏙옙占쏙옙占쏙옙 확占쏙옙 占쏙옙占쏙옙占쌍몌옙 占쏘개 占쏙옙占쏙옙
+		const int c_cMaxFiles = 400 /*선택할 파일 숫자*/ ;	// 메모리 부족현상으로 확장 안해주면 몇개 못씀
 		const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
 		dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize);
 		dlg.GetOFN().nMaxFile = c_cbBuffSize;
@@ -1591,7 +1599,7 @@
 		{
 			for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
 			{
-				// 占쏙옙체占쏙옙占쏙옙占쏙옙 ResetContent
+				// 전체삭제는 ResetContent
 				File = dlg.GetNextPathName(pos);
 
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
index 56b6972..6d2ff03 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
@@ -54,6 +54,9 @@
 		char m_strStackEquipID[32];
 		char m_strStackParam1[32];
 		char m_strStackParam2[32];
+
+		int  m_bUseRawMerge;
+		char m_strRawMergeLocalPath[256];
 	}m_ConfigOption;
 	void WriteConfigFile();
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
index 85f4cab..e88e79b 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
@@ -41,7 +41,8 @@
 		|| sizeof(_grmBlockData) != m_pGlassRawInfo->m_nSizeOfBlockData
 		|| sizeof(_grmCellData) != m_pGlassRawInfo->m_nSizeOfCellData
 		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfDefectData
-		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData)
+		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData
+		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfRawMergeData)
 	{
 		return FALSE;
 	}
@@ -51,7 +52,8 @@
 	m_pGlassRawInfo->m_nCellMaxDataNum = nCellNum;
 	m_pGlassRawInfo->m_nDefectMaxDataNum = nDefectNum;
 	m_pGlassRawInfo->m_nStackMaxDataNum = nDefectNum;
-	
+	m_pGlassRawInfo->m_nRawMergeMaxDataNum = nDefectNum;
+
 	m_pGlassRawInfo->m_nGlassRawDataSize;
 	{
 		int nDataNum = 0;
@@ -71,6 +73,9 @@
 		m_pGlassRawInfo->m_nStackDataPoint = nDataNum;
 		nDataNum += (m_pGlassRawInfo->m_nSizeOfStackData + m_pGlassRawInfo->m_nSizeOfStackData % 4)*nDefectNum;
 		
+		m_pGlassRawInfo->m_nRawMergeDataPoint = nDataNum;
+		nDataNum += (m_pGlassRawInfo->m_nSizeOfRawMergeData + m_pGlassRawInfo->m_nSizeOfRawMergeData % 4)*nDefectNum;
+
 		m_pGlassRawInfo->m_nGlassRawDataSize = nDataNum;
 	}
 	
@@ -125,6 +130,7 @@
 			m_pGlassRawInfo->m_nSizeOfCellData = sizeof(_grmCellData);
 			m_pGlassRawInfo->m_nSizeOfDefectData = sizeof(_grmDefectData);
 			m_pGlassRawInfo->m_nSizeOfStackData = sizeof(_grmDefectData);
+			m_pGlassRawInfo->m_nSizeOfRawMergeData = sizeof(_grmDefectData);
 
 			int bytealign = m_pGlassRawInfo->m_nSizeOfGlassData%4;
 		}
@@ -178,6 +184,7 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
 
 	return TRUE;
 }
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
index cda09f0..a3dc3f5 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
@@ -18,6 +18,7 @@
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
+	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
 
 	_grmDitGlassRawInfo* GetGlassRawInfo(){return m_pGlassRawInfo;};
 
@@ -31,7 +32,7 @@
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
-
+	_grmDefectData* m_pRawMergeData;
 
 protected:
 	HANDLE		m_hMapBasicInfo;
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
index 2f46477..ea973a0 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
@@ -3,13 +3,13 @@
 #include "DitGlassRawStruct.h"
 
 //////////////////////////////////////////////////////////////////////////
-// Recipe占쏙옙占쏙옙 Server占쏙옙 Inspector占쏙옙 占쏙옙占쏙옙占싹댐옙 占쏙옙占쏙옙占쏙옙占쏙옙.
+// Recipe에서 Server와 Inspector가 공유하는 설정정보.
 enum ThreadCount { Thread_1 = 0, Thread_2, Thread_4, Thread_6, Thread_8, Thread_11, Thread_12, Thread_22, Thread_24 };
 enum CameraType { CamType_Unknown = 0, CamType_Transfer, CamType_Reflex };
-enum ScanCoordinate { SC_XCoord = 0, SC_YCoord };					// 占쏙옙캔占쏙옙占쏙옙. 占쏙옙占쏙옙 占쏙옙표 占쏙옙占쏙옙占� 占쌩울옙.
-enum ScanDirectionEng { SD_Right2Left = 0, SD_Left2Right };			// 占쌜억옙占쌘곤옙 占쏙옙 占쏙옙캔 占쏙옙占쏙옙.
-enum ScanDirectionIns { SD_Forward = 0, SD_Backward, SD_Unknown };	// Glass 占쏙옙占쏙옙 Scan 占쏙옙占쏙옙.
-enum ScanType { ST_SingleScan = 0, ST_DualScan };				// SingleScan - 占쌤뱄옙占쏙옙, DualScan - 占쏙옙占쏙옙占�
+enum ScanCoordinate { SC_XCoord = 0, SC_YCoord };					// 스캔방향. 결함 좌표 연산시 중요.
+enum ScanDirectionEng { SD_Right2Left = 0, SD_Left2Right };			// 작업자가 본 스캔 방향.
+enum ScanDirectionIns { SD_Forward = 0, SD_Backward, SD_Unknown };	// Glass 기준 Scan 방향.
+enum ScanType { ST_SingleScan = 0, ST_DualScan };				// SingleScan - 단방향, DualScan - 양방향
 enum GlassDirection { GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
 enum AcqMode { Acq_Unknown = 0, Acq_Grab, Acq_Snap, Acq_Matrox, Acq_Simul };
 enum FindBoundary { FB_NotFind = 0, FB_PitchMatching, FB_ManualMatching };
@@ -20,7 +20,7 @@
 enum DefectFiltering { Filtering_NO = 0, Filtering_CO, Filtering_Cutoff, Filtering_DXDY, Filtering_TD, Filtering_FALSE };		// Filtering_CO : Cosmic Ray FALSE
 enum ALIGN_MARK_CLASSIFY { eAMC_First = 0, eAMC_Second };
 //////////////////////////////////////////////////////////////////////////
-// Defect占쏙옙 占쏙옙占실댐옙 타占쌉듸옙.
+// Defect에 사용되는 타입들.
 enum SERVER_DefectType { DefectType_TBlack = 0, DefectType_TWhite, DefectType_RBlack, DefectType_RWhite, DefectType_BBlack, DefectType_BWhite, DefectType_Unknown };
 enum SERVER_DefectSizeType { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
 enum SERVER_DefectJudgementType { JudgementType_OK = 0, JudgementType_TR, JudgementType_PR, JudgementType_UNKNOWN };
@@ -34,7 +34,7 @@
 enum ReKind { Re_Other, Re_TFE_CIRCLE, Re_PI_CONVEX, Re_PI_CONCAVE, Re_PI_1, Re_PI_2, Re_PI_3 };
 
 //choigudal jude fix 2012.03.07
-enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size 占쌩곤옙
+enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size 추가
 enum MAP16_DefectClass { CLASS_C1 = 1, CLASS_C2, CLASS_C3, CLASS_C4, CLASS_C5, CLASS_C6, CLASS_C7, CLASS_C8, CLASS_C9, CLASS_C10, CLASS_C11, CLASS_C12, CLASS_C13, CLASS_C14, CLASS_C15, CLASS_C16 };
 enum MAP16_SizeType { SIZE_SS = 0, SIZE_SM, SIZE_SL, SIZE_SOH, SIZE_IDX_MAX };
 enum MAP16_PeakType { PEEK_PS = 0, PEEK_PL, PEEK_PH, PEEK_POH, PEAK_IDX_MAX };
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
index 4b6b6bb..5033f78 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -78,7 +78,11 @@
 
 		m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
 	}
-	
+	if (m_RawMergeResult.getRawMergeUse())
+	{
+		SendMessageFTPDownloadDataFile(pData->GetGlassData());
+		m_RawMergeResult.RawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
+	}
 
 	return TRUE;
 }
@@ -121,7 +125,13 @@
 	_TimeDelay(5000); // �씠誘몄� 蹂듭궗 �떆媛� ��湲�
 	//210218 CJH - 寃��궗 醫낅즺�떆 寃곌낵�뙆�씪 諛� CCD Image �뾽濡쒕뱶
 	SendMessageFTPUploadRaw(pData->GetGlassData());
-	SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
+
+	BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
+	if (bIsBDI)
+	{
+		SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
+	}
+	
 	SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
 
 	return TRUE;
@@ -1800,23 +1810,18 @@
 void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
 {
 	if(pGlassData == NULL) return;
-	HWND hWnd = ::FindWindow(NULL, "FTPDownloader");
+	HWND hWnd = ::FindWindow(NULL, "FTPUploader");
 	if(hWnd == NULL) return;
 
 	char strServerFolder[256] = {};
 	char strServerFile[256] = {};
 	char strLocalFolder[256] = {};
-	char pLocalFile[256] = {}; 
+	char pLocalFile[256] = {};
+	char strRTMSFile[32] = {};
+	char strServerRawFileSubPath[256] = {};
+	char strServer_SubFileName[256] = {};
 
-	//GetFormatDescription(FTPCMD_DATAFILE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, pGlassData);
-	{
-		CString strGlassIDOrg = pGlassData->m_strGlassID; 
-		CString strGlassID = strGlassIDOrg.Left(12);
-		sprintf(strServerFolder, "%s", pGlassData->m_strCassetteSequenceNo);
-		sprintf(strServerFile, "%s.dat", strGlassID.GetBuffer(0));  
-		sprintf(strLocalFolder,  "D:\\DIT_ResultData\\DownloadData"); 
-		sprintf(pLocalFile,  "%s.dat", strGlassID.GetBuffer(0)); 
-	}
+	GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
 
 	CFTPCopyDataParam upParam;
 	strcpy(upParam.m_strServer_FolderName,			strServerFolder);
@@ -1829,7 +1834,7 @@
 	upParam.m_nSendResultCode							= FALSE;//m_ctrlResultAck.GetCheck();
 	upParam.m_nProcessType								= CFTPCopyDataParam::FTPProcessType_DownFile;
 	// [C-PRJ] Image Upload Define - KHT (2020/11/19)
-	upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Unknown;
+	upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Raw;
 
 	COPYDATASTRUCT cds;
 	cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
@@ -1971,7 +1976,7 @@
 			else
 				sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
 
-			sprintf(pLocalPath, "%s%s", LOCAL_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));  
+			sprintf(pLocalPath, "%s%s", NETWORK_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
 			strcpy(pServerFile, "*.*");
 			strcpy(pLocalFile, "*.*");
 		}
@@ -2129,23 +2134,31 @@
 			sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0)); 
 		}
 		break;
-		
-		case FTPCMD_MURA_IMAGE: //0404nwh
-		{	//
-			/*CTime time = m_tmFileCreateTime;
-			sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(), 
-				strGlassIDLevel5th.GetBuffer(0), 
-				strGlassIDLevel8th.GetBuffer(0),
-				strGlassID.GetBuffer(0)); 
-				
-							sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
-			strcpy(pServerFile, "*.*");
-			strcpy(pLocalFile, "*.*");*/
-		
-			if (strGlassID.GetLength() > 6)
-				sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
-			else
-				sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
+	case FTPCMD_RAWMERGE:
+	{
+		sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strStepID,strGlassIDLevel6th.GetBuffer(0)); // �꽌踰� 寃쎈줈 �솗�씤�썑 �닔�젙 kjg
+		sprintf(pServerFile, "%s",strGlassID);
+
+		sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
+		sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
+	}
+		break;	
+	case FTPCMD_MURA_IMAGE: //0404nwh
+	{	//
+		/*CTime time = m_tmFileCreateTime;
+		sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
+			strGlassIDLevel5th.GetBuffer(0),
+			strGlassIDLevel8th.GetBuffer(0),
+			strGlassID.GetBuffer(0));
+
+						sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
+		strcpy(pServerFile, "*.*");
+		strcpy(pLocalFile, "*.*");*/
+
+		if (strGlassID.GetLength() > 6)
+			sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
+		else
+			sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
 
 			sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0)); 
 			strcpy(pServerFile, "*.*");
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
index 88b6901..a43c626 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
@@ -7,6 +7,7 @@
 #include "MacroResultFile.h"
 #include "CustomizeReview.h"
 #include "InterfaceFTP.h"
+#include "RawResultReader.h"
 
 class CGlassRawCPJT : public CGlassRawBase, public CInterfaceFTP
 {
@@ -75,6 +76,7 @@
 	CMacroResultFile m_MuraResultFile; //무라용 결과파일 생성관리 [김태현 2018/12/5]
 
 	CStackResultCPJT m_StackResult;
+	CRawResultReader m_RawMergeResult;
 	BOOL	m_bReviewEndCheck;    // InspectEnd 시에 Raw_im 폴더에 SubFile 생성 안하기 위해 사용 [ 21-03-18 KJG ]
 	CTime	m_tmReviewStart;		
 	CTime	m_tmReviewEnd;		
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h b/DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h
index 22d10e1..ed8f29c 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h
@@ -15,7 +15,8 @@
 		FTPCMD_MURA_IMAGE			,
 		FTPCMD_STACK				,
 		FTPCMD_LINK				,
-		FTPCMD_End
+		FTPCMD_End				,
+		FTPCMD_RAWMERGE    		
 	};
 
 public:
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
new file mode 100644
index 0000000..ea5f9c5
--- /dev/null
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
@@ -0,0 +1,396 @@
+#include "StdAfx.h"
+#include "RawResultReader.h"
+#include "akLoggerExt.h"
+#include "akCore/akFileDB.h"
+#include <process.h>
+#include "DitGlassRawClient.h"
+#include "GlassRawBase.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#define new DEBUG_NEW
+#endif
+
+CRawResultReader::CRawResultReader(void)
+{
+	m_nThreadStackFileReadFlag = 0;
+	m_nProcessState = RPS_StateIdle;
+
+	m_strConfigFile;
+	{
+		GetModuleFileName(NULL, m_strConfigFile, MAX_PATH);
+		char* ext = CakFileUtil::getFileExt(m_strConfigFile);
+		strcpy(ext, "ini");
+	}
+	CreateDirectory("D:\\DIT_ResultData\\RawMerge", NULL);
+	m_nProcessState = RPS_StateIdle;
+	readOptionFile();
+}
+
+CRawResultReader::~CRawResultReader(void)
+{
+	
+	if (m_nThreadStackFileReadFlag == 1)
+	{
+		m_nThreadStackFileReadFlag = 2;
+		while (m_nThreadStackFileReadFlag != 0)
+		{
+			Sleep(1);
+		}
+	}
+
+	m_vecStackDefect.clear();
+	
+}
+
+BOOL CRawResultReader::openFile(char* pGlassID)
+{
+	CString strFileName;
+	CDitGlassRawClient	GlassRawClient;
+	GlassRawClient.ConnectServer();
+	CDitGlassRawClient* pShared = &GlassRawClient;
+
+	_grmDefectData* pGrmStack;
+
+	strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
+
+	FILE* pf = fopen(strFileName.GetBuffer(0), "r");
+
+	if (pf == NULL)
+		return FALSE;
+
+	std::vector<_grmDefectData> vecStackDefect;
+	_grmDefectData StackDefect;
+	char buffer[2048];
+
+	char* pReadPoint = NULL;
+	char *pStr;
+	CString tempStr, strRight;
+
+	while (!feof(pf)) //Data 시작
+	{
+		pStr = fgets(buffer, 2048, pf);
+
+		if (strncmp(buffer, "DATA", 4)) continue; 
+
+		if (strlen(buffer) <= 0 || pStr == NULL)
+			break;
+
+		if (strncmp(buffer, "DATA DEFECT", 10)) continue; 
+
+		//Defect Stack Start
+		{
+			pReadPoint = buffer;
+			int temp;
+			CString strtemp;
+
+			pReadPoint = getParsingData(pReadPoint, 4, &temp);
+			pReadPoint = getParsingData(pReadPoint, 6, &temp);
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);
+
+
+			//Cell ID로 idx 찾기
+			{
+				tempStr = strtemp.Right(2);
+				int nUpper = atoi(tempStr.Left(1));
+				nUpper *= 36;
+
+				char ctemp[2];
+				strRight = tempStr.Right(1);
+				strcpy(ctemp, strRight);
+				int nLower = static_cast<int>(ctemp[0]);
+				if (48 <= nLower && nLower <= 57)
+					nLower = 43 /* 65+26+17 */ + nLower;
+				nLower -= 65;
+
+				StackDefect.m_nCellIdx = nUpper + nLower;
+			}
+			
+
+			pReadPoint = getParsingData(pReadPoint, 5, &temp);
+			pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignX);
+			pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignY);
+			StackDefect.m_nUMCenterAlignY = StackDefect.m_nUMCenterAlignY*-1;
+			pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellGate);
+			pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellData);
+			pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nPixelSize);
+			pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUMSizeX);
+			pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUMSizeY);
+			pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nDefectRScale);
+			pReadPoint = getParsingData(pReadPoint, 4, &strtemp); //StackDefect.m_DefectJudgement
+			if (strtemp == "OK")
+				StackDefect.m_DefectJudgement = Judge_OK;
+			else if (strtemp == "TR")
+				StackDefect.m_DefectJudgement = Judge_TR;
+			else if (strtemp == "PR")
+				StackDefect.m_DefectJudgement = Judge_PR;
+			else
+				StackDefect.m_StackInfo = Stack_Unknown;
+
+			pReadPoint = getParsingData(pReadPoint, 4, &strtemp);
+			strncpy(StackDefect.m_strDefectCode, strtemp.GetBuffer(0), 4+1); // Null 문자 떄문에 +1
+			pReadPoint = getParsingData(pReadPoint, 2, &strtemp);
+			if (strtemp == "UK")			
+				StackDefect.m_StackInfo = Stack_Unknown;		
+			else if (strtemp == "TD")
+				StackDefect.m_StackInfo = Stack_TD;
+			else if (strtemp == "SD")			
+				StackDefect.m_StackInfo = Stack_SD;			
+			else if (strtemp == "PD")
+				StackDefect.m_StackInfo = Stack_PD;
+			else if (strtemp == "SP")
+				StackDefect.m_StackInfo = Stack_SP;
+			else
+				StackDefect.m_StackInfo = Stack_Unknown;
+
+			pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackStepCount);
+			pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst	
+			strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60);
+			pReadPoint = getParsingData(pReadPoint, 16, &strtemp); // ReviewImageName m_strRevImageName
+			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
+			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneNum m_sZonePixelCount[i]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSizeType
+			if (strtemp == "S")
+				StackDefect.m_DefectSizeType = SizeType_Small;
+			else if (strtemp == "M")
+				StackDefect.m_DefectSizeType = SizeType_Mid;
+			else if (strtemp == "L")
+				StackDefect.m_DefectSizeType = SizeType_Large;
+			else if (strtemp == "H")
+				StackDefect.m_DefectSizeType = SizeType_Huge;
+			else if (strtemp == "U")
+				StackDefect.m_DefectSizeType = SizeType_Ultra;
+			else
+				StackDefect.m_DefectSizeType = SizeType_Small;	
+
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSubType
+			if (strtemp == "MC")
+				StackDefect.m_DefectSubType = DefectSubType_MC;
+			else if (strtemp == "MD")
+				StackDefect.m_DefectSubType = DefectSubType_Mask;
+			else if (strtemp == "CD")
+				StackDefect.m_DefectSubType = DefectSubType_Common;
+			else if (strtemp == "NO")
+				StackDefect.m_DefectSubType = DefectSubType_NoDefect;
+			else if (strtemp == "N")
+				StackDefect.m_DefectSubType = DefectSubType_Normal;
+			else
+				StackDefect.m_DefectSubType = DefectSubType_Normal;
+
+			pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[1]
+			pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[3]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//미사용
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMin);//m_nLevelSrcMin
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMax);//m_nLevelSrcMax
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcAvg);//m_nLevelSrcAvg
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_sDefectPeak);//m_sDefectPeak
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_strWsi_3DImageFilename
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_strAoiImageName
+			strncpy(StackDefect.m_strAoiImageName, strtemp.GetBuffer(0), 12);
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nScanIdx);//m_nScanIdx
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCameraID);//m_nCameraID
+			pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_nDefectIdx
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMin);//m_nLevelRefMin
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMax);//m_nLevelRefMax
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefAvg);//m_nLevelRefAvg
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[4]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[5]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[6]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_nHliLayers
+			StackDefect.m_nHliLayers = 0;
+			{
+				CString   resToken;
+				int curPos = 0, idx = 0;
+				resToken = strtemp.Tokenize(_T(","), curPos);
+				while (resToken != "")
+				{
+					int nShiftCnt = atoi(resToken);
+					StackDefect.m_nHliLayers = StackDefect.m_nHliLayers +( 1 << nShiftCnt );
+					resToken = strtemp.Tokenize(_T(","), curPos);
+				}
+			}
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCompact);//m_nCompact
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nThickness);//m_nThickness
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMajor);//m_nMajor
+			pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMinor);//m_nMinor
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[0]
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectType
+			if (strtemp == "RB")
+				StackDefect.m_DefectType = DefectType_RBlack;
+			else if (strtemp == "RW")
+				StackDefect.m_DefectType = DefectType_RWhite;
+			else if (strtemp == "TB")
+				StackDefect.m_DefectType = DefectType_TBlack;
+			else if (strtemp == "TW")
+				StackDefect.m_DefectType = DefectType_TWhite;
+			else if (strtemp == "UN")
+				StackDefect.m_DefectType = DefectType_Unknown;
+			else
+				StackDefect.m_DefectType = DefectType_Unknown;
+	
+			vecStackDefect.push_back(StackDefect);
+		}
+	}
+
+	AKLOG("Read RawMerge Size : %d", vecStackDefect.size());
+
+	fclose(pf);
+
+	m_vecStackDefect = vecStackDefect;
+
+	for (int i = 0; i < m_vecStackDefect.size(); i++)
+	{
+		pGrmStack = pShared->GetRawMergeData(i);
+		pGrmStack->clear();
+		memcpy(pGrmStack, &m_vecStackDefect[i], sizeof(_grmDefectData));
+	}
+
+	pShared->GetGlassData()->m_nRawMergeNum = m_vecStackDefect.size(); // RawMerge
+	pShared->GetGlassData()->m_bRawMergeRead = TRUE;
+
+	AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
+	return TRUE;
+}
+
+char* CRawResultReader::getParsingData(char* pBuf, int nLen, CString* pOutData)
+{
+
+	for (int i = nLen - 1; i >= 0; i--)
+	{
+		if (pBuf[i] != ' ')
+		{
+			pBuf[i + 1] = 0;
+			break;
+		}
+	}
+	*pOutData = pBuf;
+	
+	return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다
+
+}
+
+char* CRawResultReader::getParsingData(char* pBuf, int nLen, short* pOutData)
+{
+
+	pBuf[nLen] = 0;
+	*pOutData = atoi(pBuf);
+
+	return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다
+}
+
+char* CRawResultReader::getParsingData(char* pBuf, int nLen, int* pOutData)
+{
+
+	pBuf[nLen] = 0;
+	*pOutData = atoi(pBuf);
+
+	return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다
+}
+
+BOOL CRawResultReader::readOptionFile(char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
+{
+	if (pFileName == NULL) pFileName = m_strConfigFile;
+
+	CakFileDB akFileDB;
+	akFileDB.openfile(pFileName);
+
+	akFileDB.getItem("RawMerge_Use", &m_bStackUse, 0);
+	akFileDB.getItem("RawMerge_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\RawMerge");
+
+	if (m_bStackUse && m_nThreadStackFileReadFlag == 0)
+	{
+		_beginthread(threadResultFileRead, NULL, this);
+	}
+	return TRUE;
+}
+
+void CRawResultReader::threadResultFileRead(void* pArg)
+{
+	CRawResultReader* pThis = (CRawResultReader*)pArg;
+
+	pThis->m_nThreadStackFileReadFlag = 1;
+	int nReadFailCount = 0;
+	int nThreadCount = 0;
+	CString strGlassID;
+
+	while (pThis->m_nThreadStackFileReadFlag == 1)
+	{
+		if (pThis->m_nProcessState == RPS_CmdFileRead) //스택파일 읽기 수행 [김태현 2019/1/12]
+		{
+			strGlassID = pThis->m_strGlassID;
+
+			pThis->m_nProcessState = RPS_StateFileRead;
+			nThreadCount = 0;
+			nReadFailCount = 0;
+
+			AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
+			Sleep(3000);
+			while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1)
+			{
+				if ((nThreadCount++ % 20) != 0) //명령 수행을 빠르게 감지 위한 조치
+				{
+					Sleep(50);
+					continue;
+				}
+				if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
+				{
+					pThis->m_nProcessState = RPS_ResultReadOK;
+					AKLOG("RawMerge File Read Complete ");
+					break;
+				}
+
+				nReadFailCount++;
+				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
+
+				if (nReadFailCount > 10)
+				{
+					pThis->m_nProcessState = RPS_ResultReadFail;
+					break;
+				}
+
+				Sleep(50);
+			}
+			if (pThis->m_nProcessState != RPS_ResultReadOK)
+			{
+				pThis->m_nProcessState = RPS_ResultReadFail;
+			}
+		}
+		if (nReadFailCount)
+			Sleep(500);
+	}
+
+	pThis->m_nThreadStackFileReadFlag = 0;
+}
+
+BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID)
+{
+	if (m_nThreadStackFileReadFlag == 0)
+	{
+		_beginthread(threadResultFileRead, NULL, this);
+	}
+
+	if (m_nProcessState == RPS_StateFileRead)
+	{
+		m_nProcessState = RPS_CmdFileStop;
+		while (m_nProcessState == RPS_CmdFileStop) Sleep(0);
+	}
+
+	m_strGlassID = pGlassID;
+	m_nProcessState = RPS_CmdFileRead;
+	
+	return TRUE;
+}
+
+BOOL CRawResultReader::RawMergeFileReadStop(BOOL bWait/*=TRUE*/)
+{
+	/*
+	if (bWait == TRUE && m_nProcessState == SPS_StateFileRead)
+	{
+		m_nProcessState = SPS_CmdFileStop;
+		while (m_nProcessState == SPS_CmdFileStop) Sleep(0);
+	}
+	*/
+	return TRUE;
+}
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
new file mode 100644
index 0000000..d72e199
--- /dev/null
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
@@ -0,0 +1,65 @@
+#pragma once
+
+#include "DitGlassRawStruct.h"
+#include <vector>
+#include "akCore/akFileUtil.h"
+
+class CRawResultReader
+{
+public:
+	CRawResultReader(void);
+	virtual ~CRawResultReader(void);
+protected:
+	enum emReadProcessState
+	{
+		RPS_StateIdle = 0,
+		RPS_StateFileRead, //읽기 수행 중
+		RPS_ResultReadOK,
+		RPS_ResultReadFail,
+		RPS_CmdFileRead, //읽기 명령 수행
+		RPS_CmdFileStop, //읽기 명령 수행 중지
+		RPS_Num
+	};
+public:
+
+
+	void clear()
+	{
+		m_vecStackDefect.clear();
+	}
+
+	BOOL RawMergeFileReadStart(char* pGlassID);
+	BOOL RawMergeFileReadStop(BOOL bWait = TRUE);
+	BOOL IsRead() { return m_nProcessState == RPS_ResultReadOK ? TRUE : FALSE; }
+
+	int GetDefectNum() { return (int)m_vecStackDefect.size(); }
+	_grmDefectData* GetDefect(int i) { return &m_vecStackDefect[i]; }
+
+	BOOL readOptionFile(char* pFileName = NULL);
+
+	BOOL getRawMergeUse() { return m_bStackUse; };
+	char* getRawMergeLocalPath() { return m_strLocalPath; };
+protected:
+	BOOL openFile(char* pGlassID);
+	static void threadResultFileRead(void* pArg);
+
+	int	m_nThreadStackFileReadFlag;
+
+protected:
+	char m_strConfigFile[MAX_PATH];
+	BOOL m_bStackUse;
+	char m_strLocalPath[MAX_PATH];
+
+
+	emReadProcessState m_nProcessState;//-1:읽기실패,0:Idle, 1:읽기성공, 2:읽기시도(읽기중)
+	std::vector<_grmDefectData> m_vecStackDefect;
+
+	CString	m_strGlassID;
+protected:
+	char* getParsingData(char* pBuf, int nLen, CString* pOutData);
+	char* getParsingData(char* pBuf, int nLen, int* pOutData);
+	char* getParsingData(char* pBuf, int nLen, short* pOutData);
+
+
+
+};
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/resource.h b/DitGlassRawMessenger/DitGlassRawMessenger/resource.h
index e228872..afbcb97 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/resource.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/resource.h
@@ -50,6 +50,8 @@
 #define IDC_EDIT_STACK_PARAM2           1032
 #define IDC_BTN_MANUAL_FTPUPLOAD        1033
 #define IDC_BTN_FTP_MANUALUPLOAD        1033
+#define IDC_CHECK_RAWMERGEFILEREAD      1034
+#define IDC_EDIT_RAWMERGE_LOCALSAVEPATH 1035
 
 // Next default values for new objects
 // 
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
index c37e6e5..e6a5eb9 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
@@ -6,11 +6,16 @@
 {
 	m_hMapBasicInfo = NULL;
 	m_hMapGlassData = NULL;
-
+	m_pDitGlassClient =NULL;
 	m_pGlassRawInfo = NULL;
 	m_pGlassRawData = NULL;
 
 	m_nLastCommandIdx = -1;
+
+	m_pGlassData = NULL;
+	m_pBlockData = NULL;
+	m_pCellData = NULL;
+	m_pDefectData = NULL;
 }
 
 CDitGlassRawClient::~CDitGlassRawClient(void)
@@ -100,6 +105,7 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
 
 	return TRUE;
 }
@@ -132,14 +138,14 @@
 
 	int nCmdId = (m_pGlassRawInfo->m_nCommandIdxWrite+1) % COMMAND_MAXCOUNT;
 
-	if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//占쏙옙占쏙옙 占쏙옙占쌕는곤옙占쏙옙 占쏙옙큘占쏙옙 占쏙옙占쌜곤옙 占싼뱄옙占쏙옙 占쏙옙占쌀다는곤옙!! [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//둘이 같다는것은 서큘러 버퍼가 한바퀴 돌았다는것!! [김태현 2018/11/12]
 	{
-		m_pGlassRawInfo->m_nCommandIdxRead++;//占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占� 占싹놂옙占쏙옙 占쏙옙占쏙옙占싼댐옙. [占쏙옙占쏙옙占쏙옙 2018/11/12]
+		m_pGlassRawInfo->m_nCommandIdxRead++;//가장 오래된 명령 하나를 삭제한다. [김태현 2018/11/12]
 	}
 
 	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nCommand = (short)nCmd;
 	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].strParam;
-	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1占쏙옙占쏙옙占쏙옙, 0占쏙옙占쏙옙, 1占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/13]
+	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1수행전, 0실패, 1성공 [김태현 2018/11/13]
 
 
 	m_nLastCommandIdx = m_pGlassRawInfo->m_nCommandIdxWrite = nCmdId;
@@ -166,6 +172,7 @@
 	if(isConnect() == FALSE) return FALSE;
 	m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
 	m_pGlassData->m_bStackRead = FALSE;
+	m_pGlassData->m_bRawMergeRead = FALSE;
 	return SetCommand(grcSequenceGlassLoading);
 }
 
@@ -197,10 +204,20 @@
 	return SetCommand(grcSequenceCustomReviewDataRead);
 }
 
+CDitGlassRawClient* CDitGlassRawClient::GetInstance()
+{
+	if(m_pDitGlassClient == NULL)
+	{
+		m_pDitGlassClient = new CDitGlassRawClient;
+	}
+
+	return m_pDitGlassClient;
+}
+
 void CDitGlassRawClient::RemoveReviewDefects()
 {
 	int nDefectNum = m_pGlassData->m_nDefectNum;
-	int nRightDefectNum = 0;//占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占십울옙 占쏙옙치占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int nRightDefectNum = 0;//기준점 오른쪽에 위치한 결함 갯수
 	int nDefectDeleteNum = 0;
 	for(int i=nDefectNum-1; i>=0; i--)
 	{
@@ -221,3 +238,5 @@
 
 	m_pGlassData->m_nDefectNum = nDefectNum-nDefectDeleteNum;
 }
+
+CDitGlassRawClient* CDitGlassRawClient::m_pDitGlassClient;
\ No newline at end of file
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.h b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
index 82a185a..df54a2e 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "DitGlassRawStruct.h"
+#include <afxmt.h>
 
 class CDitGlassRawClient
 {
@@ -9,6 +10,8 @@
 	~CDitGlassRawClient(void);
 
 public:
+	static CDitGlassRawClient* GetInstance(); //cmark
+
 	BOOL ConnectServer();
 	BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
 
@@ -22,7 +25,7 @@
 
 	BOOL SetReviewComtomize();
 
-	void RemoveReviewDefects();//AOI占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占싹곤옙, 占쏙옙占썰에占쏙옙 占쏙옙占쏙옙占쏙옙 User 혹占쏙옙 Reflow 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占싼댐옙.
+	void RemoveReviewDefects();//AOI에서 생성한 디펙 정보를 제외하고, 리뷰에서 생성한 User 혹은 Reflow 결함을 제외한다.
 
 	_grmDitMemInfo*	GetGlassMeminfo(){return (_grmDitMemInfo*)m_pGlassRawInfo;};
 	_grmGlassData*	GetGlassData(){return m_pGlassData;};
@@ -30,14 +33,15 @@
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex];};
+	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
 
-	//占쏙옙占� 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占� [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//결과 파일 강제 쓰기 명령 [김태현 2018/11/12]
 	BOOL WriteAOIRawFile();
 
-	//占쏙옙占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占싱너몌옙 占쏙옙占승뤄옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//결과파일 강제 바이너리 형태로 쓰기 [김태현 2018/11/12]
 	BOOL WriteAOIRawBinFile(); 
 
-	//占쏙옙占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占싱너몌옙 占싻깍옙 
+	//결과파일 강제 바이너리 읽기 
 	BOOL ReadAOIRawBinFile();
 
 	BOOL WriteReviewRawBinFile();
@@ -46,14 +50,14 @@
 	BOOL ConnectGlassRawInfo();
 	BOOL ConnectGlassRawData();
 	BOOL SetCommand(emGlassRawCommand nCmd);
-
+	static CDitGlassRawClient* m_pDitGlassClient; //cmark
 protected:
 	_grmGlassData*  m_pGlassData;
 	_grmBlockData*		m_pBlockData;
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
-
+	_grmDefectData* m_pRawMergeData;
 protected:
 	HANDLE		m_hMapBasicInfo;
 	HANDLE		m_hMapGlassData;
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
index e84fb29..e5f7a55 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
 
 #define RAWMESSENGER_MAXCAMNUM 30
 #define RAWMESSENGER_MAXSCANNUM 20
+#define RAWMESSENGER_MAXHLINUM 8
 
 #define MAX_ZONE_NUM 16
 
@@ -47,7 +48,7 @@
 		memset(this, 0, sizeof(_grmGlassData));
 	}
 
-	//Glass 占쏙옙占쏙옙
+	//Glass 정보
 	char m_strFileName[64];
 	char m_strPath[256];
 
@@ -56,12 +57,12 @@
 
 	int m_nOriginDirection;				//{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
 	int m_nConerCutDirection;
-	int	m_nScanCoordinateY;				//占쏙옙占썩가 0占싱몌옙 占싹뱄옙, 1占싱몌옙 Scan占쏙옙占쏙옙占쏙옙 y占쏙옙(占쏙옙 scan占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙, offline 占쏙옙占쏙옙 占쏙옙占쏙옙)
+	int	m_nScanCoordinateY;				//여기가 0이면 일반, 1이면 Scan방향이 y축(즉 scan방향이 단축, offline 설비 같은)
 
 	int m_nGlassSizeWidth;
 	int m_nGlassSizeHeight;
 
-	//占쏙옙占쏙옙占쏙옙占쏙옙
+	//설비정보
 	char m_strLine[32];
 	char m_strEquipType[32];			
 	char m_strEquipID[32];				
@@ -74,7 +75,7 @@
 	CTime	m_tmReviewLoading;
 	CTime	m_tmReviewEnd;
 
-	//占썩본 占쏙옙占쏙옙占쏙옙占쏙옙
+	//기본 물류정보
 	char m_strGlassID[32];				//Glass ID
 	char m_strPPID[32];					
 	char m_strEPPID[32];				
@@ -91,7 +92,7 @@
 	char m_strVCRGlassID[32];
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
 	int			m_nDefectNumStackSP;
 
 
-	//카占쌨띰옙/占쏙옙캔 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//카메라/스캔 정보 [김태현 2018/12/5]
 	short		m_nCameraNum;
 	short		m_nScanNum;
-	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];		
-	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
-	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
+	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];		
+	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
+	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
 
-	//占쏙옙占쏙옙占� 占쏙옙占쏙옙 um[占쏙옙占쏙옙占쏙옙 2018/12/10]
+	//얼라인 정보 um[김태현 2018/12/10]
 	double	m_nAlignCcdTheta;
 	double	m_nAlignCcdShitftX;
 	double	m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
 	char	m_strAlignSecond[64];
 // 	char	m_strAlignPath[256];
 
-	//CSOT占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//CSOT용 물류 정보 [김태현 2018/12/5]
 	char m_strCassetteSequenceNo[16];
 	char m_strOwnerCode[16];			//2. OWNER_CODE
 	char m_strOwnerType[16];			//3. OWNER_TYPE
@@ -162,7 +163,7 @@
 	char m_strGroupID[16];				//14.GROUP_ID
 	char m_cAutoSampleFlag;				//15.AUTOSAMPLEFLAG
 
-	// CPRJ占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	// CPRJ용 물류 정보
 	char m_strProdType[3];
 	char m_strBatchID[13];
 	char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
 	BYTE m_nGlassDataBitSignal[4];
 	bool m_bJob_end;  
 
-	//201217 CJH - 占쏙옙占쏙옙 Defect Review 占쏙옙占쏙옙
+	//201217 CJH - 찍은 Defect Review 개수
 	int m_nReviewNum;
-	//201221 CJH - 占식쏙옙占쏙옙 Stack 占쏙옙占�
+	//201221 CJH - 파싱한 Stack 결과
 	int m_nStackNum;
 	BOOL m_bStackRead;
 
-	//210203 CJH - CutOff 占쏙옙占� 占쏙옙占쏙옙 占쏙옙
+	int m_nRawMergeNum;
+	BOOL m_bRawMergeRead;
+	//210203 CJH - CutOff 대상 결함 수
 	int m_nCutOffDefectNum;
-	//210323 CJH - Server/Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	//210323 CJH - Server/Frame Shrink 정보 추가
 	char m_strShrinked[6];
-	//210326 CJH - RAW 占쌉뤄옙 Defect 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙肉⑼옙占�
+	//210326 CJH - RAW 입력 Defect 수량 상한 사용여부
 	BOOL m_bRawCutoff;
 
 };
@@ -222,7 +225,7 @@
 	}
 	int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
 	int						m_nCellID;							//1. PANEL_ID
-	short					m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
+	short					m_nModelIdx;				// 몇 번째 모델인가?
 
 	char					m_strCellName[32];
 	int						m_rectCellLeft;
@@ -235,7 +238,7 @@
 	int						m_nJudgeGlade;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
 	char		m_strProImage[32];
 	char		m_strAvgGray_0[12];
 	char		m_strPortion_0[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_0[12];
 	char		m_strAvgAmp_0[12];
 	char		m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
 
 	char		m_strAvgGray_1[12];
 	char		m_strPortion_1[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_1[12];
 	char		m_strAvgAmp_1[12];
 	char		m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
 
 	char		m_strAvgGray_2[12];
 	char		m_strPortion_2[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_2[12];
 	char		m_strAvgAmp_2[12];
 	char		m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
 
 	char		m_strAvgGray_3[12];
 	char		m_strPortion_3[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_3[12];
 	char		m_strAvgAmp_3[12];
 	char		m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
 
 	int			m_nReflowResult[8];			// 0: Reflow X 1: Reflow OK 2: Reflow NG
 
-	// Filtering占쏙옙 Stack占쏙옙 占쏙옙
+	// Filtering된 Stack별 수
 	int			m_nDefectTDCount;
 	int			m_nDefectSDCount;
 	int			m_nDefectPDCount;
 	int			m_nDefectSPCount;
 
-	// Gate/Data 占쏙옙 占쏙옙占쏙옙
+	// Gate/Data 총 갯수
 	int			m_nGateNum;
 	int			m_nDataNum;
 
-	// 210129 CJH - Cell Origin 占쏙옙占쏙옙
+	// 210129 CJH - Cell Origin 방향
 	int			m_nCellXDir;
 	int			m_nCellYDir;
 };
@@ -331,10 +334,10 @@
 	}
 
 	//////////////////////////////////////////////////////////////////////////
-	//占쏙옙占썩서 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
+	//여기서 부터 리뷰 영역 [김태현 2019/1/19]
 	ditRaw::ReviewPlanType			m_nPlanType	;	
 	int			m_nResultCode;  //0:None, 1:Success
-	int			m_nShotIndex; //占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	int			m_nShotIndex; //리뷰 찍은 순번 [김태현 2018/12/5]
 	int			m_nModuleIndex;
 	int			m_nMagnificIndex;
 	float		m_fManification;
@@ -343,15 +346,15 @@
 	char		m_strRevImagePath[256];
 
 	//////////////////////////////////////////////////////////////////////////
-	// Measure 占쏙옙占쏙옙
+	// Measure 영역
 	int			m_nMeasure_Index;
 	int			m_nMeasure_ResultCode; //0:None, 1:Success
 	float		m_fMesure_ResultData[8];	// 0:Type, 1:ShiftX, 2:ShiftY
 
 	//////////////////////////////////////////////////////////////////////////
-	// WSI占쏙옙占쏙옙
+	// WSI영역
 	int			m_nWsi_ResultCode; //0:None, 1:Success
-	int			m_nWsi_Type;									// 占쌉몌옙 / 占쏙옙占쏙옙
+	int			m_nWsi_Type;									// 함몰 / 돌기
 	float		m_fWsi_ResultData[8];			// 0:Type, 1:Height(um), 2:Width
 	char		m_strWsi_2DImageFilename[256];
 	char		m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
 	int			m_nWsi_pReflowResultData[8];
 	double		m_dWsi_DamDistance;
 
-	double		m_dWsiMmMotorX;								// WSI 占쏙옙占쏙옙 占쏙옙표 20180223 HJH
+	double		m_dWsiMmMotorX;								// WSI 모터 좌표 20180223 HJH
 	double		m_dWsiMmMotorY;
-	float		m_fWsiManification;							// WSI 占쏙옙占쏙옙
+	float		m_fWsiManification;							// WSI 배율
 
 	//////////////////////////////////////////////////////////////////////////
-	// Reflow 占쏙옙占쏙옙	
+	// Reflow 영역	
 	int			m_nReflow_Index;
-	int			m_nReflow_ResultCode; //0:None, // 占쏙옙占쏙옙占쏙옙 Line占쏙옙 占쏙옙占쏙옙. 3 占싱몌옙 : DAM2 Reflow 占쏙옙占쏙옙, 4~5 : DAM1 Reflow 占쏙옙占쏙옙, 6 : no Reflow 占쏙옙占쏙옙 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
+	int			m_nReflow_ResultCode; //0:None, // 검출한 Line의 개수. 3 미만 : DAM2 Reflow 판정, 4~5 : DAM1 Reflow 판정, 6 : no Reflow 판정 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
 	float		m_fReflow_LinePosData[8];	
 	int			m_nReflow_Side;
 	int			m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
 	short			m_nDefectID;
 	short			m_nCameraID;
 	short			m_nScanIdx;
-	//short			m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙
-	int				m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙 201207 CJH - 占쌘몌옙 占쏙옙 占쏙옙침. int占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
+	//short			m_nDefectIdx;				// 카메라에서의 결함 인덱스
+	int				m_nDefectIdx;				// 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경
 
-	int				m_nPixelConv;				// pixel 占쏙옙占쏙옙 占쏙옙표
-	int				m_nPixelScan;				// pixel 占쏙옙占쏙옙 占쏙옙표
+	int				m_nPixelConv;				// pixel 단위 좌표
+	int				m_nPixelScan;				// pixel 단위 좌표
 
-	short							m_nPixelSize;				// 占쏙옙占쏙옙크占쏙옙		---------------------------------PS
-	short/*SERVER_DefectType*/		m_DefectType;				// 占쏙옙占쏙옙 타占쏙옙	---------------------------------DT
-	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙.
-	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 占쏙옙占쏙옙 타占쏙옙 - Bright, Dark, Both
+	short							m_nPixelSize;				// 결함크기		---------------------------------PS
+	short/*SERVER_DefectType*/		m_DefectType;				// 결함 타입	---------------------------------DT
+	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 결함의 판정상태.
+	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 결함 타입 - Bright, Dark, Both
 
-	short			m_sPixelWidth;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占십븝옙
-	short			m_sPixelHeight;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
-	short			m_nLevelSrcMin;				// 占쏙옙占쏙옙 占쏙옙占� Min	-----------------------------SN
-	short			m_nLevelSrcMax;				// 占쏙옙占쏙옙 占쏙옙占� Max	-----------------------------SX
-	short			m_nLevelSrcAvg;				// 占쏙옙占쏙옙 占쏙옙占� Avg	-----------------------------SA
-	short			m_nLevelRefMin;				// 占쏟교댐옙占� 占쏙옙占� Min	-------------------------RN
-	short			m_nLevelRefMax;				// 占쏟교댐옙占� 占쏙옙占� Max	-------------------------RX
-	short			m_nLevelRefAvg;				// 占쏟교댐옙占� 占쏙옙占� Avg	-------------------------RA
-	short			m_nLevelDiffMin;			// 占쏙옙占쏙옙 Min	---------------------------------DN
-	short			m_nLevelDiffMax;			// 占쏙옙占쏙옙 Max	---------------------------------DX
-	short			m_nLevelDiffAvg;			// 占쏙옙占쏙옙 Avg	---------------------------------DA
+	short			m_sPixelWidth;				// 픽셀단위 결함 너비
+	short			m_sPixelHeight;				// 픽셀단위 결함 높이
+	short			m_nLevelSrcMin;				// 결함 밝기 Min	-----------------------------SN
+	short			m_nLevelSrcMax;				// 결함 밝기 Max	-----------------------------SX
+	short			m_nLevelSrcAvg;				// 결함 밝기 Avg	-----------------------------SA
+	short			m_nLevelRefMin;				// 비교대상 밝기 Min	-------------------------RN
+	short			m_nLevelRefMax;				// 비교대상 밝기 Max	-------------------------RX
+	short			m_nLevelRefAvg;				// 비교대상 밝기 Avg	-------------------------RA
+	short			m_nLevelDiffMin;			// 비교차 Min	---------------------------------DN
+	short			m_nLevelDiffMax;			// 비교차 Max	---------------------------------DX
+	short			m_nLevelDiffAvg;			// 비교차 Avg	---------------------------------DA
 
-	int				m_nDefectRScale;			// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙	-------------------------RS
-	short			m_sThreshold;				// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold
-	short			m_sThresholdAvg;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold AVG
-	short			m_sDefectPeak;				// 占쏙옙占쏙옙占쏙옙 Peak.
-	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 占쏙옙청占쏙옙占쏙옙
+	int				m_nDefectRScale;			// 픽셀단위 결함 높이	-------------------------RS
+	short			m_sThreshold;				// 결함을 검출할 때의 Threshold
+	short			m_sThresholdAvg;			// 결함을 검출할 때의 Threshold AVG
+	short			m_sDefectPeak;				// 결함의 Peak.
+	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 요청사항
 
-	int				m_nPixelGlassStart;			// Glass 占쏙옙占쏙옙 占싫쇽옙
+	int				m_nPixelGlassStart;			// Glass 시작 픽셀
 	short			m_sDefectLoc;
 
 	short			m_sZoneClassPixelCount[16];
-	short			m_sZonePixelCount[16];	// Zone占쏙옙 占쏙옙占쏙옙 Pixel 占쏙옙
-	short			m_sZoneValueMin[16];	// Zone占쏙옙 占쏙옙占쏙옙 Min
-	short			m_sZoneValueMax[16];	// Zone占쏙옙 占쏙옙占쏙옙 Max
-	short			m_sZoneValueAvg[16];	// Zone占쏙옙 占쏙옙占쏙옙 Avg
+	short			m_sZonePixelCount[16];	// Zone별 결함 Pixel 수
+	short			m_sZoneValueMin[16];	// Zone별 결함 Min
+	short			m_sZoneValueMax[16];	// Zone별 결함 Max
+	short			m_sZoneValueAvg[16];	// Zone별 결함 Avg
 	short			m_sZonePixelPercent[16];	// --------------------------------------Z0~ZF
 
-	//210127 CJH - Zone占쏙옙 Source Gray 占쌉뤄옙
-	short			m_sZoneValueSrcMin[16];	// Zone占쏙옙 Source Min
-	short			m_sZoneValueSrcMax[16];	// Zone占쏙옙 Source Max
-	short			m_sZoneValueSrcAvg[16]; // Zone占쏙옙 Source Avg
+	//210127 CJH - Zone별 Source Gray 입력
+	short			m_sZoneValueSrcMin[16];	// Zone별 Source Min
+	short			m_sZoneValueSrcMax[16];	// Zone별 Source Max
+	short			m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
 
-	int				m_nUMOriginX;				// um占쏙옙占쏙옙 x占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMOriginY;				// um占쏙옙占쏙옙 y占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMCenterAlignX;			// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterAlignY;			// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterX;				// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterY;				// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMSizeX;					// um占쏙옙占쏙옙 X 크占쏙옙	-----------------------------UX
-	int				m_nUMSizeY;					// um占쏙옙占쏙옙 Y 크占쏙옙	-----------------------------UY
-	int				m_nUMSize;					// um占쏙옙占쏙옙 크占쏙옙.
-	CRect			m_RectUM;					// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占썹각占쏙옙.
+	int				m_nUMOriginX;				// um단위 x좌표 (원점기준)
+	int				m_nUMOriginY;				// um단위 y조표 (원점기준)
+	int				m_nUMCenterAlignX;			// um단위 X좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterAlignY;			// um단위 Y좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterX;				// um단위 X좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMCenterY;				// um단위 Y좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMSizeX;					// um단위 X 크기	-----------------------------UX
+	int				m_nUMSizeY;					// um단위 Y 크기	-----------------------------UY
+	int				m_nUMSize;					// um단위 크기.
+	CRect			m_RectUM;					// 디펙 센터 기준 사각형.
 
-	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 占쏙옙占쏙옙 크占쏙옙 占쏙옙占쏙옙enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
-	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak占쏙옙 占쏙옙占쏙옙.
-	short/*Judgement*/				m_DefectJudgement;			// 占쏙옙占쏙옙 占쏙옙占쏙옙.
-	BOOL					m_bDefectCutoff;			// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙(TRUE= Cutoff, FALSE)
-	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16占쏙옙占� 占쏙옙占쏙옙
-	int				m_nPadRegionIdx;			// PAD 占쏙옙占쏙옙 占싸듸옙占쏙옙
+	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 결함 크기 종류enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
+	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak의 종류.
+	short/*Judgement*/				m_DefectJudgement;			// 결함 판정.
+	BOOL					m_bDefectCutoff;			// 컷 오프 디펙(TRUE= Cutoff, FALSE)
+	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16등분 구분
+	int				m_nPadRegionIdx;			// PAD 영역 인덱스
 
-	int				m_nUMCellX;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 x 占쏙옙표
-	int				m_nUMCellY;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 y 占쏙옙표
-	short			m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
-	short			m_nCellIdx;					// 占쏙옙占승� 占쏙옙占싸곤옙?
-	short			m_nCellGate;				// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellData;				// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellGateAlign;			// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellDataAlign;			// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
+	int				m_nUMCellX;					// 셀 원점 기준 x 좌표
+	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
+	short			m_nModelIdx;				// 몇 번째 모델인가?
+	short			m_nCellIdx;					// 몇번째 셀인가?
+	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
+	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
+	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
+	short			m_nCellDataAlign;			// 셀별 Data라인(얼라인 보정 후)
 
-	int				m_nUMShotX;					// 占쏙옙 占쏙옙占쏙옙 X占쏙옙표
-	int				m_nUMShotY;					// 占쏙옙 占쏙옙占쏙옙 Y占쏙옙표
-	short			m_nMaskDefectIdx;			// 占쏙옙 Glass占쏙옙占쏙옙 占쌩견듸옙 占쏙옙占쏙옙크占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占싸듸옙占쏙옙.
-	short			m_nShotIdx;					// 占쎈광占쏙옙 占쏙옙호
-	short			m_nMatchShotCount;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙占쏙옙占쏙옙 占쏙옙.
-	short			m_nMatchMaxSize;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙 占쏙옙占쏙옙 큰 占쏙옙占쏙옙占쏙옙 크占쏙옙.
+	int				m_nUMShotX;					// 샷 기준 X좌표
+	int				m_nUMShotY;					// 샷 기준 Y좌표
+	short			m_nMaskDefectIdx;			// 한 Glass에서 발견된 마스크결함 묶음의 인덱스.
+	short			m_nShotIdx;					// 노광샷 번호
+	short			m_nMatchShotCount;			// 동일한 마스크 결함의 수.
+	short			m_nMatchMaxSize;			// 동일한 마스크 중 가장 큰 결함의 크기.
 
-	short			m_nRepeatCount;				// 占쏙옙占쌈곤옙占쌉발곤옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙표 占쌥븝옙占쏙옙
+	short			m_nRepeatCount;				// 연속결함발견위한 동일좌표 반복수
 	short			m_nMaskRepeatCount;
 	int				m_StackInfo;				// Stack Flag
-	BOOL			m_bRealStack;				// Stack 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 TD(TRUE) 占쏙옙占쏙옙, 占쏙옙占싶몌옙占쏙옙 占쏙옙占쏙옙 TD(FALSE)占쏙옙占쏙옙占쏙옙 占쏙옙 占쌍댐옙.
-	short			m_nStackStepCount;			// Stack 占쏙옙
-	short			m_nStackColorIdx;			// Color占쏙옙 占쏙옙占쏙옙占싹댐옙 占싸듸옙占쏙옙.
+	BOOL			m_bRealStack;				// Stack 머지에 의한 TD(TRUE) 인지, 필터링에 의한 TD(FALSE)구분할 수 있다.
+	short			m_nStackStepCount;			// Stack 수
+	short			m_nStackColorIdx;			// Color를 선택하는 인덱스.
 	//CString			m_strStackStep[CFDEFECT_STACKCOUNT];			// Stack Step.
-	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 占쌍댐옙 占쏙옙占쏙옙占쏙옙 60bytes
-	char			m_strUnitID[16];				// 占쏙옙占쌍억옙占싱듸옙
+	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 최대 사이즈 60bytes
+	char			m_strUnitID[16];				// 유닛아이디
 
-	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI占쏙옙 TFE占쏙옙 占쌩곤옙 占싻뤄옙  占싯곤옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占�.
-	int				m_nAtomWidth;				// TFE 占쏙옙 占십븝옙
-	int				m_nAtomHeight;				// TFE 占쏙옙 占쏙옙占쏙옙
-	short/*ReKind*/			m_DefectKind;				// 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
+	int				m_nAtomWidth;				// TFE 핵 너비
+	int				m_nAtomHeight;				// TFE 핵 높이
+	short/*ReKind*/			m_DefectKind;				// 결함 종류
 
 	char			m_strDefectCode[32];			// Defect Code
 	BOOL			m_bMergeState;				// Merge Status
 	char			m_strAoiImageName[256];			// Defect Image Name(CCD Image)
-	int				m_nDefectMerge;		// 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_nDefectMerge;		// 현재 디펙의 머지 여부
 
 
 	int				m_nPixelSizeOrigin;
 	int				m_nScratchRatio;
-	int				m_nDensity;			// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占싻듸옙 [2017.8.2 bhs]
+	int				m_nDensity;			// 원형 결함 구분을 위한 밀도 [2017.8.2 bhs]
 
 	char			m_strDefectName[16];
 	char			m_strDefectType[16];
@@ -491,16 +494,16 @@
 	double			m_dScanResolution;
 	double			m_dConvResolution;
 
-	int				m_nAngle;					// 占쏙옙占쏙옙
-	int				m_nMajor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Long)
-	int				m_nMinor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Short)
-	int				m_nCompact;					// Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占싹댐옙 占쏙옙占쏙옙 占쏙옙占싱울옙 Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
-	int				m_nThickness;				// Blob 占쏙옙占싱울옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 (Area / Major)
+	int				m_nAngle;					// 각도
+	int				m_nMajor;					// 장축 길이(Long)
+	int				m_nMinor;					// 단축 길이(Short)
+	int				m_nCompact;					// Blob 장축을 지름으로 하는 원의 넓이와 Blob 넓이의 비율
+	int				m_nThickness;				// Blob 넓이와 장축의 비율 (Area / Major)
 	
-	short			m_nHliLevelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占쏙옙(채占쏙옙)占싸곤옙?
-	int				m_nHliLayers;				// 占쌔댐옙占쏙옙篤占� 占쏙옙占쌉듸옙 占쏙옙占싱억옙 bit처占쏙옙
+	short			m_nHliLevelIdx;				// 몇 번째 레벨(채널)인가?
+	int				m_nHliLayers;				// 해당결함에 포함된 레이어 bit처리
 
-	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 정보 추가
 
 	char			m_strAoiImagePath[255];
 	char			m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
 	int				m_nAlignRectRight;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
 	_grmDefectReviewData m_ReviewDefect;
 };
 
@@ -556,32 +558,35 @@
 
 struct _grmDitMemInfo
 {
-	//占쏙옙占쏙옙 占쌨몌옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//공유 메모리 생성할 공간 결정 [김태현 2018/11/12]
 	size_t m_nGlassRawDataSize;
 	int m_nGlassMaxDataNum;
 	int m_nBlockMaxDataNum;
 	int m_nCellMaxDataNum;
 	int m_nDefectMaxDataNum;
 	int m_nStackMaxDataNum;
+	int m_nRawMergeMaxDataNum;
 
-	//Char 占쏙옙占쏙옙 占쌘료가 占쌍댐옙 占쏙옙占쏙옙 占쏙옙치 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12]
 	int m_nGlassDataPoint;
 	int m_nBlockDataPoint;
 	int m_nCellDataPoint;
 	int m_nDefectDataPoint;
 	int m_nStackDataPoint;
+	int m_nRawMergeDataPoint;
 
 	int m_nSizeOfGlassData;
 	int m_nSizeOfBlockData;
 	int m_nSizeOfCellData;
 	int m_nSizeOfDefectData;
 	int m_nSizeOfStackData;
+	int m_nSizeOfRawMergeData;
 };
 struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
 {
 	size_t m_nGlassLoadingCount;
-	emAOIProcStep m_ClientProcStep; //AOI, Review占쏙옙 占쏙옙占쏙옙 占쏙옙占�
-	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)占쏙옙 처占쏙옙 占싹뤄옙 占쏙옙 占쏙옙占�
+	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
+	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
 };
 
 class CgrmGlassRawData
@@ -668,7 +673,7 @@
 	{
 		if(pInfo == NULL || pData == NULL) return FALSE;
 
-		if(1) //new type //占쌨몌옙 占쏙옙 占쏙옙占쏙옙 크占썩에 占쏙옙占쏙옙占쏙옙占� 
+		if(1) //new type //메모리 총 공간 크기에 상관없이 
 		{
 			//if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
 
diff --git a/ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp b/ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp
index 85f4cab..e88e79b 100644
--- a/ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp
+++ b/ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp
@@ -41,7 +41,8 @@
 		|| sizeof(_grmBlockData) != m_pGlassRawInfo->m_nSizeOfBlockData
 		|| sizeof(_grmCellData) != m_pGlassRawInfo->m_nSizeOfCellData
 		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfDefectData
-		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData)
+		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData
+		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfRawMergeData)
 	{
 		return FALSE;
 	}
@@ -51,7 +52,8 @@
 	m_pGlassRawInfo->m_nCellMaxDataNum = nCellNum;
 	m_pGlassRawInfo->m_nDefectMaxDataNum = nDefectNum;
 	m_pGlassRawInfo->m_nStackMaxDataNum = nDefectNum;
-	
+	m_pGlassRawInfo->m_nRawMergeMaxDataNum = nDefectNum;
+
 	m_pGlassRawInfo->m_nGlassRawDataSize;
 	{
 		int nDataNum = 0;
@@ -71,6 +73,9 @@
 		m_pGlassRawInfo->m_nStackDataPoint = nDataNum;
 		nDataNum += (m_pGlassRawInfo->m_nSizeOfStackData + m_pGlassRawInfo->m_nSizeOfStackData % 4)*nDefectNum;
 		
+		m_pGlassRawInfo->m_nRawMergeDataPoint = nDataNum;
+		nDataNum += (m_pGlassRawInfo->m_nSizeOfRawMergeData + m_pGlassRawInfo->m_nSizeOfRawMergeData % 4)*nDefectNum;
+
 		m_pGlassRawInfo->m_nGlassRawDataSize = nDataNum;
 	}
 	
@@ -125,6 +130,7 @@
 			m_pGlassRawInfo->m_nSizeOfCellData = sizeof(_grmCellData);
 			m_pGlassRawInfo->m_nSizeOfDefectData = sizeof(_grmDefectData);
 			m_pGlassRawInfo->m_nSizeOfStackData = sizeof(_grmDefectData);
+			m_pGlassRawInfo->m_nSizeOfRawMergeData = sizeof(_grmDefectData);
 
 			int bytealign = m_pGlassRawInfo->m_nSizeOfGlassData%4;
 		}
@@ -178,6 +184,7 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
 
 	return TRUE;
 }
diff --git a/ReviewHistory/ReveiwHistory/DitGlassRawServer.h b/ReviewHistory/ReveiwHistory/DitGlassRawServer.h
index cda09f0..a3dc3f5 100644
--- a/ReviewHistory/ReveiwHistory/DitGlassRawServer.h
+++ b/ReviewHistory/ReveiwHistory/DitGlassRawServer.h
@@ -18,6 +18,7 @@
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
+	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
 
 	_grmDitGlassRawInfo* GetGlassRawInfo(){return m_pGlassRawInfo;};
 
@@ -31,7 +32,7 @@
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
-
+	_grmDefectData* m_pRawMergeData;
 
 protected:
 	HANDLE		m_hMapBasicInfo;
diff --git a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
index e84fb29..e5f7a55 100644
--- a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
+++ b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
 
 #define RAWMESSENGER_MAXCAMNUM 30
 #define RAWMESSENGER_MAXSCANNUM 20
+#define RAWMESSENGER_MAXHLINUM 8
 
 #define MAX_ZONE_NUM 16
 
@@ -47,7 +48,7 @@
 		memset(this, 0, sizeof(_grmGlassData));
 	}
 
-	//Glass 占쏙옙占쏙옙
+	//Glass 정보
 	char m_strFileName[64];
 	char m_strPath[256];
 
@@ -56,12 +57,12 @@
 
 	int m_nOriginDirection;				//{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
 	int m_nConerCutDirection;
-	int	m_nScanCoordinateY;				//占쏙옙占썩가 0占싱몌옙 占싹뱄옙, 1占싱몌옙 Scan占쏙옙占쏙옙占쏙옙 y占쏙옙(占쏙옙 scan占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙, offline 占쏙옙占쏙옙 占쏙옙占쏙옙)
+	int	m_nScanCoordinateY;				//여기가 0이면 일반, 1이면 Scan방향이 y축(즉 scan방향이 단축, offline 설비 같은)
 
 	int m_nGlassSizeWidth;
 	int m_nGlassSizeHeight;
 
-	//占쏙옙占쏙옙占쏙옙占쏙옙
+	//설비정보
 	char m_strLine[32];
 	char m_strEquipType[32];			
 	char m_strEquipID[32];				
@@ -74,7 +75,7 @@
 	CTime	m_tmReviewLoading;
 	CTime	m_tmReviewEnd;
 
-	//占썩본 占쏙옙占쏙옙占쏙옙占쏙옙
+	//기본 물류정보
 	char m_strGlassID[32];				//Glass ID
 	char m_strPPID[32];					
 	char m_strEPPID[32];				
@@ -91,7 +92,7 @@
 	char m_strVCRGlassID[32];
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
 	int			m_nDefectNumStackSP;
 
 
-	//카占쌨띰옙/占쏙옙캔 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//카메라/스캔 정보 [김태현 2018/12/5]
 	short		m_nCameraNum;
 	short		m_nScanNum;
-	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];		
-	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
-	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
+	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];		
+	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
+	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
 
-	//占쏙옙占쏙옙占� 占쏙옙占쏙옙 um[占쏙옙占쏙옙占쏙옙 2018/12/10]
+	//얼라인 정보 um[김태현 2018/12/10]
 	double	m_nAlignCcdTheta;
 	double	m_nAlignCcdShitftX;
 	double	m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
 	char	m_strAlignSecond[64];
 // 	char	m_strAlignPath[256];
 
-	//CSOT占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//CSOT용 물류 정보 [김태현 2018/12/5]
 	char m_strCassetteSequenceNo[16];
 	char m_strOwnerCode[16];			//2. OWNER_CODE
 	char m_strOwnerType[16];			//3. OWNER_TYPE
@@ -162,7 +163,7 @@
 	char m_strGroupID[16];				//14.GROUP_ID
 	char m_cAutoSampleFlag;				//15.AUTOSAMPLEFLAG
 
-	// CPRJ占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	// CPRJ용 물류 정보
 	char m_strProdType[3];
 	char m_strBatchID[13];
 	char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
 	BYTE m_nGlassDataBitSignal[4];
 	bool m_bJob_end;  
 
-	//201217 CJH - 占쏙옙占쏙옙 Defect Review 占쏙옙占쏙옙
+	//201217 CJH - 찍은 Defect Review 개수
 	int m_nReviewNum;
-	//201221 CJH - 占식쏙옙占쏙옙 Stack 占쏙옙占�
+	//201221 CJH - 파싱한 Stack 결과
 	int m_nStackNum;
 	BOOL m_bStackRead;
 
-	//210203 CJH - CutOff 占쏙옙占� 占쏙옙占쏙옙 占쏙옙
+	int m_nRawMergeNum;
+	BOOL m_bRawMergeRead;
+	//210203 CJH - CutOff 대상 결함 수
 	int m_nCutOffDefectNum;
-	//210323 CJH - Server/Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	//210323 CJH - Server/Frame Shrink 정보 추가
 	char m_strShrinked[6];
-	//210326 CJH - RAW 占쌉뤄옙 Defect 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙肉⑼옙占�
+	//210326 CJH - RAW 입력 Defect 수량 상한 사용여부
 	BOOL m_bRawCutoff;
 
 };
@@ -222,7 +225,7 @@
 	}
 	int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
 	int						m_nCellID;							//1. PANEL_ID
-	short					m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
+	short					m_nModelIdx;				// 몇 번째 모델인가?
 
 	char					m_strCellName[32];
 	int						m_rectCellLeft;
@@ -235,7 +238,7 @@
 	int						m_nJudgeGlade;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
 	char		m_strProImage[32];
 	char		m_strAvgGray_0[12];
 	char		m_strPortion_0[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_0[12];
 	char		m_strAvgAmp_0[12];
 	char		m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
 
 	char		m_strAvgGray_1[12];
 	char		m_strPortion_1[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_1[12];
 	char		m_strAvgAmp_1[12];
 	char		m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
 
 	char		m_strAvgGray_2[12];
 	char		m_strPortion_2[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_2[12];
 	char		m_strAvgAmp_2[12];
 	char		m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
 
 	char		m_strAvgGray_3[12];
 	char		m_strPortion_3[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_3[12];
 	char		m_strAvgAmp_3[12];
 	char		m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
 
 	int			m_nReflowResult[8];			// 0: Reflow X 1: Reflow OK 2: Reflow NG
 
-	// Filtering占쏙옙 Stack占쏙옙 占쏙옙
+	// Filtering된 Stack별 수
 	int			m_nDefectTDCount;
 	int			m_nDefectSDCount;
 	int			m_nDefectPDCount;
 	int			m_nDefectSPCount;
 
-	// Gate/Data 占쏙옙 占쏙옙占쏙옙
+	// Gate/Data 총 갯수
 	int			m_nGateNum;
 	int			m_nDataNum;
 
-	// 210129 CJH - Cell Origin 占쏙옙占쏙옙
+	// 210129 CJH - Cell Origin 방향
 	int			m_nCellXDir;
 	int			m_nCellYDir;
 };
@@ -331,10 +334,10 @@
 	}
 
 	//////////////////////////////////////////////////////////////////////////
-	//占쏙옙占썩서 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
+	//여기서 부터 리뷰 영역 [김태현 2019/1/19]
 	ditRaw::ReviewPlanType			m_nPlanType	;	
 	int			m_nResultCode;  //0:None, 1:Success
-	int			m_nShotIndex; //占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	int			m_nShotIndex; //리뷰 찍은 순번 [김태현 2018/12/5]
 	int			m_nModuleIndex;
 	int			m_nMagnificIndex;
 	float		m_fManification;
@@ -343,15 +346,15 @@
 	char		m_strRevImagePath[256];
 
 	//////////////////////////////////////////////////////////////////////////
-	// Measure 占쏙옙占쏙옙
+	// Measure 영역
 	int			m_nMeasure_Index;
 	int			m_nMeasure_ResultCode; //0:None, 1:Success
 	float		m_fMesure_ResultData[8];	// 0:Type, 1:ShiftX, 2:ShiftY
 
 	//////////////////////////////////////////////////////////////////////////
-	// WSI占쏙옙占쏙옙
+	// WSI영역
 	int			m_nWsi_ResultCode; //0:None, 1:Success
-	int			m_nWsi_Type;									// 占쌉몌옙 / 占쏙옙占쏙옙
+	int			m_nWsi_Type;									// 함몰 / 돌기
 	float		m_fWsi_ResultData[8];			// 0:Type, 1:Height(um), 2:Width
 	char		m_strWsi_2DImageFilename[256];
 	char		m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
 	int			m_nWsi_pReflowResultData[8];
 	double		m_dWsi_DamDistance;
 
-	double		m_dWsiMmMotorX;								// WSI 占쏙옙占쏙옙 占쏙옙표 20180223 HJH
+	double		m_dWsiMmMotorX;								// WSI 모터 좌표 20180223 HJH
 	double		m_dWsiMmMotorY;
-	float		m_fWsiManification;							// WSI 占쏙옙占쏙옙
+	float		m_fWsiManification;							// WSI 배율
 
 	//////////////////////////////////////////////////////////////////////////
-	// Reflow 占쏙옙占쏙옙	
+	// Reflow 영역	
 	int			m_nReflow_Index;
-	int			m_nReflow_ResultCode; //0:None, // 占쏙옙占쏙옙占쏙옙 Line占쏙옙 占쏙옙占쏙옙. 3 占싱몌옙 : DAM2 Reflow 占쏙옙占쏙옙, 4~5 : DAM1 Reflow 占쏙옙占쏙옙, 6 : no Reflow 占쏙옙占쏙옙 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
+	int			m_nReflow_ResultCode; //0:None, // 검출한 Line의 개수. 3 미만 : DAM2 Reflow 판정, 4~5 : DAM1 Reflow 판정, 6 : no Reflow 판정 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
 	float		m_fReflow_LinePosData[8];	
 	int			m_nReflow_Side;
 	int			m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
 	short			m_nDefectID;
 	short			m_nCameraID;
 	short			m_nScanIdx;
-	//short			m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙
-	int				m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙 201207 CJH - 占쌘몌옙 占쏙옙 占쏙옙침. int占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
+	//short			m_nDefectIdx;				// 카메라에서의 결함 인덱스
+	int				m_nDefectIdx;				// 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경
 
-	int				m_nPixelConv;				// pixel 占쏙옙占쏙옙 占쏙옙표
-	int				m_nPixelScan;				// pixel 占쏙옙占쏙옙 占쏙옙표
+	int				m_nPixelConv;				// pixel 단위 좌표
+	int				m_nPixelScan;				// pixel 단위 좌표
 
-	short							m_nPixelSize;				// 占쏙옙占쏙옙크占쏙옙		---------------------------------PS
-	short/*SERVER_DefectType*/		m_DefectType;				// 占쏙옙占쏙옙 타占쏙옙	---------------------------------DT
-	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙.
-	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 占쏙옙占쏙옙 타占쏙옙 - Bright, Dark, Both
+	short							m_nPixelSize;				// 결함크기		---------------------------------PS
+	short/*SERVER_DefectType*/		m_DefectType;				// 결함 타입	---------------------------------DT
+	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 결함의 판정상태.
+	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 결함 타입 - Bright, Dark, Both
 
-	short			m_sPixelWidth;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占십븝옙
-	short			m_sPixelHeight;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
-	short			m_nLevelSrcMin;				// 占쏙옙占쏙옙 占쏙옙占� Min	-----------------------------SN
-	short			m_nLevelSrcMax;				// 占쏙옙占쏙옙 占쏙옙占� Max	-----------------------------SX
-	short			m_nLevelSrcAvg;				// 占쏙옙占쏙옙 占쏙옙占� Avg	-----------------------------SA
-	short			m_nLevelRefMin;				// 占쏟교댐옙占� 占쏙옙占� Min	-------------------------RN
-	short			m_nLevelRefMax;				// 占쏟교댐옙占� 占쏙옙占� Max	-------------------------RX
-	short			m_nLevelRefAvg;				// 占쏟교댐옙占� 占쏙옙占� Avg	-------------------------RA
-	short			m_nLevelDiffMin;			// 占쏙옙占쏙옙 Min	---------------------------------DN
-	short			m_nLevelDiffMax;			// 占쏙옙占쏙옙 Max	---------------------------------DX
-	short			m_nLevelDiffAvg;			// 占쏙옙占쏙옙 Avg	---------------------------------DA
+	short			m_sPixelWidth;				// 픽셀단위 결함 너비
+	short			m_sPixelHeight;				// 픽셀단위 결함 높이
+	short			m_nLevelSrcMin;				// 결함 밝기 Min	-----------------------------SN
+	short			m_nLevelSrcMax;				// 결함 밝기 Max	-----------------------------SX
+	short			m_nLevelSrcAvg;				// 결함 밝기 Avg	-----------------------------SA
+	short			m_nLevelRefMin;				// 비교대상 밝기 Min	-------------------------RN
+	short			m_nLevelRefMax;				// 비교대상 밝기 Max	-------------------------RX
+	short			m_nLevelRefAvg;				// 비교대상 밝기 Avg	-------------------------RA
+	short			m_nLevelDiffMin;			// 비교차 Min	---------------------------------DN
+	short			m_nLevelDiffMax;			// 비교차 Max	---------------------------------DX
+	short			m_nLevelDiffAvg;			// 비교차 Avg	---------------------------------DA
 
-	int				m_nDefectRScale;			// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙	-------------------------RS
-	short			m_sThreshold;				// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold
-	short			m_sThresholdAvg;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold AVG
-	short			m_sDefectPeak;				// 占쏙옙占쏙옙占쏙옙 Peak.
-	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 占쏙옙청占쏙옙占쏙옙
+	int				m_nDefectRScale;			// 픽셀단위 결함 높이	-------------------------RS
+	short			m_sThreshold;				// 결함을 검출할 때의 Threshold
+	short			m_sThresholdAvg;			// 결함을 검출할 때의 Threshold AVG
+	short			m_sDefectPeak;				// 결함의 Peak.
+	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 요청사항
 
-	int				m_nPixelGlassStart;			// Glass 占쏙옙占쏙옙 占싫쇽옙
+	int				m_nPixelGlassStart;			// Glass 시작 픽셀
 	short			m_sDefectLoc;
 
 	short			m_sZoneClassPixelCount[16];
-	short			m_sZonePixelCount[16];	// Zone占쏙옙 占쏙옙占쏙옙 Pixel 占쏙옙
-	short			m_sZoneValueMin[16];	// Zone占쏙옙 占쏙옙占쏙옙 Min
-	short			m_sZoneValueMax[16];	// Zone占쏙옙 占쏙옙占쏙옙 Max
-	short			m_sZoneValueAvg[16];	// Zone占쏙옙 占쏙옙占쏙옙 Avg
+	short			m_sZonePixelCount[16];	// Zone별 결함 Pixel 수
+	short			m_sZoneValueMin[16];	// Zone별 결함 Min
+	short			m_sZoneValueMax[16];	// Zone별 결함 Max
+	short			m_sZoneValueAvg[16];	// Zone별 결함 Avg
 	short			m_sZonePixelPercent[16];	// --------------------------------------Z0~ZF
 
-	//210127 CJH - Zone占쏙옙 Source Gray 占쌉뤄옙
-	short			m_sZoneValueSrcMin[16];	// Zone占쏙옙 Source Min
-	short			m_sZoneValueSrcMax[16];	// Zone占쏙옙 Source Max
-	short			m_sZoneValueSrcAvg[16]; // Zone占쏙옙 Source Avg
+	//210127 CJH - Zone별 Source Gray 입력
+	short			m_sZoneValueSrcMin[16];	// Zone별 Source Min
+	short			m_sZoneValueSrcMax[16];	// Zone별 Source Max
+	short			m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
 
-	int				m_nUMOriginX;				// um占쏙옙占쏙옙 x占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMOriginY;				// um占쏙옙占쏙옙 y占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMCenterAlignX;			// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterAlignY;			// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterX;				// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterY;				// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMSizeX;					// um占쏙옙占쏙옙 X 크占쏙옙	-----------------------------UX
-	int				m_nUMSizeY;					// um占쏙옙占쏙옙 Y 크占쏙옙	-----------------------------UY
-	int				m_nUMSize;					// um占쏙옙占쏙옙 크占쏙옙.
-	CRect			m_RectUM;					// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占썹각占쏙옙.
+	int				m_nUMOriginX;				// um단위 x좌표 (원점기준)
+	int				m_nUMOriginY;				// um단위 y조표 (원점기준)
+	int				m_nUMCenterAlignX;			// um단위 X좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterAlignY;			// um단위 Y좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterX;				// um단위 X좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMCenterY;				// um단위 Y좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMSizeX;					// um단위 X 크기	-----------------------------UX
+	int				m_nUMSizeY;					// um단위 Y 크기	-----------------------------UY
+	int				m_nUMSize;					// um단위 크기.
+	CRect			m_RectUM;					// 디펙 센터 기준 사각형.
 
-	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 占쏙옙占쏙옙 크占쏙옙 占쏙옙占쏙옙enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
-	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak占쏙옙 占쏙옙占쏙옙.
-	short/*Judgement*/				m_DefectJudgement;			// 占쏙옙占쏙옙 占쏙옙占쏙옙.
-	BOOL					m_bDefectCutoff;			// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙(TRUE= Cutoff, FALSE)
-	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16占쏙옙占� 占쏙옙占쏙옙
-	int				m_nPadRegionIdx;			// PAD 占쏙옙占쏙옙 占싸듸옙占쏙옙
+	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 결함 크기 종류enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
+	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak의 종류.
+	short/*Judgement*/				m_DefectJudgement;			// 결함 판정.
+	BOOL					m_bDefectCutoff;			// 컷 오프 디펙(TRUE= Cutoff, FALSE)
+	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16등분 구분
+	int				m_nPadRegionIdx;			// PAD 영역 인덱스
 
-	int				m_nUMCellX;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 x 占쏙옙표
-	int				m_nUMCellY;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 y 占쏙옙표
-	short			m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
-	short			m_nCellIdx;					// 占쏙옙占승� 占쏙옙占싸곤옙?
-	short			m_nCellGate;				// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellData;				// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellGateAlign;			// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellDataAlign;			// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
+	int				m_nUMCellX;					// 셀 원점 기준 x 좌표
+	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
+	short			m_nModelIdx;				// 몇 번째 모델인가?
+	short			m_nCellIdx;					// 몇번째 셀인가?
+	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
+	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
+	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
+	short			m_nCellDataAlign;			// 셀별 Data라인(얼라인 보정 후)
 
-	int				m_nUMShotX;					// 占쏙옙 占쏙옙占쏙옙 X占쏙옙표
-	int				m_nUMShotY;					// 占쏙옙 占쏙옙占쏙옙 Y占쏙옙표
-	short			m_nMaskDefectIdx;			// 占쏙옙 Glass占쏙옙占쏙옙 占쌩견듸옙 占쏙옙占쏙옙크占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占싸듸옙占쏙옙.
-	short			m_nShotIdx;					// 占쎈광占쏙옙 占쏙옙호
-	short			m_nMatchShotCount;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙占쏙옙占쏙옙 占쏙옙.
-	short			m_nMatchMaxSize;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙 占쏙옙占쏙옙 큰 占쏙옙占쏙옙占쏙옙 크占쏙옙.
+	int				m_nUMShotX;					// 샷 기준 X좌표
+	int				m_nUMShotY;					// 샷 기준 Y좌표
+	short			m_nMaskDefectIdx;			// 한 Glass에서 발견된 마스크결함 묶음의 인덱스.
+	short			m_nShotIdx;					// 노광샷 번호
+	short			m_nMatchShotCount;			// 동일한 마스크 결함의 수.
+	short			m_nMatchMaxSize;			// 동일한 마스크 중 가장 큰 결함의 크기.
 
-	short			m_nRepeatCount;				// 占쏙옙占쌈곤옙占쌉발곤옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙표 占쌥븝옙占쏙옙
+	short			m_nRepeatCount;				// 연속결함발견위한 동일좌표 반복수
 	short			m_nMaskRepeatCount;
 	int				m_StackInfo;				// Stack Flag
-	BOOL			m_bRealStack;				// Stack 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 TD(TRUE) 占쏙옙占쏙옙, 占쏙옙占싶몌옙占쏙옙 占쏙옙占쏙옙 TD(FALSE)占쏙옙占쏙옙占쏙옙 占쏙옙 占쌍댐옙.
-	short			m_nStackStepCount;			// Stack 占쏙옙
-	short			m_nStackColorIdx;			// Color占쏙옙 占쏙옙占쏙옙占싹댐옙 占싸듸옙占쏙옙.
+	BOOL			m_bRealStack;				// Stack 머지에 의한 TD(TRUE) 인지, 필터링에 의한 TD(FALSE)구분할 수 있다.
+	short			m_nStackStepCount;			// Stack 수
+	short			m_nStackColorIdx;			// Color를 선택하는 인덱스.
 	//CString			m_strStackStep[CFDEFECT_STACKCOUNT];			// Stack Step.
-	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 占쌍댐옙 占쏙옙占쏙옙占쏙옙 60bytes
-	char			m_strUnitID[16];				// 占쏙옙占쌍억옙占싱듸옙
+	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 최대 사이즈 60bytes
+	char			m_strUnitID[16];				// 유닛아이디
 
-	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI占쏙옙 TFE占쏙옙 占쌩곤옙 占싻뤄옙  占싯곤옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占�.
-	int				m_nAtomWidth;				// TFE 占쏙옙 占십븝옙
-	int				m_nAtomHeight;				// TFE 占쏙옙 占쏙옙占쏙옙
-	short/*ReKind*/			m_DefectKind;				// 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
+	int				m_nAtomWidth;				// TFE 핵 너비
+	int				m_nAtomHeight;				// TFE 핵 높이
+	short/*ReKind*/			m_DefectKind;				// 결함 종류
 
 	char			m_strDefectCode[32];			// Defect Code
 	BOOL			m_bMergeState;				// Merge Status
 	char			m_strAoiImageName[256];			// Defect Image Name(CCD Image)
-	int				m_nDefectMerge;		// 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_nDefectMerge;		// 현재 디펙의 머지 여부
 
 
 	int				m_nPixelSizeOrigin;
 	int				m_nScratchRatio;
-	int				m_nDensity;			// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占싻듸옙 [2017.8.2 bhs]
+	int				m_nDensity;			// 원형 결함 구분을 위한 밀도 [2017.8.2 bhs]
 
 	char			m_strDefectName[16];
 	char			m_strDefectType[16];
@@ -491,16 +494,16 @@
 	double			m_dScanResolution;
 	double			m_dConvResolution;
 
-	int				m_nAngle;					// 占쏙옙占쏙옙
-	int				m_nMajor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Long)
-	int				m_nMinor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Short)
-	int				m_nCompact;					// Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占싹댐옙 占쏙옙占쏙옙 占쏙옙占싱울옙 Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
-	int				m_nThickness;				// Blob 占쏙옙占싱울옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 (Area / Major)
+	int				m_nAngle;					// 각도
+	int				m_nMajor;					// 장축 길이(Long)
+	int				m_nMinor;					// 단축 길이(Short)
+	int				m_nCompact;					// Blob 장축을 지름으로 하는 원의 넓이와 Blob 넓이의 비율
+	int				m_nThickness;				// Blob 넓이와 장축의 비율 (Area / Major)
 	
-	short			m_nHliLevelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占쏙옙(채占쏙옙)占싸곤옙?
-	int				m_nHliLayers;				// 占쌔댐옙占쏙옙篤占� 占쏙옙占쌉듸옙 占쏙옙占싱억옙 bit처占쏙옙
+	short			m_nHliLevelIdx;				// 몇 번째 레벨(채널)인가?
+	int				m_nHliLayers;				// 해당결함에 포함된 레이어 bit처리
 
-	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 정보 추가
 
 	char			m_strAoiImagePath[255];
 	char			m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
 	int				m_nAlignRectRight;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
 	_grmDefectReviewData m_ReviewDefect;
 };
 
@@ -556,32 +558,35 @@
 
 struct _grmDitMemInfo
 {
-	//占쏙옙占쏙옙 占쌨몌옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//공유 메모리 생성할 공간 결정 [김태현 2018/11/12]
 	size_t m_nGlassRawDataSize;
 	int m_nGlassMaxDataNum;
 	int m_nBlockMaxDataNum;
 	int m_nCellMaxDataNum;
 	int m_nDefectMaxDataNum;
 	int m_nStackMaxDataNum;
+	int m_nRawMergeMaxDataNum;
 
-	//Char 占쏙옙占쏙옙 占쌘료가 占쌍댐옙 占쏙옙占쏙옙 占쏙옙치 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12]
 	int m_nGlassDataPoint;
 	int m_nBlockDataPoint;
 	int m_nCellDataPoint;
 	int m_nDefectDataPoint;
 	int m_nStackDataPoint;
+	int m_nRawMergeDataPoint;
 
 	int m_nSizeOfGlassData;
 	int m_nSizeOfBlockData;
 	int m_nSizeOfCellData;
 	int m_nSizeOfDefectData;
 	int m_nSizeOfStackData;
+	int m_nSizeOfRawMergeData;
 };
 struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
 {
 	size_t m_nGlassLoadingCount;
-	emAOIProcStep m_ClientProcStep; //AOI, Review占쏙옙 占쏙옙占쏙옙 占쏙옙占�
-	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)占쏙옙 처占쏙옙 占싹뤄옙 占쏙옙 占쏙옙占�
+	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
+	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
 };
 
 class CgrmGlassRawData
@@ -668,7 +673,7 @@
 	{
 		if(pInfo == NULL || pData == NULL) return FALSE;
 
-		if(1) //new type //占쌨몌옙 占쏙옙 占쏙옙占쏙옙 크占썩에 占쏙옙占쏙옙占쏙옙占� 
+		if(1) //new type //메모리 총 공간 크기에 상관없이 
 		{
 			//if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
 
diff --git a/ReviewHistory/bin/Config/PathSetting.ini b/ReviewHistory/bin/Config/PathSetting.ini
index 3398cde..f334552 100644
--- a/ReviewHistory/bin/Config/PathSetting.ini
+++ b/ReviewHistory/bin/Config/PathSetting.ini
@@ -1,5 +1,5 @@
 [Path]
 Align=D:\ResultData\Align\
 Bin=D:\DIT_ResultData\RawBin\
-Inspector=D:\Image\Defect
+Inspector=\\126.100.100.1\d\Image\Defect
 Review=D:\ResultData\UploadImage\
diff --git a/ReviewHistory/bin/ReviewHistroy.exe b/ReviewHistory/bin/ReviewHistroy.exe
index 2ad1974..4764ff5 100644
--- a/ReviewHistory/bin/ReviewHistroy.exe
+++ b/ReviewHistory/bin/ReviewHistroy.exe
Binary files differ
diff --git a/ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp b/ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp
index e518d50..de5f5ca 100644
--- a/ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp
+++ b/ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp
@@ -77,7 +77,7 @@
 		ProcessFlatness();
 		Sleep(1000);
 
-		if (ProcessDiagnosisJudge() == FALSE) {
+		if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
 			strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
 			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
 		}
@@ -97,7 +97,7 @@
 		ProcessWsi();
 		Sleep(1000);
 
-		if (ProcessDiagnosisJudge() == FALSE) {
+		if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
 			strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
 			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
 		}
@@ -111,7 +111,7 @@
 		m_pManager->m_bProcessAll = false;
 		ProcessSquareness();
 		Sleep(1000);
-		if (ProcessDiagnosisJudge() == FALSE) {
+		if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
 			strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
 			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
 		}
@@ -121,7 +121,7 @@
 		m_pManager->m_bProcessAll = false;
 		ProcessFlatness();
 		Sleep(1000);
-		if (ProcessDiagnosisJudge() == FALSE) {
+		if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
 			strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
 			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
 		}
@@ -171,7 +171,7 @@
 	//Sleep(2000);
 	Sleep(1000);
 
-	if (ProcessDiagnosisJudge() == FALSE) {
+	if (ProcessDiagnosisJudge(DiagnosisMode_All) == FALSE) {
 		strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
 		m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
 	}
@@ -479,7 +479,7 @@
 		{
 			//#3514_LYW_CF AOI Review �옄媛�吏꾨떒 湲곕뒫 媛쒖꽑_START
 			//if (10000 <= GetTickCount() - stTime)
-			if (1000 <= GetTickCount() - stTime)
+			if (11000 <= GetTickCount() - stTime)
 			//#3514_LYW_CF AOI Review �옄媛�吏꾨떒 湲곕뒫 媛쒖꽑_END
 			{
 				break;
@@ -601,33 +601,33 @@
 			Sleep(500);
 		}
 
-		if (nIdx == 0)
-		{
-			pResultPoint[nIdx].dPosX = 657.425
-				;
-			pResultPoint[nIdx].dPosY = 540.14
-				;
-		}
-		else if (nIdx == 1)
-		{
-			pResultPoint[nIdx].dPosX = 657.425
-				;
-			pResultPoint[nIdx].dPosY = 2278.636
-				;
-		}
-		else if (nIdx == 2)
-		{
-			pResultPoint[nIdx].dPosX = 2096.944
-				;
-			pResultPoint[nIdx].dPosY = 540.141
-				;
-		}
-		else if (nIdx == 3)
-		{
-			pResultPoint[nIdx].dPosX = 2096.944
-				;
-			pResultPoint[nIdx].dPosY = 2278.636;
-		}
+// 		if (nIdx == 0)
+// 		{
+// 			pResultPoint[nIdx].dPosX = 657.425
+// 				;
+// 			pResultPoint[nIdx].dPosY = 540.14
+// 				;
+// 		}
+// 		else if (nIdx == 1)
+// 		{
+// 			pResultPoint[nIdx].dPosX = 657.425
+// 				;
+// 			pResultPoint[nIdx].dPosY = 2278.636
+// 				;
+// 		}
+// 		else if (nIdx == 2)
+// 		{
+// 			pResultPoint[nIdx].dPosX = 2096.944
+// 				;
+// 			pResultPoint[nIdx].dPosY = 540.141
+// 				;
+// 		}
+// 		else if (nIdx == 3)
+// 		{
+// 			pResultPoint[nIdx].dPosX = 2096.944
+// 				;
+// 			pResultPoint[nIdx].dPosY = 2278.636;
+// 		}
 
 
 		//1. 紐⑦꽣瑜� �씠�룞
@@ -735,7 +735,7 @@
 	return TRUE;
 }
 
-int CDiagnosisProcessor::ProcessDiagnosisJudge()
+int CDiagnosisProcessor::ProcessDiagnosisJudge(int nMode)
 {
 	for (int i = 0; i < 2; i++)
 	{
@@ -760,22 +760,28 @@
 		}
 
 		CString strMessage = _T("");
-
-		double dDate = (90 - pProcessResult->GetGantryDegree());
-		if (abs(dDate) >= abs(pSettingInfo->GetJudgeData_Degree())) // 0412 kyh 吏곴컖�룄�뿉�꽌 �굹�삩 Dgree 媛믪씠 �꽕�젙�븳 Judge 媛믩낫�떎 �겕嫄곕굹 媛숈쓣寃쎌슦
+		if (nMode == DiagnosisMode_All || nMode == DiagnosisMode_Review || nMode == DiagnosisMode_Squareness)
 		{
+			double dDate = (90 - pProcessResult->GetGantryDegree());
+			if (abs(dDate) >= abs(pSettingInfo->GetJudgeData_Degree())) // 0412 kyh 吏곴컖�룄�뿉�꽌 �굹�삩 Dgree 媛믪씠 �꽕�젙�븳 Judge 媛믩낫�떎 �겕嫄곕굹 媛숈쓣寃쎌슦
+			{
 
-			m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // �븣�엺 諛쒖깮
-			strMessage.Format(_T("[Judge Data] [Gantry %d]Diagnosis Error ! GantryDegree[%lf] Judge[%lf]"), i, dDate, pSettingInfo->GetJudgeData_Degree());
-			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
+				m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // �븣�엺 諛쒖깮
+				strMessage.Format(_T("[Judge Data] [Gantry %d]Diagnosis Error ! GantryDegree[%lf] Judge[%lf]"), i, dDate, pSettingInfo->GetJudgeData_Degree());
+				m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
+			}
 		}
 
-		if (pProcessWSIResult->getWSI_RTB() >= pSettingInfo->GetJudgeData_3Sigma() || pProcessWSIResult->getWSI_RTB() <= 0) // 0412 kyh WSI �몴以��렪李� 鍮꾧탳
+		if (nMode == DiagnosisMode_All || nMode == DiagnosisMode_Wsi)
 		{
-			m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // �븣�엺 諛쒖깮
-			strMessage.Format(_T("[Judge Data] [WSI %d]Diagnosis Error ! WSI RTB[%lf] Judge[%lf]"), i, pProcessWSIResult->getWSI_RTB(), pSettingInfo->GetJudgeData_3Sigma());
-			m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
+			if (pProcessWSIResult->getWSI_RTB() >= pSettingInfo->GetJudgeData_3Sigma() || pProcessWSIResult->getWSI_RTB() <= 0) // 0412 kyh WSI �몴以��렪李� 鍮꾧탳
+			{
+				m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // �븣�엺 諛쒖깮
+				strMessage.Format(_T("[Judge Data] [WSI %d]Diagnosis Error ! WSI RTB[%lf] Judge[%lf]"), i, pProcessWSIResult->getWSI_RTB(), pSettingInfo->GetJudgeData_3Sigma());
+				m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
+			}
 		}
+
 	}
 	//#3407 KYH �옄媛�吏꾨떒 Judge �뙋�젙 諛� �븣�엺 諛쒖깮 湲곕뒫 ADD END
 
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp b/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
index 98841f2..914ff08 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
+++ b/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
@@ -105,6 +105,7 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
 
 	return TRUE;
 }
@@ -139,7 +140,7 @@
 
 	if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//占쏙옙占쏙옙 占쏙옙占쌕는곤옙占쏙옙 占쏙옙큘占쏙옙 占쏙옙占쌜곤옙 占싼뱄옙占쏙옙 占쏙옙占쌀다는곤옙!! [占쏙옙占쏙옙占쏙옙 2018/11/12]
 	{
-		m_pGlassRawInfo->m_nCommandIdxRead++;//占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占� 占싹놂옙占쏙옙 占쏙옙占쏙옙占싼댐옙. [占쏙옙占쏙옙占쏙옙 2018/11/12]
+		m_pGlassRawInfo->m_nCommandIdxRead++;//占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占?占싹놂옙占쏙옙 占쏙옙占쏙옙占싼댐옙. [占쏙옙占쏙옙占쏙옙 2018/11/12]
 	}
 
 	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nCommand = (short)nCmd;
@@ -171,6 +172,7 @@
 	if(isConnect() == FALSE) return FALSE;
 	m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
 	m_pGlassData->m_bStackRead = FALSE;
+	m_pGlassData->m_bRawMergeRead = FALSE;
 	return SetCommand(grcSequenceGlassLoading);
 }
 
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawClient.h b/ReviewSystem/ReviewSystem/DitGlassRawClient.h
index a3ce795..3ad927e 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawClient.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawClient.h
@@ -56,6 +56,7 @@
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
+	_grmDefectData* m_pRawMergeData;
 
 protected:
 	HANDLE		m_hMapBasicInfo;
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
index e84fb29..e5f7a55 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
 
 #define RAWMESSENGER_MAXCAMNUM 30
 #define RAWMESSENGER_MAXSCANNUM 20
+#define RAWMESSENGER_MAXHLINUM 8
 
 #define MAX_ZONE_NUM 16
 
@@ -47,7 +48,7 @@
 		memset(this, 0, sizeof(_grmGlassData));
 	}
 
-	//Glass 占쏙옙占쏙옙
+	//Glass 정보
 	char m_strFileName[64];
 	char m_strPath[256];
 
@@ -56,12 +57,12 @@
 
 	int m_nOriginDirection;				//{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
 	int m_nConerCutDirection;
-	int	m_nScanCoordinateY;				//占쏙옙占썩가 0占싱몌옙 占싹뱄옙, 1占싱몌옙 Scan占쏙옙占쏙옙占쏙옙 y占쏙옙(占쏙옙 scan占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙, offline 占쏙옙占쏙옙 占쏙옙占쏙옙)
+	int	m_nScanCoordinateY;				//여기가 0이면 일반, 1이면 Scan방향이 y축(즉 scan방향이 단축, offline 설비 같은)
 
 	int m_nGlassSizeWidth;
 	int m_nGlassSizeHeight;
 
-	//占쏙옙占쏙옙占쏙옙占쏙옙
+	//설비정보
 	char m_strLine[32];
 	char m_strEquipType[32];			
 	char m_strEquipID[32];				
@@ -74,7 +75,7 @@
 	CTime	m_tmReviewLoading;
 	CTime	m_tmReviewEnd;
 
-	//占썩본 占쏙옙占쏙옙占쏙옙占쏙옙
+	//기본 물류정보
 	char m_strGlassID[32];				//Glass ID
 	char m_strPPID[32];					
 	char m_strEPPID[32];				
@@ -91,7 +92,7 @@
 	char m_strVCRGlassID[32];
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
 	int			m_nDefectNumStackSP;
 
 
-	//카占쌨띰옙/占쏙옙캔 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//카메라/스캔 정보 [김태현 2018/12/5]
 	short		m_nCameraNum;
 	short		m_nScanNum;
-	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];		
-	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
-	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
+	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];		
+	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
+	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
 
-	//占쏙옙占쏙옙占� 占쏙옙占쏙옙 um[占쏙옙占쏙옙占쏙옙 2018/12/10]
+	//얼라인 정보 um[김태현 2018/12/10]
 	double	m_nAlignCcdTheta;
 	double	m_nAlignCcdShitftX;
 	double	m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
 	char	m_strAlignSecond[64];
 // 	char	m_strAlignPath[256];
 
-	//CSOT占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	//CSOT용 물류 정보 [김태현 2018/12/5]
 	char m_strCassetteSequenceNo[16];
 	char m_strOwnerCode[16];			//2. OWNER_CODE
 	char m_strOwnerType[16];			//3. OWNER_TYPE
@@ -162,7 +163,7 @@
 	char m_strGroupID[16];				//14.GROUP_ID
 	char m_cAutoSampleFlag;				//15.AUTOSAMPLEFLAG
 
-	// CPRJ占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	// CPRJ용 물류 정보
 	char m_strProdType[3];
 	char m_strBatchID[13];
 	char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
 	BYTE m_nGlassDataBitSignal[4];
 	bool m_bJob_end;  
 
-	//201217 CJH - 占쏙옙占쏙옙 Defect Review 占쏙옙占쏙옙
+	//201217 CJH - 찍은 Defect Review 개수
 	int m_nReviewNum;
-	//201221 CJH - 占식쏙옙占쏙옙 Stack 占쏙옙占�
+	//201221 CJH - 파싱한 Stack 결과
 	int m_nStackNum;
 	BOOL m_bStackRead;
 
-	//210203 CJH - CutOff 占쏙옙占� 占쏙옙占쏙옙 占쏙옙
+	int m_nRawMergeNum;
+	BOOL m_bRawMergeRead;
+	//210203 CJH - CutOff 대상 결함 수
 	int m_nCutOffDefectNum;
-	//210323 CJH - Server/Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	//210323 CJH - Server/Frame Shrink 정보 추가
 	char m_strShrinked[6];
-	//210326 CJH - RAW 占쌉뤄옙 Defect 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙肉⑼옙占�
+	//210326 CJH - RAW 입력 Defect 수량 상한 사용여부
 	BOOL m_bRawCutoff;
 
 };
@@ -222,7 +225,7 @@
 	}
 	int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
 	int						m_nCellID;							//1. PANEL_ID
-	short					m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
+	short					m_nModelIdx;				// 몇 번째 모델인가?
 
 	char					m_strCellName[32];
 	int						m_rectCellLeft;
@@ -235,7 +238,7 @@
 	int						m_nJudgeGlade;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	//결함 갯수 관리 변수
 	int			m_nDefectNumSizeSmall;
 	int			m_nDefectNumSizeMid;
 	int			m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
 	char		m_strProImage[32];
 	char		m_strAvgGray_0[12];
 	char		m_strPortion_0[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_0[12];
 	char		m_strAvgAmp_0[12];
 	char		m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
 
 	char		m_strAvgGray_1[12];
 	char		m_strPortion_1[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_1[12];
 	char		m_strAvgAmp_1[12];
 	char		m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
 
 	char		m_strAvgGray_2[12];
 	char		m_strPortion_2[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_2[12];
 	char		m_strAvgAmp_2[12];
 	char		m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
 
 	char		m_strAvgGray_3[12];
 	char		m_strPortion_3[12];
-	//kyh Mura Data 占쌩곤옙 0622
+	//kyh Mura Data 추가 0622
 	char		m_strCorner_Gray_3[12];
 	char		m_strAvgAmp_3[12];
 	char		m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
 
 	int			m_nReflowResult[8];			// 0: Reflow X 1: Reflow OK 2: Reflow NG
 
-	// Filtering占쏙옙 Stack占쏙옙 占쏙옙
+	// Filtering된 Stack별 수
 	int			m_nDefectTDCount;
 	int			m_nDefectSDCount;
 	int			m_nDefectPDCount;
 	int			m_nDefectSPCount;
 
-	// Gate/Data 占쏙옙 占쏙옙占쏙옙
+	// Gate/Data 총 갯수
 	int			m_nGateNum;
 	int			m_nDataNum;
 
-	// 210129 CJH - Cell Origin 占쏙옙占쏙옙
+	// 210129 CJH - Cell Origin 방향
 	int			m_nCellXDir;
 	int			m_nCellYDir;
 };
@@ -331,10 +334,10 @@
 	}
 
 	//////////////////////////////////////////////////////////////////////////
-	//占쏙옙占썩서 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
+	//여기서 부터 리뷰 영역 [김태현 2019/1/19]
 	ditRaw::ReviewPlanType			m_nPlanType	;	
 	int			m_nResultCode;  //0:None, 1:Success
-	int			m_nShotIndex; //占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/12/5]
+	int			m_nShotIndex; //리뷰 찍은 순번 [김태현 2018/12/5]
 	int			m_nModuleIndex;
 	int			m_nMagnificIndex;
 	float		m_fManification;
@@ -343,15 +346,15 @@
 	char		m_strRevImagePath[256];
 
 	//////////////////////////////////////////////////////////////////////////
-	// Measure 占쏙옙占쏙옙
+	// Measure 영역
 	int			m_nMeasure_Index;
 	int			m_nMeasure_ResultCode; //0:None, 1:Success
 	float		m_fMesure_ResultData[8];	// 0:Type, 1:ShiftX, 2:ShiftY
 
 	//////////////////////////////////////////////////////////////////////////
-	// WSI占쏙옙占쏙옙
+	// WSI영역
 	int			m_nWsi_ResultCode; //0:None, 1:Success
-	int			m_nWsi_Type;									// 占쌉몌옙 / 占쏙옙占쏙옙
+	int			m_nWsi_Type;									// 함몰 / 돌기
 	float		m_fWsi_ResultData[8];			// 0:Type, 1:Height(um), 2:Width
 	char		m_strWsi_2DImageFilename[256];
 	char		m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
 	int			m_nWsi_pReflowResultData[8];
 	double		m_dWsi_DamDistance;
 
-	double		m_dWsiMmMotorX;								// WSI 占쏙옙占쏙옙 占쏙옙표 20180223 HJH
+	double		m_dWsiMmMotorX;								// WSI 모터 좌표 20180223 HJH
 	double		m_dWsiMmMotorY;
-	float		m_fWsiManification;							// WSI 占쏙옙占쏙옙
+	float		m_fWsiManification;							// WSI 배율
 
 	//////////////////////////////////////////////////////////////////////////
-	// Reflow 占쏙옙占쏙옙	
+	// Reflow 영역	
 	int			m_nReflow_Index;
-	int			m_nReflow_ResultCode; //0:None, // 占쏙옙占쏙옙占쏙옙 Line占쏙옙 占쏙옙占쏙옙. 3 占싱몌옙 : DAM2 Reflow 占쏙옙占쏙옙, 4~5 : DAM1 Reflow 占쏙옙占쏙옙, 6 : no Reflow 占쏙옙占쏙옙 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
+	int			m_nReflow_ResultCode; //0:None, // 검출한 Line의 개수. 3 미만 : DAM2 Reflow 판정, 4~5 : DAM1 Reflow 판정, 6 : no Reflow 판정 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
 	float		m_fReflow_LinePosData[8];	
 	int			m_nReflow_Side;
 	int			m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
 	short			m_nDefectID;
 	short			m_nCameraID;
 	short			m_nScanIdx;
-	//short			m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙
-	int				m_nDefectIdx;				// 카占쌨라에쇽옙占쏙옙 占쏙옙占쏙옙 占싸듸옙占쏙옙 201207 CJH - 占쌘몌옙 占쏙옙 占쏙옙침. int占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
+	//short			m_nDefectIdx;				// 카메라에서의 결함 인덱스
+	int				m_nDefectIdx;				// 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경
 
-	int				m_nPixelConv;				// pixel 占쏙옙占쏙옙 占쏙옙표
-	int				m_nPixelScan;				// pixel 占쏙옙占쏙옙 占쏙옙표
+	int				m_nPixelConv;				// pixel 단위 좌표
+	int				m_nPixelScan;				// pixel 단위 좌표
 
-	short							m_nPixelSize;				// 占쏙옙占쏙옙크占쏙옙		---------------------------------PS
-	short/*SERVER_DefectType*/		m_DefectType;				// 占쏙옙占쏙옙 타占쏙옙	---------------------------------DT
-	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙.
-	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 占쏙옙占쏙옙 타占쏙옙 - Bright, Dark, Both
+	short							m_nPixelSize;				// 결함크기		---------------------------------PS
+	short/*SERVER_DefectType*/		m_DefectType;				// 결함 타입	---------------------------------DT
+	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 결함의 판정상태.
+	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 결함 타입 - Bright, Dark, Both
 
-	short			m_sPixelWidth;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占십븝옙
-	short			m_sPixelHeight;				// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
-	short			m_nLevelSrcMin;				// 占쏙옙占쏙옙 占쏙옙占� Min	-----------------------------SN
-	short			m_nLevelSrcMax;				// 占쏙옙占쏙옙 占쏙옙占� Max	-----------------------------SX
-	short			m_nLevelSrcAvg;				// 占쏙옙占쏙옙 占쏙옙占� Avg	-----------------------------SA
-	short			m_nLevelRefMin;				// 占쏟교댐옙占� 占쏙옙占� Min	-------------------------RN
-	short			m_nLevelRefMax;				// 占쏟교댐옙占� 占쏙옙占� Max	-------------------------RX
-	short			m_nLevelRefAvg;				// 占쏟교댐옙占� 占쏙옙占� Avg	-------------------------RA
-	short			m_nLevelDiffMin;			// 占쏙옙占쏙옙 Min	---------------------------------DN
-	short			m_nLevelDiffMax;			// 占쏙옙占쏙옙 Max	---------------------------------DX
-	short			m_nLevelDiffAvg;			// 占쏙옙占쏙옙 Avg	---------------------------------DA
+	short			m_sPixelWidth;				// 픽셀단위 결함 너비
+	short			m_sPixelHeight;				// 픽셀단위 결함 높이
+	short			m_nLevelSrcMin;				// 결함 밝기 Min	-----------------------------SN
+	short			m_nLevelSrcMax;				// 결함 밝기 Max	-----------------------------SX
+	short			m_nLevelSrcAvg;				// 결함 밝기 Avg	-----------------------------SA
+	short			m_nLevelRefMin;				// 비교대상 밝기 Min	-------------------------RN
+	short			m_nLevelRefMax;				// 비교대상 밝기 Max	-------------------------RX
+	short			m_nLevelRefAvg;				// 비교대상 밝기 Avg	-------------------------RA
+	short			m_nLevelDiffMin;			// 비교차 Min	---------------------------------DN
+	short			m_nLevelDiffMax;			// 비교차 Max	---------------------------------DX
+	short			m_nLevelDiffAvg;			// 비교차 Avg	---------------------------------DA
 
-	int				m_nDefectRScale;			// 占싫쇽옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙	-------------------------RS
-	short			m_sThreshold;				// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold
-	short			m_sThresholdAvg;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 Threshold AVG
-	short			m_sDefectPeak;				// 占쏙옙占쏙옙占쏙옙 Peak.
-	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 占쏙옙청占쏙옙占쏙옙
+	int				m_nDefectRScale;			// 픽셀단위 결함 높이	-------------------------RS
+	short			m_sThreshold;				// 결함을 검출할 때의 Threshold
+	short			m_sThresholdAvg;			// 결함을 검출할 때의 Threshold AVG
+	short			m_sDefectPeak;				// 결함의 Peak.
+	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 요청사항
 
-	int				m_nPixelGlassStart;			// Glass 占쏙옙占쏙옙 占싫쇽옙
+	int				m_nPixelGlassStart;			// Glass 시작 픽셀
 	short			m_sDefectLoc;
 
 	short			m_sZoneClassPixelCount[16];
-	short			m_sZonePixelCount[16];	// Zone占쏙옙 占쏙옙占쏙옙 Pixel 占쏙옙
-	short			m_sZoneValueMin[16];	// Zone占쏙옙 占쏙옙占쏙옙 Min
-	short			m_sZoneValueMax[16];	// Zone占쏙옙 占쏙옙占쏙옙 Max
-	short			m_sZoneValueAvg[16];	// Zone占쏙옙 占쏙옙占쏙옙 Avg
+	short			m_sZonePixelCount[16];	// Zone별 결함 Pixel 수
+	short			m_sZoneValueMin[16];	// Zone별 결함 Min
+	short			m_sZoneValueMax[16];	// Zone별 결함 Max
+	short			m_sZoneValueAvg[16];	// Zone별 결함 Avg
 	short			m_sZonePixelPercent[16];	// --------------------------------------Z0~ZF
 
-	//210127 CJH - Zone占쏙옙 Source Gray 占쌉뤄옙
-	short			m_sZoneValueSrcMin[16];	// Zone占쏙옙 Source Min
-	short			m_sZoneValueSrcMax[16];	// Zone占쏙옙 Source Max
-	short			m_sZoneValueSrcAvg[16]; // Zone占쏙옙 Source Avg
+	//210127 CJH - Zone별 Source Gray 입력
+	short			m_sZoneValueSrcMin[16];	// Zone별 Source Min
+	short			m_sZoneValueSrcMax[16];	// Zone별 Source Max
+	short			m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
 
-	int				m_nUMOriginX;				// um占쏙옙占쏙옙 x占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMOriginY;				// um占쏙옙占쏙옙 y占쏙옙표 (占쏙옙占쏙옙占쏙옙占쏙옙)
-	int				m_nUMCenterAlignX;			// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterAlignY;			// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterX;				// um占쏙옙占쏙옙 X占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMCenterY;				// um占쏙옙占쏙옙 Y占쏙옙표 (Glass Center 占쏙옙占쏙옙, 占쏙옙占쏙옙觀占쏙옙占� 占쏙옙)
-	int				m_nUMSizeX;					// um占쏙옙占쏙옙 X 크占쏙옙	-----------------------------UX
-	int				m_nUMSizeY;					// um占쏙옙占쏙옙 Y 크占쏙옙	-----------------------------UY
-	int				m_nUMSize;					// um占쏙옙占쏙옙 크占쏙옙.
-	CRect			m_RectUM;					// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占썹각占쏙옙.
+	int				m_nUMOriginX;				// um단위 x좌표 (원점기준)
+	int				m_nUMOriginY;				// um단위 y조표 (원점기준)
+	int				m_nUMCenterAlignX;			// um단위 X좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterAlignY;			// um단위 Y좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterX;				// um단위 X좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMCenterY;				// um단위 Y좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMSizeX;					// um단위 X 크기	-----------------------------UX
+	int				m_nUMSizeY;					// um단위 Y 크기	-----------------------------UY
+	int				m_nUMSize;					// um단위 크기.
+	CRect			m_RectUM;					// 디펙 센터 기준 사각형.
 
-	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 占쏙옙占쏙옙 크占쏙옙 占쏙옙占쏙옙enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
-	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak占쏙옙 占쏙옙占쏙옙.
-	short/*Judgement*/				m_DefectJudgement;			// 占쏙옙占쏙옙 占쏙옙占쏙옙.
-	BOOL					m_bDefectCutoff;			// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙(TRUE= Cutoff, FALSE)
-	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16占쏙옙占� 占쏙옙占쏙옙
-	int				m_nPadRegionIdx;			// PAD 占쏙옙占쏙옙 占싸듸옙占쏙옙
+	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 결함 크기 종류enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
+	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak의 종류.
+	short/*Judgement*/				m_DefectJudgement;			// 결함 판정.
+	BOOL					m_bDefectCutoff;			// 컷 오프 디펙(TRUE= Cutoff, FALSE)
+	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16등분 구분
+	int				m_nPadRegionIdx;			// PAD 영역 인덱스
 
-	int				m_nUMCellX;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 x 占쏙옙표
-	int				m_nUMCellY;					// 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 y 占쏙옙표
-	short			m_nModelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占싸곤옙?
-	short			m_nCellIdx;					// 占쏙옙占승� 占쏙옙占싸곤옙?
-	short			m_nCellGate;				// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellData;				// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellGateAlign;			// 占쏙옙占쏙옙 Gate占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
-	short			m_nCellDataAlign;			// 占쏙옙占쏙옙 Data占쏙옙占쏙옙(占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙)
+	int				m_nUMCellX;					// 셀 원점 기준 x 좌표
+	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
+	short			m_nModelIdx;				// 몇 번째 모델인가?
+	short			m_nCellIdx;					// 몇번째 셀인가?
+	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
+	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
+	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
+	short			m_nCellDataAlign;			// 셀별 Data라인(얼라인 보정 후)
 
-	int				m_nUMShotX;					// 占쏙옙 占쏙옙占쏙옙 X占쏙옙표
-	int				m_nUMShotY;					// 占쏙옙 占쏙옙占쏙옙 Y占쏙옙표
-	short			m_nMaskDefectIdx;			// 占쏙옙 Glass占쏙옙占쏙옙 占쌩견듸옙 占쏙옙占쏙옙크占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占싸듸옙占쏙옙.
-	short			m_nShotIdx;					// 占쎈광占쏙옙 占쏙옙호
-	short			m_nMatchShotCount;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙占쏙옙占쏙옙 占쏙옙.
-	short			m_nMatchMaxSize;			// 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙크 占쏙옙 占쏙옙占쏙옙 큰 占쏙옙占쏙옙占쏙옙 크占쏙옙.
+	int				m_nUMShotX;					// 샷 기준 X좌표
+	int				m_nUMShotY;					// 샷 기준 Y좌표
+	short			m_nMaskDefectIdx;			// 한 Glass에서 발견된 마스크결함 묶음의 인덱스.
+	short			m_nShotIdx;					// 노광샷 번호
+	short			m_nMatchShotCount;			// 동일한 마스크 결함의 수.
+	short			m_nMatchMaxSize;			// 동일한 마스크 중 가장 큰 결함의 크기.
 
-	short			m_nRepeatCount;				// 占쏙옙占쌈곤옙占쌉발곤옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙표 占쌥븝옙占쏙옙
+	short			m_nRepeatCount;				// 연속결함발견위한 동일좌표 반복수
 	short			m_nMaskRepeatCount;
 	int				m_StackInfo;				// Stack Flag
-	BOOL			m_bRealStack;				// Stack 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 TD(TRUE) 占쏙옙占쏙옙, 占쏙옙占싶몌옙占쏙옙 占쏙옙占쏙옙 TD(FALSE)占쏙옙占쏙옙占쏙옙 占쏙옙 占쌍댐옙.
-	short			m_nStackStepCount;			// Stack 占쏙옙
-	short			m_nStackColorIdx;			// Color占쏙옙 占쏙옙占쏙옙占싹댐옙 占싸듸옙占쏙옙.
+	BOOL			m_bRealStack;				// Stack 머지에 의한 TD(TRUE) 인지, 필터링에 의한 TD(FALSE)구분할 수 있다.
+	short			m_nStackStepCount;			// Stack 수
+	short			m_nStackColorIdx;			// Color를 선택하는 인덱스.
 	//CString			m_strStackStep[CFDEFECT_STACKCOUNT];			// Stack Step.
-	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 占쌍댐옙 占쏙옙占쏙옙占쏙옙 60bytes
-	char			m_strUnitID[16];				// 占쏙옙占쌍억옙占싱듸옙
+	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 최대 사이즈 60bytes
+	char			m_strUnitID[16];				// 유닛아이디
 
-	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI占쏙옙 TFE占쏙옙 占쌩곤옙 占싻뤄옙  占싯곤옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占�.
-	int				m_nAtomWidth;				// TFE 占쏙옙 占십븝옙
-	int				m_nAtomHeight;				// TFE 占쏙옙 占쏙옙占쏙옙
-	short/*ReKind*/			m_DefectKind;				// 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
+	int				m_nAtomWidth;				// TFE 핵 너비
+	int				m_nAtomHeight;				// TFE 핵 높이
+	short/*ReKind*/			m_DefectKind;				// 결함 종류
 
 	char			m_strDefectCode[32];			// Defect Code
 	BOOL			m_bMergeState;				// Merge Status
 	char			m_strAoiImageName[256];			// Defect Image Name(CCD Image)
-	int				m_nDefectMerge;		// 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
+	int				m_nDefectMerge;		// 현재 디펙의 머지 여부
 
 
 	int				m_nPixelSizeOrigin;
 	int				m_nScratchRatio;
-	int				m_nDensity;			// 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占싻듸옙 [2017.8.2 bhs]
+	int				m_nDensity;			// 원형 결함 구분을 위한 밀도 [2017.8.2 bhs]
 
 	char			m_strDefectName[16];
 	char			m_strDefectType[16];
@@ -491,16 +494,16 @@
 	double			m_dScanResolution;
 	double			m_dConvResolution;
 
-	int				m_nAngle;					// 占쏙옙占쏙옙
-	int				m_nMajor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Long)
-	int				m_nMinor;					// 占쏙옙占쏙옙 占쏙옙占쏙옙(Short)
-	int				m_nCompact;					// Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙 占싹댐옙 占쏙옙占쏙옙 占쏙옙占싱울옙 Blob 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
-	int				m_nThickness;				// Blob 占쏙옙占싱울옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 (Area / Major)
+	int				m_nAngle;					// 각도
+	int				m_nMajor;					// 장축 길이(Long)
+	int				m_nMinor;					// 단축 길이(Short)
+	int				m_nCompact;					// Blob 장축을 지름으로 하는 원의 넓이와 Blob 넓이의 비율
+	int				m_nThickness;				// Blob 넓이와 장축의 비율 (Area / Major)
 	
-	short			m_nHliLevelIdx;				// 占쏙옙 占쏙옙째 占쏙옙占쏙옙(채占쏙옙)占싸곤옙?
-	int				m_nHliLayers;				// 占쌔댐옙占쏙옙篤占� 占쏙옙占쌉듸옙 占쏙옙占싱억옙 bit처占쏙옙
+	short			m_nHliLevelIdx;				// 몇 번째 레벨(채널)인가?
+	int				m_nHliLayers;				// 해당결함에 포함된 레이어 bit처리
 
-	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 占쏙옙占쏙옙 占쌩곤옙
+	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 정보 추가
 
 	char			m_strAoiImagePath[255];
 	char			m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
 	int				m_nAlignRectRight;
 
 
-	//占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/1/19]
 	_grmDefectReviewData m_ReviewDefect;
 };
 
@@ -556,32 +558,35 @@
 
 struct _grmDitMemInfo
 {
-	//占쏙옙占쏙옙 占쌨몌옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//공유 메모리 생성할 공간 결정 [김태현 2018/11/12]
 	size_t m_nGlassRawDataSize;
 	int m_nGlassMaxDataNum;
 	int m_nBlockMaxDataNum;
 	int m_nCellMaxDataNum;
 	int m_nDefectMaxDataNum;
 	int m_nStackMaxDataNum;
+	int m_nRawMergeMaxDataNum;
 
-	//Char 占쏙옙占쏙옙 占쌘료가 占쌍댐옙 占쏙옙占쏙옙 占쏙옙치 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12]
 	int m_nGlassDataPoint;
 	int m_nBlockDataPoint;
 	int m_nCellDataPoint;
 	int m_nDefectDataPoint;
 	int m_nStackDataPoint;
+	int m_nRawMergeDataPoint;
 
 	int m_nSizeOfGlassData;
 	int m_nSizeOfBlockData;
 	int m_nSizeOfCellData;
 	int m_nSizeOfDefectData;
 	int m_nSizeOfStackData;
+	int m_nSizeOfRawMergeData;
 };
 struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
 {
 	size_t m_nGlassLoadingCount;
-	emAOIProcStep m_ClientProcStep; //AOI, Review占쏙옙 占쏙옙占쏙옙 占쏙옙占�
-	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)占쏙옙 처占쏙옙 占싹뤄옙 占쏙옙 占쏙옙占�
+	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
+	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
 };
 
 class CgrmGlassRawData
@@ -668,7 +673,7 @@
 	{
 		if(pInfo == NULL || pData == NULL) return FALSE;
 
-		if(1) //new type //占쌨몌옙 占쏙옙 占쏙옙占쏙옙 크占썩에 占쏙옙占쏙옙占쏙옙占� 
+		if(1) //new type //메모리 총 공간 크기에 상관없이 
 		{
 			//if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
 
diff --git a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp
index 8fcb808..5d47ee1 100644
--- a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp
+++ b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp
@@ -70,8 +70,8 @@
 			m_pDlgWsi->DisableBtSIMULATION(FALSE);
 		    break;
 		case 7:
-			m_pDlgWsi->UpdateWSIResult(0, 0, 0, 0, 0);
-			m_pDlgWsi->UpdateWSIResult(1, 0, 0, 0, 0);
+			//m_pDlgWsi->UpdateWSIResult(0, 0, 0, 0, 0);
+			//m_pDlgWsi->UpdateWSIResult(1, 0, 0, 0, 0);
 
 		default:
 			break;
diff --git a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp
index 4c08810..2940785 100644
--- a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp
+++ b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp
@@ -32,26 +32,24 @@
 	DDX_Control(pDX, IDC_EDIT_WSI_RTB_01, m_ctrlWsiRtb01);
 	DDX_Control(pDX, IDC_BUTTON_SIMULATION, m_btSimulation);
 	DDX_Text(pDX, IDC_EDIT_WSI_FIRST_STANDARD, m_editWSIFirstStandard);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT1, m_editWSIHeight1);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT2, m_editWSIHeight2);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT3, m_editWSIHeight3);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT4, m_editWSIHeight4);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT5, m_editWSIHeight5);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT6, m_editWSIHeight6);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT7, m_editWSIHeight7);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT8, m_editWSIHeight8);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT9, m_editWSIHeight9);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT10, m_editWSIHeight10);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT11, m_editWSIHeight11);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT12, m_editWSIHeight12);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT13, m_editWSIHeight13);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT14, m_editWSIHeight14);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT15, m_editWSIHeight15);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT16, m_editWSIHeight16);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT17, m_editWSIHeight17);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT18, m_editWSIHeight18);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT19, m_editWSIHeight19);
-	DDX_Control(pDX, IDC_EDIT_WSI_HEIGHT20, m_editWSIHeight20);
+	DDX_Control(pDX, IDC_LIST_WSI_DIAGNOSIS_RESULT, m_ListWSIResult);
+}
+
+BOOL CDlgSelfDiagnosis_Wsi::OnInitDialog()
+{
+	CDialogEx::OnInitDialog();
+
+	m_ListWSIResult.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
+	m_ListWSIResult.InsertColumn(0, _T("Index"), LVCFMT_CENTER, 70);
+	m_ListWSIResult.InsertColumn(1, _T("Left Module"), LVCFMT_CENTER, 100);
+	m_ListWSIResult.InsertColumn(2, _T("Right Module"), LVCFMT_CENTER, 100);
+
+	m_ListWSIResult.SetRedraw(TRUE);
+
+	// TODO:  �뿬湲곗뿉 異붽� 珥덇린�솕 �옉�뾽�쓣 異붽��빀�땲�떎.
+
+	return TRUE;  // return TRUE unless you set the focus to a control
+				  // �삁�쇅: OCX �냽�꽦 �럹�씠吏��뒗 FALSE瑜� 諛섑솚�빐�빞 �빀�땲�떎.
 }
 
 
@@ -67,6 +65,7 @@
 
 void CDlgSelfDiagnosis_Wsi::OnBnClickedButtonSimulation()
 {
+
 	if (m_pDiagnosisManager == NULL) return;
 
 	//#3514_LYW_CF AOI Review �옄媛�吏꾨떒 湲곕뒫 媛쒖꽑_START
@@ -135,65 +134,21 @@
 	m_ctrlWsiRtb00.SetWindowTextA(strRTB00);
 	m_ctrlWsiRtb01.SetWindowTextA(strRTB01);
 
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[0]);
-	m_editWSIHeight1.SetWindowTextA(strDiagnosisHeight);
+	for (int i = 0; i < 10; i++)
+	{
+		int nRow = i + 1;
 
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[1]);
-	m_editWSIHeight2.SetWindowTextA(strDiagnosisHeight);
+		strDiagnosisHeight.Format(_T("%d"), nRow);
+		m_ListWSIResult.InsertItem(nRow, strDiagnosisHeight);
 
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[2]);
-	m_editWSIHeight3.SetWindowTextA(strDiagnosisHeight);
+		strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[i]);
+		m_ListWSIResult.SetItemText(nRow, 1, strDiagnosisHeight);
 
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[3]);
-	m_editWSIHeight4.SetWindowTextA(strDiagnosisHeight);
+		strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[i+10]);
+		m_ListWSIResult.SetItemText(nRow, 2, strDiagnosisHeight);
 
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[4]);
-	m_editWSIHeight5.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[5]);
-	m_editWSIHeight6.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[6]);
-	m_editWSIHeight7.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[7]);
-	m_editWSIHeight8.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[8]);
-	m_editWSIHeight9.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[9]);
-	m_editWSIHeight10.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[10]);
-	m_editWSIHeight11.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[11]);
-	m_editWSIHeight12.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[12]);
-	m_editWSIHeight13.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[13]);
-	m_editWSIHeight14.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[14]);
-	m_editWSIHeight15.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[15]);
-	m_editWSIHeight16.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[16]);
-	m_editWSIHeight17.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[17]);
-	m_editWSIHeight18.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[18]);
-	m_editWSIHeight19.SetWindowTextA(strDiagnosisHeight);
-
-	strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[19]);
-	m_editWSIHeight20.SetWindowTextA(strDiagnosisHeight);
+		m_ListWSIResult.EnsureVisible(nRow, FALSE);
+	}
 	
 }
 
@@ -226,6 +181,7 @@
 	double nRTB00 = dRbt00;
 	double nRTB01 = dRbt01;
 
+	CString strDiagnosisHeight;
 	CString strACC00, strACC01;
 	CString strRTB00, strRTB01;
 	strACC00.Format(_T("%f"),nACC00);
@@ -242,6 +198,36 @@
 		m_ctrlWsiRtb01.SetWindowTextA(strRTB01);
 	}
 
+	double dDiagnosisHeightleft[10];
+	double dDiagnosisHeightRight[10];
+
+	for (int i = 0; i < 10; i++)
+	{
+		dDiagnosisHeightleft[i] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->GetDiagnosisHeight(i);
+	}
+
+	for (int i = 0; i < 10; i++)
+	{
+		dDiagnosisHeightRight[i] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->GetDiagnosisHeight(i);
+	}
+
+	m_ListWSIResult.DeleteAllItems();
+
+	for (int i = 0; i < 10; i++)
+	{
+			int nRow = i;
+
+			strDiagnosisHeight.Format(_T("%d"), nRow + 1);
+			m_ListWSIResult.InsertItem(nRow, strDiagnosisHeight);
+
+			strDiagnosisHeight.Format(_T("%.3f"), dDiagnosisHeightleft[i]);
+			m_ListWSIResult.SetItemText(nRow, 1, strDiagnosisHeight);
+
+			strDiagnosisHeight.Format(_T("%.3f"), dDiagnosisHeightRight[i]);
+			m_ListWSIResult.SetItemText(nRow, 2, strDiagnosisHeight);
+
+			m_ListWSIResult.EnsureVisible(nRow, FALSE);
+	}
 
 }
 
@@ -270,3 +256,4 @@
 
 	// TODO:  �뿬湲곗뿉 而⑦듃濡� �븣由� 泥섎━湲� 肄붾뱶瑜� 異붽��빀�땲�떎.
 }
+
diff --git a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h
index 22a364e..36e9023 100644
--- a/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h
+++ b/ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h
@@ -18,6 +18,9 @@
 
 protected:
 	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 吏��썝�엯�땲�떎.
+	virtual BOOL OnInitDialog();
+
+	CListCtrl m_ListWSIResult;
 
 	DECLARE_MESSAGE_MAP()
 public:
@@ -35,24 +38,5 @@
 	CEdit m_ctrlWsiRtb01;
 	CButton m_btSimulation;
 	double m_editWSIFirstStandard;
-	CEdit m_editWSIHeight1;
-	CEdit m_editWSIHeight2;
-	CEdit m_editWSIHeight3;
-	CEdit m_editWSIHeight4;
-	CEdit m_editWSIHeight5;
-	CEdit m_editWSIHeight6;
-	CEdit m_editWSIHeight7;
-	CEdit m_editWSIHeight8;
-	CEdit m_editWSIHeight9;
-	CEdit m_editWSIHeight10;
-	CEdit m_editWSIHeight11;
-	CEdit m_editWSIHeight12;
-	CEdit m_editWSIHeight13;
-	CEdit m_editWSIHeight14;
-	CEdit m_editWSIHeight15;
-	CEdit m_editWSIHeight16;
-	CEdit m_editWSIHeight17;
-	CEdit m_editWSIHeight18;
-	CEdit m_editWSIHeight19;
-	CEdit m_editWSIHeight20;
+	
 };
diff --git a/ReviewSystem/ReviewSystem/ReviewInterface.cpp b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
index 313cec6..6b2beb7 100644
--- a/ReviewSystem/ReviewSystem/ReviewInterface.cpp
+++ b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -124,6 +124,9 @@
 	m_bIsOffSetOn = 0;
 	m_bIsSimulation = 0;
 
+	m_bFirstReviewLeft = 0;
+	m_bFirstReviewRight = 0;
+
 	// cs init
 	InitializeCriticalSection(&m_csReviewResult);
 	InitializeCriticalSection(&m_csReviewSignal);
@@ -3379,6 +3382,26 @@
 	return m_pEdgeRecipeManager;
 }
 
+BOOL CReviewInterface::IRP2P_GetFirstReviewLeft()
+{
+	return m_bFirstReviewLeft;
+}
+
+BOOL CReviewInterface::IRP2P_GetFirstReviewRight()
+{
+	return m_bFirstReviewRight;
+}
+
+void CReviewInterface::IRP2P_SetFirstReviewLeft(BOOL b_Check)
+{
+	m_bFirstReviewLeft = b_Check;
+}
+
+void CReviewInterface::IRP2P_SetFirstReviewRight(BOOL b_Check)
+{
+	m_bFirstReviewRight = b_Check;
+}
+
 
 int CReviewInterface::PS2P_GetModuleStatusCount(int nModuleType)
 {
@@ -3798,12 +3821,15 @@
 	if (m_SequenceProcessor == NULL) return;
 	m_SequenceProcessor->SetWsiType(9);
 
-	if (!m_SequenceProcessor->WSIAllReadySignal(1))
+	if (nModuleIdx == 0)
 	{
-		g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
+		if (!m_SequenceProcessor->WSIAllReadySignal(1))
+		{
+			g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
+			return;
+		}
 	}
-	else
-	{
+
 		SetCurrentWsiMode(WsiMeasureType_VLSI);
 
 		CWsiControl* pWsiControl = ISP2P_GetWSIControl(nModuleIdx);
@@ -3817,7 +3843,6 @@
 
 		pWsiControl->SetWsiStart(1, vectorPosX, vectorPosY, 0);
 
-	}
 }
 
 void CReviewInterface::IDP2P_WsiMotorMotionEnd(int nModuleIdx, double dPosX, double dPosY)
@@ -8379,6 +8404,26 @@
 	return m_pDlgHistoryTool;
 }
 
+BOOL CReviewInterface::ISP2P_GetFirstReviewLeft()
+{
+	return m_bFirstReviewLeft;
+}
+
+BOOL CReviewInterface::ISP2P_GetFirstReviewRight()
+{
+	return m_bFirstReviewRight;
+}
+
+void CReviewInterface::ISP2P_SetFirstReviewLeft(BOOL b_Check)
+{
+	m_bFirstReviewLeft = b_Check;
+}
+
+void CReviewInterface::ISP2P_SetFirstReviewRight(BOOL b_Check)
+{
+	m_bFirstReviewRight = b_Check;
+}
+
 void CReviewInterface::ILCC2P_DisplayMessage( int nIndex, const TCHAR* lpstrFormat, ... )
 {
 
diff --git a/ReviewSystem/ReviewSystem/ReviewInterface.h b/ReviewSystem/ReviewSystem/ReviewInterface.h
index 0d9175a..8f2d7ce 100644
--- a/ReviewSystem/ReviewSystem/ReviewInterface.h
+++ b/ReviewSystem/ReviewSystem/ReviewInterface.h
@@ -256,6 +256,13 @@
 	virtual void						IRP2P_CompletePlanIndex(int nReviewStatus, int nPlanIndex);
 	virtual void						IRP2P_UpdateReviewProcessStatus(int nReviewStatus, int nPlanIndex=0);
 	virtual CRecipeManager*				IRP2P_GetEdgeRecipeManager();
+	virtual BOOL						IRP2P_GetFirstReviewLeft();
+	virtual BOOL						IRP2P_GetFirstReviewRight();
+	virtual void						IRP2P_SetFirstReviewLeft(BOOL b_Check);
+	virtual void						IRP2P_SetFirstReviewRight(BOOL b_Check);
+
+	BOOL	m_bFirstReviewLeft;
+	BOOL	m_bFirstReviewRight;
 
 	virtual BOOL						IRP2P_SaveDefectMap(const CString& strPath);
 
@@ -398,6 +405,12 @@
 	virtual CDlgSelfDiagnosis*			ISP2P_GetDlgDiagnosis();
 
 	virtual CDlgReviewHistoryTool*		ISP2P_GetDlgHistory();
+
+	virtual BOOL						ISP2P_GetFirstReviewLeft();
+	virtual BOOL						ISP2P_GetFirstReviewRight();
+	virtual void						ISP2P_SetFirstReviewLeft(BOOL b_Check);
+	virtual void						ISP2P_SetFirstReviewRight(BOOL b_Check);
+
 public: 
 
 	virtual BOOL	ISP2P_Motor_CameraGo(int nModuleIndex, double dPosX, double dPosY, int nMoveAxis, BOOL bAutoSelectCamera=FALSE, BOOL bGoEnd=FALSE);
diff --git a/ReviewSystem/ReviewSystem/ReviewProcessor.h b/ReviewSystem/ReviewSystem/ReviewProcessor.h
index dbfb2ff..4de61ac 100644
--- a/ReviewSystem/ReviewSystem/ReviewProcessor.h
+++ b/ReviewSystem/ReviewSystem/ReviewProcessor.h
@@ -76,6 +76,12 @@
 
 	virtual void					IRP2P_UpdateWSISelfDiagnosisResult();
 
+	virtual BOOL						IRP2P_GetFirstReviewLeft() = 0;
+	virtual BOOL						IRP2P_GetFirstReviewRight() = 0;
+
+	virtual void						IRP2P_SetFirstReviewLeft(BOOL b_Check) = 0;
+	virtual void						IRP2P_SetFirstReviewRight(BOOL b_Check) = 0;
+
 };
 
 typedef std::vector<CPoint>					VectorPoint;
diff --git a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp
index 06fae9b..30d317a 100644
--- a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp
@@ -1278,19 +1278,17 @@
 			  }
 		  }
 
-		  if (pReviewResult->nModuleIdx == 0)
+		  if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
 		  {
 			  m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
-			  /* double dAverageGray = 0.0;
-			   if (CCHImageProcess::ImageAverage(pImageData, dAverageGray) == 1)
-			   {
-				   m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dAverageGray;
-			   }*/
-	  }
-		  else
+			  m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
+			  m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
+		  }
+		  else if(pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
 		  {
 			  m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
-			 
+			  m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
+			  m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
 		  }
 	  }
 	}
@@ -1311,13 +1309,16 @@
 			dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
 		}
 
-		if (pReviewResult->nModuleIdx == 0)
+		if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
 		{
 			m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
+			m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
 		}
-		else
+		else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
 		{
 			m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
+			m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
+
 		}
 	}
 	
@@ -1424,9 +1425,23 @@
 			if (imageConvert.GetImageExist())
 			{
 				dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
+
+				if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
+				{
+					m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
+					m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
+					m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
+				}
+				else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
+				{
+					m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
+					m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
+					m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
+
+				}
+
 			}
 		
-			
 			// count defocus
 			CGlassResult* pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
 			if (pGlassResult)
diff --git a/ReviewSystem/ReviewSystem/ReviewSystem.rc b/ReviewSystem/ReviewSystem/ReviewSystem.rc
index 0a9c0ae..a565daf 100644
--- a/ReviewSystem/ReviewSystem/ReviewSystem.rc
+++ b/ReviewSystem/ReviewSystem/ReviewSystem.rc
@@ -687,69 +687,8 @@
     EDITTEXT        IDC_EDIT_WSI_RTB_01,123,94,40,14,ES_AUTOHSCROLL
     LTEXT           "WSI Standard (um)",IDC_STATIC,32,113,65,10
     EDITTEXT        IDC_EDIT_WSI_FIRST_STANDARD,97,112,40,15,ES_AUTOHSCROLL
-    LTEXT           "um",IDC_STATIC,267,33,19,12
-    LTEXT           "WSI Height 1",IDC_STATIC,179,34,43,8
-    LTEXT           "WSI Height 2",IDC_STATIC,179,48,43,8
-    LTEXT           "WSI Height 3",IDC_STATIC,179,62,43,8
-    LTEXT           "WSI Height 4",IDC_STATIC,179,76,43,8
-    LTEXT           "WSI Height 5",IDC_STATIC,179,90,43,8
-    LTEXT           "WSI Height 6",IDC_STATIC,179,104,43,8
-    LTEXT           "WSI Height 7",IDC_STATIC,179,117,43,8
-    LTEXT           "WSI Height 8",IDC_STATIC,179,132,43,8
-    LTEXT           "WSI Height 9",IDC_STATIC,179,145,43,8
-    LTEXT           "WSI Height 10",IDC_STATIC,179,158,47,8
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT1,227,33,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT2,227,47,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT3,227,61,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT4,226,75,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT5,226,89,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT6,226,103,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT7,226,117,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT8,226,131,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT9,226,145,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT10,226,158,39,12,ES_AUTOHSCROLL
-    LTEXT           "um",IDC_STATIC,148,121,19,12
-    LTEXT           "um",IDC_STATIC,267,47,19,12
-    LTEXT           "um",IDC_STATIC,267,61,19,12
-    LTEXT           "um",IDC_STATIC,267,75,19,12
-    LTEXT           "um",IDC_STATIC,267,89,19,12
-    LTEXT           "um",IDC_STATIC,267,103,19,12
-    LTEXT           "um",IDC_STATIC,267,117,19,12
-    LTEXT           "um",IDC_STATIC,267,131,19,12
-    LTEXT           "um",IDC_STATIC,267,145,19,12
-    LTEXT           "um",IDC_STATIC,267,159,19,12
-    LTEXT           "um",IDC_STATIC,387,33,19,12
-    LTEXT           "WSI Height 1",IDC_STATIC,299,34,43,8
-    LTEXT           "WSI Height 2",IDC_STATIC,299,48,43,8
-    LTEXT           "WSI Height 3",IDC_STATIC,299,62,43,8
-    LTEXT           "WSI Height 4",IDC_STATIC,299,76,43,8
-    LTEXT           "WSI Height 5",IDC_STATIC,299,90,43,8
-    LTEXT           "WSI Height 6",IDC_STATIC,299,104,43,8
-    LTEXT           "WSI Height 7",IDC_STATIC,299,117,43,8
-    LTEXT           "WSI Height 8",IDC_STATIC,299,132,43,8
-    LTEXT           "WSI Height 9",IDC_STATIC,299,145,43,8
-    LTEXT           "WSI Height 10",IDC_STATIC,299,158,47,8
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT11,347,33,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT12,347,47,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT13,347,61,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT14,346,75,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT15,346,89,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT16,346,103,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT17,346,117,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT18,346,131,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT19,346,145,39,12,ES_AUTOHSCROLL
-    EDITTEXT        IDC_EDIT_WSI_HEIGHT20,346,158,39,12,ES_AUTOHSCROLL
-    LTEXT           "um",IDC_STATIC,387,47,19,12
-    LTEXT           "um",IDC_STATIC,387,61,19,12
-    LTEXT           "um",IDC_STATIC,387,75,19,12
-    LTEXT           "um",IDC_STATIC,387,89,19,12
-    LTEXT           "um",IDC_STATIC,387,103,19,12
-    LTEXT           "um",IDC_STATIC,387,117,19,12
-    LTEXT           "um",IDC_STATIC,387,131,19,12
-    LTEXT           "um",IDC_STATIC,387,145,19,12
-    LTEXT           "um",IDC_STATIC,387,159,19,12
-    GROUPBOX        "Left",IDC_STATIC,176,24,105,154
-    GROUPBOX        "Right",IDC_STATIC,296,24,105,154
+    LTEXT           "um",IDC_STATIC,141,113,19,12
+    CONTROL         "",IDC_LIST_WSI_DIAGNOSIS_RESULT,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,182,30,162,187
 END
 
 IDD_DLG_SELF_DIAGNOSIS_SETTING DIALOGEX 0, 0, 435, 379
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
index 3f38f28..0a4610f 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
@@ -1882,9 +1882,11 @@
 		if(pWsiControl == NULL) continue ;
 
 		CRcpAFMRecipeInfo *pRcpWsiAFMInfo = pRsRcpReviewInfo->GetRcpWsiAFMRecipeInfo(nWsiControlIdx);
-		if(pRcpWsiAFMInfo == NULL) continue ;
+// 		if(pRcpWsiAFMInfo == NULL) continue ;
+// 
+// 		int nRealMagIndex = GetRealMagnification(nWsiControlIdx, pRcpWsiAFMInfo->m_nZoomIndex);
 
-		int nRealMagIndex = GetRealMagnification(nWsiControlIdx, pRcpWsiAFMInfo->m_nZoomIndex);
+		int nRealMagIndex = 0;
 	
 		//pWsiControl->SetWsiReady(*pGlassResult->GetJobID(),_T("LGDemo"),2, 0); //TEST0716 
 
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.h b/ReviewSystem/ReviewSystem/SequenceProcessor.h
index 3d8f40f..902ed1b 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor.h
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor.h
@@ -484,6 +484,13 @@
 	virtual CDlgSelfDiagnosis*			ISP2P_GetDlgDiagnosis() = 0;
 	virtual CDlgReviewHistoryTool*		ISP2P_GetDlgHistory() = 0;
 
+	virtual BOOL						ISP2P_GetFirstReviewLeft() = 0;
+	virtual BOOL						ISP2P_GetFirstReviewRight() = 0;
+	virtual void						ISP2P_SetFirstReviewLeft(BOOL b_Check) = 0;
+	virtual void						ISP2P_SetFirstReviewRight(BOOL b_Check) = 0;
+
+
+
 	virtual BOOL						GetOffSetValue(int nModule, int nCam, int nScan, double dGlassXPos, double &dXpos, double &dYpos) = 0;
 
 public:
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
index 4c7a1f9..c50b3f2 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -946,6 +946,9 @@
 	bFileFind = FALSE;
 
 	m_pSP2P->ISP2P_GetDiagnosisHistory();
+
+	m_pSP2P->ISP2P_SetFirstReviewLeft(TRUE);
+	m_pSP2P->ISP2P_SetFirstReviewRight(TRUE);
 	
 	if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
diff --git a/ReviewSystem/ReviewSystem/resource.h b/ReviewSystem/ReviewSystem/resource.h
index 0ae58b7..4309eef 100644
--- a/ReviewSystem/ReviewSystem/resource.h
+++ b/ReviewSystem/ReviewSystem/resource.h
@@ -430,6 +430,7 @@
 #define IDC_EDIT_WSI_HEIGHT11           1181
 #define IDC_EDIT_WSI_HEIGHT12           1182
 #define IDC_EDIT_WSI_HEIGHT13           1183
+#define IDC_LIST_WSI_DIAGNOSIS_RESULT   1184
 #define ID_INS_HOOK                     32772
 #define ID_UNINS_HOOK                   32773
 
@@ -439,7 +440,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        381
 #define _APS_NEXT_COMMAND_VALUE         32775
-#define _APS_NEXT_CONTROL_VALUE         1181
+#define _APS_NEXT_CONTROL_VALUE         1185
 #define _APS_NEXT_SYMED_VALUE           346
 #endif
 #endif
diff --git a/ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h b/ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h
index d2dac1a..7a21ff7 100644
--- a/ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h
+++ b/ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h
@@ -49,7 +49,7 @@
 	int ProcessFlatness();
 	int ProcessFlatness_Manual();
 	int ProcessSimulation();
-	int ProcessDiagnosisJudge();
+	int ProcessDiagnosisJudge(int nMode);
 
 	BOOL CalculateSquareness(int nIndex);
 protected:

--
Gitblit v1.9.3