- 알림톡 발송결과 탭 페이징 이어지도록 수정 - 리스트 쿼리 성능 개선
- 리스트 쿼리 성능 개선
@36290f8dd87c7f04a7beedb6d99fe787d5b91442
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
... | ... | @@ -126,8 +126,13 @@ |
| 126 | 126 |
} |
| 127 | 127 |
|
| 128 | 128 |
//발송 관리 문자발송 내용 상세보기 팝업[그룹] |
| 129 |
- public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
|
|
| 130 |
- return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
|
|
| 131 |
- } |
|
| 129 |
+ public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
|
|
| 130 |
+ return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
|
|
| 131 |
+ } |
|
| 132 |
+ |
|
| 133 |
+ @SuppressWarnings("unchecked")
|
|
| 134 |
+ public List<KakaoSentVO> selectAllKakaoSentListExcel_advc(KakaoSentVO kakaoSentVO) throws Exception{
|
|
| 135 |
+ return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentListExcel_advc",kakaoSentVO);
|
|
| 136 |
+ } |
|
| 132 | 137 |
|
| 133 | 138 |
} |
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
... | ... | @@ -302,9 +302,13 @@ |
| 302 | 302 |
result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount()); |
| 303 | 303 |
result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount()); |
| 304 | 304 |
|
| 305 |
+ result.setMsgGroupCnt( |
|
| 306 |
+ Integer.valueOf(result.getSuccessCount() + result.getWaitCount() + result.getFailCount()).toString() |
|
| 307 |
+ ); |
|
| 305 | 308 |
|
| 306 | 309 |
//완료상태 시작 |
| 307 | 310 |
result = this.codeProc(result); |
| 311 |
+ |
|
| 308 | 312 |
|
| 309 | 313 |
//완료상태 끝 |
| 310 | 314 |
//======================================================= |
... | ... | @@ -470,7 +474,7 @@ |
| 470 | 474 |
} |
| 471 | 475 |
|
| 472 | 476 |
//예약 관리 리스트 불러오기 |
| 473 |
- List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO); |
|
| 477 |
+ List<KakaoSentVO> resultList = kakaoSentDAO.selectAllKakaoSentListExcel_advc(kakaoSentVO); |
|
| 474 | 478 |
|
| 475 | 479 |
// long startTime = System.nanoTime(); // 시작 시간 측정 |
| 476 | 480 |
// resultAllSentList = makeDetailFunction(resultAllSentList); |
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
... | ... | @@ -1354,6 +1354,111 @@ |
| 1354 | 1354 |
|
| 1355 | 1355 |
<!-- 전체 발송결과 조회 (그룹별)--> |
| 1356 | 1356 |
<select id="KakaoSentDAO.selectAllKakaoSentList_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO"> |
| 1357 |
+ /* KakaoSentDAO.selectAllKakaoSentList_advc */ |
|
| 1358 |
+ |
|
| 1359 |
+ SELECT COUNT(B.USER_ID) OVER () AS totMsgCnt, |
|
| 1360 |
+ B.USER_ID AS userId, |
|
| 1361 |
+ B.MSG_GROUP_ID AS msgGroupId, |
|
| 1362 |
+ B.SMS_TXT AS smsTxt, |
|
| 1363 |
+ B.SUBJECT AS subject, |
|
| 1364 |
+ B.SUBJECT_CHK_YN AS subjectChkYn, |
|
| 1365 |
+ B.REGDATE AS regDate, |
|
| 1366 |
+ B.REQ_DATE AS reqDate, |
|
| 1367 |
+ CASE |
|
| 1368 |
+ WHEN B.DELAY_YN = 'Y' AND B.DELAY_COMPLETE_YN = 'N' |
|
| 1369 |
+ THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE) |
|
| 1370 |
+ ELSE B.REQ_DATE |
|
| 1371 |
+ END AS delayOrgTime, |
|
| 1372 |
+ B.CALL_FROM AS callFrom, |
|
| 1373 |
+ B.TOT_PRICE AS totPrice, |
|
| 1374 |
+ B.EACH_PRICE AS eachPrice, |
|
| 1375 |
+ B.MSG_TYPE AS msgType, |
|
| 1376 |
+ B.FILE_CNT AS fileCnt, |
|
| 1377 |
+ B.AGENT_CODE AS agentCode, |
|
| 1378 |
+ B.CANCELDATE AS canceldate, |
|
| 1379 |
+ B.DEL_FLAG AS delFlag, |
|
| 1380 |
+ B.SEND_KIND AS sendKind, |
|
| 1381 |
+ B.MSG_KIND AS msgKind, |
|
| 1382 |
+ B.DELAY_YN AS delayYn, |
|
| 1383 |
+ B.DELAY_COMPLETE_YN AS delayCompleteYn, |
|
| 1384 |
+ B.RESERVE_YN AS reserveYn, |
|
| 1385 |
+ B.RESERVE_C_YN AS reserveCYn, |
|
| 1386 |
+ TIMESTAMPDIFF( |
|
| 1387 |
+ MINUTE, |
|
| 1388 |
+ CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR), |
|
| 1389 |
+ DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i') |
|
| 1390 |
+ ) AS diffMin, |
|
| 1391 |
+ B.AT_DELAY_YN AS atDelayYn, |
|
| 1392 |
+ B.AT_DELAY_COMPLETE_YN AS atDelayCompleteYn, |
|
| 1393 |
+ A.MSG_NOTICETALK_SENDER_KEY AS msgNoticetalkSenderKey, |
|
| 1394 |
+ A.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn, |
|
| 1395 |
+ CASE |
|
| 1396 |
+ WHEN B.AT_DELAY_YN = 'Y' AND B.AT_DELAY_COMPLETE_YN = 'N' |
|
| 1397 |
+ THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE) |
|
| 1398 |
+ ELSE B.REQ_DATE |
|
| 1399 |
+ END AS atDelayOrgTime, |
|
| 1400 |
+ C.YELLOW_ID AS yellowId |
|
| 1401 |
+ FROM MJ_MSG_GROUP_DATA B |
|
| 1402 |
+ INNER JOIN ( |
|
| 1403 |
+ select MSG_GROUP_ID, MSG_TYPE, DEL_FLAG, MSG_NOTICETALK_SENDER_KEY, BIZ_KAKAO_RESEND_YN |
|
| 1404 |
+ from MJ_MSG_DATA |
|
| 1405 |
+ where DEL_FLAG = 'N' |
|
| 1406 |
+ <isNotEmpty property="tabType"> |
|
| 1407 |
+ <isEqual property="tabType" compareValue="at"> |
|
| 1408 |
+ AND MSG_TYPE = '8' |
|
| 1409 |
+ </isEqual> |
|
| 1410 |
+ <isEqual property="tabType" compareValue="ft"> |
|
| 1411 |
+ AND MSG_TYPE = '9' |
|
| 1412 |
+ </isEqual> |
|
| 1413 |
+ <isEqual property="tabType" compareValue="all"> |
|
| 1414 |
+ AND MSG_TYPE IN ('8','9')
|
|
| 1415 |
+ </isEqual> |
|
| 1416 |
+ </isNotEmpty> |
|
| 1417 |
+ <isEmpty property="tabType"> |
|
| 1418 |
+ AND MSG_TYPE IN ('8','9')
|
|
| 1419 |
+ </isEmpty> |
|
| 1420 |
+ group by MSG_GROUP_ID) A |
|
| 1421 |
+ ON A.MSG_GROUP_ID = B.MSG_GROUP_ID |
|
| 1422 |
+ LEFT JOIN MJ_KAKAO_PROFILE_INFO C |
|
| 1423 |
+ ON A.MSG_NOTICETALK_SENDER_KEY = C.SENDER_KEY |
|
| 1424 |
+ WHERE ( |
|
| 1425 |
+ B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL |
|
| 1426 |
+ ) |
|
| 1427 |
+ AND B.USER_ID = #userId# |
|
| 1428 |
+ <isNotEmpty property="startDate"> |
|
| 1429 |
+ AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#startDate#, '%Y-%m-%d') |
|
| 1430 |
+ </isNotEmpty> |
|
| 1431 |
+ <isNotEmpty property="endDate"> |
|
| 1432 |
+ AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#endDate#, '%Y-%m-%d') |
|
| 1433 |
+ </isNotEmpty> |
|
| 1434 |
+ <isNotEmpty property="stateType"> |
|
| 1435 |
+ <isEqual property="stateType" compareValue="Y"> |
|
| 1436 |
+ AND B.RESERVE_YN = 'Y' |
|
| 1437 |
+ </isEqual> |
|
| 1438 |
+ <isEqual property="stateType" compareValue="N"> |
|
| 1439 |
+ AND B.RESERVE_YN = 'N' |
|
| 1440 |
+ </isEqual> |
|
| 1441 |
+ </isNotEmpty> |
|
| 1442 |
+ <isNotEmpty property="searchKeyword"> |
|
| 1443 |
+ <isEqual property="searchCondition" compareValue="3"> |
|
| 1444 |
+ AND B.SMS_TXT like CONCAT('%', #searchKeyword#, '%')
|
|
| 1445 |
+ </isEqual> |
|
| 1446 |
+ </isNotEmpty> |
|
| 1447 |
+ GROUP BY B.MSG_GROUP_ID |
|
| 1448 |
+ ORDER BY 1=1 |
|
| 1449 |
+ <isNotEmpty property="searchSortCnd"> |
|
| 1450 |
+ ,$searchSortCnd$ |
|
| 1451 |
+ </isNotEmpty> |
|
| 1452 |
+ <isNotEmpty property="searchSortOrd"> |
|
| 1453 |
+ $searchSortOrd$ |
|
| 1454 |
+ </isNotEmpty> |
|
| 1455 |
+ LIMIT #recordCountPerPage# |
|
| 1456 |
+ OFFSET #firstIndex# |
|
| 1457 |
+ |
|
| 1458 |
+ </select> |
|
| 1459 |
+ |
|
| 1460 |
+ <!-- 전체 발송결과 조회 (그룹별)--> |
|
| 1461 |
+ <select id="KakaoSentDAO.selectAllKakaoSentListExcel_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO"> |
|
| 1357 | 1462 |
/* KakaoSentDAO.selectAllKakaoSentList_advc */ |
| 1358 | 1463 |
SELECT t1.totMsgCnt, |
| 1359 | 1464 |
t1.userId, |
... | ... | @@ -1609,7 +1714,7 @@ |
| 1609 | 1714 |
WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y' |
| 1610 | 1715 |
ELSE 'N' |
| 1611 | 1716 |
END AS divideYN |
| 1612 |
- FROM mj_msg_data t1 |
|
| 1717 |
+ FROM mj_msg_data t1 FORCE INDEX (idx_msgdata_groupid_delfalg_msgtype_curstate) |
|
| 1613 | 1718 |
LEFT OUTER JOIN BIZ_LOG BL1 ON t1.BIZ_UMID = BL1.CMID |
| 1614 | 1719 |
WHERE |
| 1615 | 1720 |
t1.DEL_FLAG = 'N' |
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
... | ... | @@ -900,6 +900,8 @@ |
| 900 | 900 |
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition }' />" />
|
| 901 | 901 |
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword }' />" />
|
| 902 | 902 |
<input type="hidden" name="pageUnit" value="<c:out value='${searchVO.pageUnit }' />" />
|
| 903 |
+ <input type="hidden" name="tabType" value="<c:out value='${searchVO.tabType }' />" />
|
|
| 904 |
+ <input type="hidden" name="stateType" value="<c:out value='${searchVO.stateType }' />" />
|
|
| 903 | 905 |
</form> |
| 904 | 906 |
|
| 905 | 907 |
<!-- 예약 취소 --> |
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
... | ... | @@ -16,7 +16,82 @@ |
| 16 | 16 |
var threefulstday = ""; //3개월전 시작일 |
| 17 | 17 |
var threefuledday = ""; //3개월전 마지막일 |
| 18 | 18 |
|
| 19 |
+function firstLodingSet(){
|
|
| 20 |
+ var html = ""; |
|
| 21 |
+ html += '<div class="list_info">'; |
|
| 22 |
+ html += ' <p>총 발송건수 <span class="c_e40000">0</span>건</p>'; |
|
| 23 |
+ html += ' <div>'; |
|
| 24 |
+ html += ' <p class="cf_text c_e40000">※ 예약 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>'; |
|
| 25 |
+ html += ' <label for="pageUnit" class="label">줄보기 선택</label>'; |
|
| 26 |
+ html += ' <select id="pageUnit" name="pageUnit" class="selType2">'; |
|
| 27 |
+ html += ' <option value="10" selected>10개보기</option>'; |
|
| 28 |
+ html += ' </select>'; |
|
| 29 |
+ html += ' </div>'; |
|
| 30 |
+ html += '</div>'; |
|
| 31 |
+ html += '<div class="tb_wrap">'; |
|
| 32 |
+ html += ' <table class="tType4">'; |
|
| 33 |
+ html += ' <colgroup>'; |
|
| 34 |
+ html += ' <col style="width: 45px;">'; |
|
| 35 |
+ html += ' <col style="width: 12%;">'; |
|
| 36 |
+ html += ' <col style="width: 7%;">'; |
|
| 37 |
+ html += ' <col style="width: auto;">'; |
|
| 38 |
+ html += ' <col style="width: 7%;">'; |
|
| 39 |
+ html += ' <col style="width: 6%;">'; |
|
| 40 |
+ html += ' <col style="width: 6%;">'; |
|
| 41 |
+ html += ' <col style="width: 6%;">'; |
|
| 42 |
+ html += ' <col style="width: 6%;">'; |
|
| 43 |
+ html += ' <col style="width: 6%;">'; |
|
| 44 |
+ html += ' <col style="width: 8%;">'; |
|
| 45 |
+ html += ' <col style="width: 8%;">'; |
|
| 46 |
+ html += ' </colgroup>'; |
|
| 47 |
+ html += ' <thead>'; |
|
| 48 |
+ html += ' <tr>'; |
|
| 49 |
+ html += ' <th rowspan="2">'; |
|
| 50 |
+ html += ' <label for="" class="label">전체 선택</label>'; |
|
| 51 |
+ html += ' <input type="checkbox" id="allCheck" name="allCheck">'; |
|
| 52 |
+ html += ' </th>'; |
|
| 53 |
+ html += ' <th rowspan="2">발송일시'; |
|
| 54 |
+ html += ' <div class="sort_wrap">'; |
|
| 55 |
+ html += ' <input type="button" class="sort sortBtn" id="sort_reqdate">'; |
|
| 56 |
+ html += ' </div>'; |
|
| 57 |
+ html += ' </th>'; |
|
| 58 |
+ html += ' <th rowspan="2">형태'; |
|
| 59 |
+ html += ' <div class="sort_wrap">'; |
|
| 60 |
+ html += ' <input type="button" class="sort sortBtn" id="sort_orderByCode">'; |
|
| 61 |
+ html += ' </div>'; |
|
| 62 |
+ html += ' </th>'; |
|
| 63 |
+ html += ' <th rowspan="2">내용</th>'; |
|
| 64 |
+ html += ' <th rowspan="2">발송건수'; |
|
| 65 |
+ html += ' <div class="sort_wrap">'; |
|
| 66 |
+ html += ' <input type="button" class="sort sortBtn" id="sort_msgGroupCnt">'; |
|
| 67 |
+ html += ' </div>'; |
|
| 68 |
+ html += ' </th>'; |
|
| 69 |
+ html += ' <th rowspan="2">대기</th>'; |
|
| 70 |
+ html += ' <th colspan="2">카카오톡결과</th>'; |
|
| 71 |
+ html += ' <th colspan="2">대체문자결과</th>'; |
|
| 72 |
+ html += ' <th rowspan="2">금액(원)</th>'; |
|
| 73 |
+ html += ' <th rowspan="2">진행상황</th>'; |
|
| 74 |
+ html += ' </tr>'; |
|
| 75 |
+ html += ' <tr>'; |
|
| 76 |
+ html += ' <th>성공</th>'; |
|
| 77 |
+ html += ' <th>실패</th>'; |
|
| 78 |
+ html += ' <th>성공</th>'; |
|
| 79 |
+ html += ' <th>실패</th>'; |
|
| 80 |
+ html += ' </tr>'; |
|
| 81 |
+ html += ' </thead>'; |
|
| 82 |
+ html += ' <tbody>'; |
|
| 83 |
+ html += ' <tr><td colspan="12">LOADING...</td></tr>'; |
|
| 84 |
+ html += ' </tbody>'; |
|
| 85 |
+ html += ' </table>'; |
|
| 86 |
+ html += '</div>'; |
|
| 87 |
+ |
|
| 88 |
+ $(".msgSentAllLoad").html(html);
|
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+ |
|
| 19 | 92 |
$(document).ready(function(){
|
| 93 |
+ |
|
| 94 |
+ firstLodingSet(); |
|
| 20 | 95 |
|
| 21 | 96 |
//초기 전체 리스트 페이지 보여주기 |
| 22 | 97 |
var form = document.searchForm; |
... | ... | @@ -417,8 +492,10 @@ |
| 417 | 492 |
<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/> |
| 418 | 493 |
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
|
| 419 | 494 |
<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
|
| 420 |
- <input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 --> |
|
| 421 |
- <input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 --> |
|
| 495 |
+ <!-- <input type="hidden" id="tabType" name="tabType" value="all"/>탭 종류 --> |
|
| 496 |
+ <input type="hidden" id="tabType" name="tabType" value="${searchVO.tabType}"/><!-- 탭 종류 -->
|
|
| 497 |
+ <!-- <input type="hidden" id="stateType" name="stateType" value="all"/>발송상태 종류 --> |
|
| 498 |
+ <input type="hidden" id="stateType" name="stateType" value="${searchVO.stateType}"/><!-- 발송상태 종류 -->
|
|
| 422 | 499 |
<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 --> |
| 423 | 500 |
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 --> |
| 424 | 501 |
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
|
... | ... | @@ -555,11 +632,11 @@ |
| 555 | 632 |
<div class="list_tab_wrap2 type4"> |
| 556 | 633 |
<!-- tab button --> |
| 557 | 634 |
<ul class="list_tab"> |
| 558 |
- <li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
|
|
| 559 |
- <li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
|
|
| 635 |
+ <li class="tab <c:if test="${searchVO.tabType eq '' || searchVO.tabType eq 'all' || empty searchVO.tabType}">active</c:if>"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
|
|
| 636 |
+ <li class="tab <c:if test="${searchVO.tabType eq 'at'}">active</c:if>"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
|
|
| 560 | 637 |
<%-- <c:if test="${pageContext.request.serverName == 'localhost'
|
| 561 | 638 |
|| pageContext.request.serverName == '119.193.215.98'}"> |
| 562 |
- <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
|
|
| 639 |
+ <li class="tab <c:if test="${searchVO.tabType eq 'ft'}">active</c:if>"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
|
|
| 563 | 640 |
</c:if> --%> |
| 564 | 641 |
</ul><!--// tab button --> |
| 565 | 642 |
</div> |
... | ... | @@ -582,7 +659,7 @@ |
| 582 | 659 |
<!-- <div class="on_active">받는사람(전송건별)</div> --> |
| 583 | 660 |
<!-- </div> --> |
| 584 | 661 |
<ul> |
| 585 |
- <li class="tab active"> |
|
| 662 |
+ <li class="tab <c:if test="${searchVO.stateType eq 'all' || searchVO.stateType eq '' || empty searchVO.stateType}">active</c:if>">
|
|
| 586 | 663 |
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button>
|
| 587 | 664 |
</li> |
| 588 | 665 |
<!-- <li class="tab"> |
... | ... | @@ -594,10 +671,10 @@ |
| 594 | 671 |
<li class="tab"> |
| 595 | 672 |
<button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button>
|
| 596 | 673 |
</li> --> |
| 597 |
- <li class="tab"> |
|
| 674 |
+ <li class="tab <c:if test="${searchVO.stateType eq 'N'}">active</c:if>">
|
|
| 598 | 675 |
<button type="button" onclick="fnListLoad('N','1'); return false;">즉시</button>
|
| 599 | 676 |
</li> |
| 600 |
- <li class="tab"> |
|
| 677 |
+ <li class="tab" <c:if test="${searchVO.stateType eq 'Y'}">active</c:if>>
|
|
| 601 | 678 |
<button type="button" onclick="fnListLoad('Y','2'); return false;">예약</button>
|
| 602 | 679 |
</li> |
| 603 | 680 |
</ul> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?