public without sharing class LostReportHandler extends Oly_TriggerHandler { private Map newMap; private Map oldMap; private List newList; private List oldList; private static Set checkedSet = new Set(); private static Map needCheckLRMap = new Map(); private static Set checkedRAESDSet = new Set(); private static Set checkedIDSet = new Set(); // 需要追加共享的共享Object private static List shareList = new List(); // 已经放在追加共享List的Key private static Set shareSet = new Set(); private static User planning_DivisionB; public LostReportHandler() { this.newMap = (Map) Trigger.newMap; this.oldMap = (Map) Trigger.oldMap; this.newList = (List) Trigger.new; this.oldList = (List) Trigger.old; } protected override void beforeInsert() { beforeExecute(); } protected override void beforeUpdate() { needCheckLRMap = new Map(); beforeExecute(); setEmail_Detail(); } protected override void afterUpdate() { // updateNeedAutoGiveup(); setShare(); if (shareList.size() > 0) { insert shareList; } //add by rentx 20210604 1635 start setBeiPinWindowAndTOwner(); //add by rentx 20210609 1635 end //2021-12-17 mzy 备品任务 start //遗失报告批准给备品配套一览明细打标识 setRentalDetailFlag(); //2021-12-17 mzy 备品任务 end } protected override void afterDelete() { deleteCheck(); } //add by rentx 20210604 start private void setBeiPinWindowAndTOwner(){ List updateList = new List(); //需要进行查询,因为有公式字段 List ids = new List(); for (LostReport__c nObj : newList) { //add by rentx 1650 start 盘点时也给备品总窗口赋值 if (nObj.TransferApply__c != null || nObj.Inventory_Header__c != null) { ids.add(nObj.Id); } } if (ids.size() > 0) { List lrList = [select id,BeiPinWindow_F__c,TransferApply__r.OwnerId,TransferApply__r.Contact_Person__c,TransferApplyDeveloperName__c from LostReport__c where id in :ids]; for (LostReport__c lost : lrList) { //给备品总窗口赋值 lost.BeiPinWindow__c = lost.BeiPinWindow_F__c; //给联络人赋值 办事处到备品中心取联络人,备品中心到办事处取申请人 if (lost.TransferApplyDeveloperName__c == '备品中心调拨至办事处') { lost.TApplyOwner__c = lost.TransferApply__r.OwnerId; }else if (lost.TransferApplyDeveloperName__c == '办事处调拨至备品中心') { lost.TApplyOwner__c = lost.TransferApply__r.Contact_Person__c; } } //add by rentx 20210604 1635 start 给备品总窗口赋值 if (lrList.size() > 0) { Oly_TriggerHandler.bypass('LostReportHandler'); update lrList; } //add by rentx 20210604 } } //add by rentx 20210604 end private void deleteCheck() { for (LostReport__c oObj : oldList) { if (oObj.Status__c == '草案中' && oObj.LostReport_Detail_Count__c > 0) { oObj.addError('不可以删除有遗失报告明细的草案中遗失报告。'); } } } private void setEmail_Detail() { Set needSetEmailRaesdSet = new Set(); Set needSetEmailLHSet = new Set(); Set needSetEmailDBSet = new Set(); List needSetEmailAssetList = new List(); for (LostReport__c nObj : newList) { LostReport__c oObj; if (Trigger.isUpdate) { oObj = oldMap.get(nObj.Id); } System.debug('nObj::'+nObj); if (oObj != null && oObj.Status__c != nObj.Status__c && (nObj.Status__c == '已批准' || nObj.Status__c == '填写完毕')) { if (String.isNotBlank(nObj.Rental_Apply__c)) { needSetEmailRaesdSet.add(nObj.Id); } if (String.isNotBlank(nObj.Inventory_Header__c)) { needSetEmailLHSet.add(nObj.Id); } if (String.isNotBlank(nObj.Asset__c)) { needSetEmailAssetList.add(nObj); } //add by rentx 20210609 1635 start if (String.isNotBlank(nObj.TransferApply__c)) { needSetEmailDBSet.add(nObj.Id); } //add by rentx 20210609 end } } //update by rentx 20210609 start // if (needSetEmailRaesdSet.size() > 0 || needSetEmailLHSet.size() > 0) { // setEmail_DetailRaesd(needSetEmailRaesdSet, needSetEmailLHSet); // } System.debug('115::::::'+needSetEmailDBSet); if (needSetEmailRaesdSet.size() > 0 || needSetEmailLHSet.size() > 0 || needSetEmailDBSet.size() > 0) { setEmail_DetailRaesd(needSetEmailRaesdSet, needSetEmailLHSet, needSetEmailDBSet); } //update by rentx 20210609 1635 end setPlanning_DivisionB(needSetEmailAssetList); } private void setPlanning_DivisionB(List needSetEmailAssetList) { if (needSetEmailAssetList.size() > 0) { if (planning_DivisionB == null) { List us = [SELECT Id , JingliEquipmentManager__c FROM User WHERE Id = :System.Label.Planning_DivisionAId]; if (us.size() > 0) { planning_DivisionB = us[0]; } } for (LostReport__c nObj : needSetEmailAssetList) { nObj.Planning_DivisionB__c = planning_DivisionB.JingliEquipmentManager__c; nObj.Planning_DivisionA__c = System.Label.Planning_DivisionAId; } } } private void setEmail_DetailRaesd(Set needSetEmaiRAESDSet, Set needSetEmailLDSet, Set needSetEmailDBSet) { System.debug(needSetEmaiRAESDSet); System.debug(needSetEmailLDSet); System.debug(needSetEmailDBSet); Map lrMap = new Map(); List lrdList = [SELECT Id, LostReport__c, Rental_Apply_Equipment_Set_Detail__r.Fixture_Model_No_F__c, Inventory_Detail__r.Inventory_Deviation__c, Inventory_Detail__r.Asset__r.Fixture_Model_No_F__c, Inventory_Detail__r.Asset__r.Internal_asset_location__c, Inventory_Detail__r.Asset__r.SerialNumber, Inventory_Detail__r.Asset__r.CompanyOfEquipment__c, Inventory_Detail__r.Asset__r.Internal_Asset_number__c, Inventory_Detail__r.Asset__r.Salesdepartment__c, TransferApplyDetail__r.Fixture_Model_No_F__c FROM LostReport_Detail__c WHERE ( (LostReport__c = :needSetEmailLDSet AND Inventory_Detail__c != null ) OR (LostReport__c = :needSetEmaiRAESDSet AND Rental_Apply_Equipment_Set_Detail__c != null ) //add by rentx 1635 20210609 OR (LostReport__c = :needSetEmailDBSet AND TransferApplyDetail__c != null ) //add by rentx 1635 20210609 ) AND CancelLostReport__c = false ORDER BY LostReport__c]; Integer i = 0; LostReport_Detail__c lrd1 = new LostReport_Detail__c(); for (LostReport_Detail__c lrd : lrdList) { if (lrMap.containsKey(lrd.LostReport__c) == false) { String htmlStr = '备品明细:
'; if (needSetEmaiRAESDSet.contains(lrd.LostReport__c)) { // htmlStr += Asset.Fixture_Model_No_F__c.getDescribe().getLabel() + ''; //add by rentx 20210609 1635 start }else if (needSetEmailDBSet.contains(lrd.LostReport__c)) { //add by rentx 20210609 1635 end } else { htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; htmlStr += ''; } lrMap.put(lrd.LostReport__c, htmlStr); } if (lrd.LostReport__c != lrd1.LostReport__c) { i = 0; lrd1 = lrd; } String str = lrMap.get(lrd.LostReport__c); String modelNo = ''; if (needSetEmaiRAESDSet.contains(lrd.LostReport__c)) { modelNo += lrd.Rental_Apply_Equipment_Set_Detail__r.Fixture_Model_No_F__c; lrMap.put(lrd.LostReport__c,str // + '' + '型号:' + modelNo // + '' + '
'); } else if (needSetEmailLDSet.contains(lrd.LostReport__c)) { modelNo += ''; // 本部 备品存放地 备品配套明细型号 机身号 分公司 固定资产号 盘亏数量 modelNo += ''; modelNo += ''; modelNo += ''; modelNo += ''; modelNo += ''; modelNo += ''; modelNo += ''; modelNo += ''; lrMap.put(lrd.LostReport__c,str + modelNo); //add by rentx 20210609 1635 start 调拨的不要 前面这个和型号 }else if (needSetEmailDBSet.contains(lrd.LostReport__c)) { modelNo += lrd.TransferApplyDetail__r.Fixture_Model_No_F__c; lrMap.put(lrd.LostReport__c,str.replace('备品明细:
', '') + modelNo + '
'); } //add by rentx 20210609 end i ++; } System.debug(lrMap); for (Id lrId : lrMap.keySet()) { String emailD = lrMap.get(lrId); if (needSetEmailLDSet.contains(lrId)) { emailD += '
' + Asset.Salesdepartment__c.getDescribe().getLabel() + '' + Asset.Internal_asset_location__c.getDescribe().getLabel() + '' + Asset.Fixture_Model_No_F__c.getDescribe().getLabel() + '' + Asset.SerialNumber.getDescribe().getLabel() + '' + Asset.CompanyOfEquipment__c.getDescribe().getLabel() + '' + Asset.Internal_Asset_number__c.getDescribe().getLabel() + '' + Inventory_Detail__c.Inventory_Deviation__c.getDescribe().getLabel() + '
' + checkBlank(lrd.Inventory_Detail__r.Asset__r.Salesdepartment__c) + '' + checkBlank(lrd.Inventory_Detail__r.Asset__r.Internal_asset_location__c) + '' + checkBlank(lrd.Inventory_Detail__r.Asset__r.Fixture_Model_No_F__c) + '' + checkBlank(lrd.Inventory_Detail__r.Asset__r.SerialNumber) + '' + checkBlank(lrd.Inventory_Detail__r.Asset__r.CompanyOfEquipment__c) + '' + checkBlank(lrd.Inventory_Detail__r.Asset__r.Internal_Asset_number__c) + '' + (lrd.Inventory_Detail__r.Inventory_Deviation__c * -1) + '
'; } //add by rentx 1635 20210609 start if (needSetEmailDBSet.contains(lrId)) { emailD += ''; } //add by rentx 20210609 end newMap.get(lrId).Email_Detail__c = emailD; } } private String checkBlank(String str) { if (String.isBlank(str)) { return ''; } return str; } // private void updateNeedAutoGiveup() { // if (needCheckLRMap.isEmpty() == false) { // List ldList = [SELECT Id, // Rental_Apply_Equipment_Set_Detail__c, // Inventory_Detail__c // FROM LostReport_Detail__c // WHERE LostReport__c = :needCheckLRMap.keySet() // AND Auto_Lost_item_giveup_F__c = false // AND CancelLostReport__c = false]; // List raesdList = new List(); // List idList = new List(); // for (LostReport_Detail__c ldObj : ldList) { // if (String.isNotBlank(ldObj.Rental_Apply_Equipment_Set_Detail__c) // && !checkedRAESDSet.contains(ldObj.Rental_Apply_Equipment_Set_Detail__c)) { // checkedRAESDSet.add(ldObj.Rental_Apply_Equipment_Set_Detail__c); // raesdList.add(new Rental_Apply_Equipment_Set_Detail__c(Id = ldObj.Rental_Apply_Equipment_Set_Detail__c)); // } // else if (String.isNotBlank(ldObj.Inventory_Detail__c) // && checkedIDSet.contains(ldObj.Inventory_Detail__c)) { // checkedIDSet.add(ldObj.Inventory_Detail__c); // idList.add(new Inventory_Detail__c(Id = ldObj.Inventory_Detail__c)); // } // } // if (raesdList.size() > 0 || idList.size() > 0) { // Loaner_AutoGiveup(raesdList, null,idList); // } // } // } private void beforeExecute() { Set clearIsPunishObjSet = new Set();// 20211216 ljh SFDC-C933NJ add start for (LostReport__c nObj : newList) { LostReport__c oObj; // OCSM_BP3-126 遗失报告提交申请书的时候需要重新设置user,看申请书owner if (Trigger.isUpdate) { oObj = oldMap.get(nObj.Id); } if (Trigger.isInsert || (oObj != null && nObj.Status__c=='填写完毕' && nObj.Status__c != oObj.Status__c)) { nObj.RA_BuchangApprovalManagerSales__c = nObj.RA_BuchangApprovalManagerSales_F__c; nObj.RA_Person_In_Charge__c = nObj.RA_Person_In_Charge_F__c; nObj.RA_ZongjianApprovalManager__c = nObj.RA_ZongjianApprovalManager_F__c; nObj.RA_SalesManager__c = nObj.RA_SalesManager_F__c; nObj.RA_TongkuoZongjian__c = nObj.RA_TongkuoZongjian_F__c; nObj.Rental_Apply_SplitUser__c = nObj.Rental_Apply_SplitUser_F__c;//20210427 you 1653 bp3_Setting__c conf = bp3_Setting__c.getOrgDefaults(); nObj.BeiPin_ZhongJian__c = conf.BeiPin_ZhongJian__c; if (nObj.Rental_Apply__c != null) { if(nObj.Salesdept_F__c == '医疗华东营业本部') { nObj.FuZongJian__c = conf.FuZongJian__c; } else { nObj.FuZongJian__c = null; } } //add by rentx 202109011 1635 start or 1650 you if (nObj.TransferApply__c != null || nObj.Inventory_Header__c != null) { if(nObj.benbu__c == '医疗华东营业本部') { nObj.FuZongJian__c = conf.FuZongJian__c; } else { nObj.FuZongJian__c = null; } } //add by rentx 20210911 1635 end if (String.isBlank(nObj.Asset__c)) { nObj.YunYingBuZhang__c = conf.YunYingBuZhang__c; } nObj.Assign_Person__c = nObj.Assign_Person_F__c; } if (oObj != null && oObj.Status__c != '已批准' && nObj.Status__c == '已批准' && checkedSet.contains(nObj.Id)) { needCheckLRMap.put(nObj.Id, nObj); checkedSet.add(nObj.Id); } if (nObj.LostReport_Detail_Count__c == 0 && oObj != null && ((oObj.LostReport_approval_time__c != nObj.LostReport_approval_time__c && nObj.LostReport_approval_time__c != null) || (oObj.BuchangManager_approval_time__c != nObj.BuchangManager_approval_time__c && nObj.BuchangManager_approval_time__c != null) || (oObj.Assign_Person_approval_time__c != nObj.Assign_Person_approval_time__c && nObj.Assign_Person_approval_time__c != null) || (oObj.BeiPin_ZhongJian_approval_time__c != nObj.BeiPin_ZhongJian_approval_time__c && nObj.BeiPin_ZhongJian_approval_time__c != null) || (oObj.ZongjianManager_approval_time__c != nObj.ZongjianManager_approval_time__c && nObj.ZongjianManager_approval_time__c != null) || (oObj.SalesManager_approval_time__c != nObj.SalesManager_approval_time__c && nObj.SalesManager_approval_time__c != null) || (oObj.TongkuoZongjian_approval_time__c != nObj.TongkuoZongjian_approval_time__c && nObj.TongkuoZongjian_approval_time__c != null) || (oObj.Planning_DivisionA_approval_time__c != nObj.Planning_DivisionA_approval_time__c && nObj.Planning_DivisionA_approval_time__c != null) || (oObj.Planning_DivisionB_approval_time__c != nObj.Planning_DivisionB_approval_time__c && nObj.Planning_DivisionB_approval_time__c != null) )) { nObj.addError('没有遗失报告明细,不能批准'); } if(oObj != null && oObj.Status__c == '申请中' && nObj.Status__c == '草案中') { // 各级批准时间共8个 nObj.SalesManager_approval_time__c = null; nObj.BuchangManager_approval_time__c = null; nObj.FuZongJian_approval_time__c = null; nObj.ZongjianManager_approval_time__c = null; nObj.TongkuoZongjian_approval_time__c = null; nObj.Assign_Person_approval_time__c = null; nObj.YunYingBuZhang_approval_time__c = null; nObj.BeiPin_ZhongJian_approval_time__c = null; nObj.Planning_DivisionA_approval_time__c = null; nObj.Planning_DivisionB_approval_time__c = null; nObj.Rental_Apply_SplitUser_approval_time__c = null;//20210427 you 1653 // 清空遗失报告批准时间 nObj.LostReport_approval_time__c = null; // 20211216 ljh SFDC-C933NJ add start // 2.驳回的时候清空明细&&是否罚则对象 nObj.IsFinishPunishObj__c = false; clearIsPunishObjSet.add(nObj.Id); // 20211216 ljh SFDC-C933NJ add end } // 20211216 ljh SFDC-C933NJ add start // 1.备品中心提交 部长审批的时候 必须填写 【是否罚则对象】 部长批准时间 \运营部长批准时间 String uId = UserInfo.getUserId(); System.debug('zheli398:'+nObj.YunYingBuZhang__c+nObj.YunYingBuZhang_approval_time__c); if(oObj != null && uId.substring(0,15) == System.Label.PersonalId && ( (String.isNotBlank(nObj.RA_BuchangApprovalManagerSales__c) && nObj.RA_BuchangApprovalManagerSales__c == UserInfo.getUserId() && oObj.BuchangManager_approval_time__c == null && nObj.BuchangManager_approval_time__c != null) || (String.isNotBlank(nObj.YunYingBuZhang__c) && nObj.YunYingBuZhang__c == UserInfo.getUserId() && oObj.YunYingBuZhang_approval_time__c == null && nObj.YunYingBuZhang_approval_time__c != null) ) && nObj.IsFinishPunishObj__c == false){ nObj.addError('【是否罚则对象】 必须填写保存后才能审批'); } // 20211216 ljh SFDC-C933NJ add end } if (System.Trigger.isInsert) { setPlanning_DivisionB(newList); } // 20211216 ljh SFDC-C933NJ add start // 2.驳回的时候清空明细 if(clearIsPunishObjSet.size() > 0){ List lrdList = [SELECT Id,IsPunishObj__c FROM LostReport_Detail__c WHERE LostReport__c IN :clearIsPunishObjSet AND IsPunishObj__c != null]; if(lrdList.size() > 0){ for(LostReport_Detail__c lrd:lrdList){ lrd.IsPunishObj__c = null; } update lrdList; } } // 20211216 ljh SFDC-C933NJ add end } private void setShare() { for (LostReport__c nObj: newList) { LostReport__c oObj = oldMap.get(nObj.Id); if (oObj.Status__c != nObj.Status__c && nObj.Status__c == '填写完毕') { List userList = new List(); userList.add(nObj.RA_SalesManager_F__c + '_Read'); userList.add(nObj.RA_BuchangApprovalManagerSales__c + '_Read'); userList.add(nObj.RA_ZongjianApprovalManager_F__c + '_Read'); userList.add(nObj.RA_TongkuoZongjian_F__c + '_Read'); setSObjectShare('LostReport__Share', 'Manual', nObj.Id, userList, nObj.OwnerId, shareSet, shareList); } } } //update by rentx 20210514 start 1635 // public static void Loaner_AutoGiveup(List raesds, List lrds, List ids) { public static void Loaner_AutoGiveup(List raesds, List lrds, List ids, List tadList) { if (tadList != null && tadList.size() > 0) { List updateTList = new List(); for (TransferApplyDetail__c tad: tadList ) { //如果是非固定资产 状态丢失 // if (tad.Internal_Asset_number_key__c == null || tad.Internal_Asset_number_key__c == '') { tad.Lost_item_giveup__c = true; // } tad.Loaner_Giveup_Time__c = Datetime.now(); updateTList.add(tad); } System.debug('LostReportHandler::::::::::::::::::::'+updateTList); update updateTList; } //update by rentx 2021-05-14 end 1635 if (raesds != null && raesds.size() > 0) { List raesdList = new List(); for (Rental_Apply_Equipment_Set_Detail__c raesd : raesds) { raesd.Lost_item_giveup__c = true; raesd.Loaner_Giveup_Time__c = Datetime.now(); raesdList.add(raesd); } update raesdList; } if (ids != null && ids.size() > 0) { List idList = new List(); for (Inventory_Detail__c id1 : ids) { id1.Auto_Lost_item_giveup__c = true; idList.add(id1); } update idList; } if (lrds != null && lrds.size() > 0) { List irdsList = new List(); Set reportIds = new Set(); for (LostReport_Detail__c idr : lrds) { idr.CancelLostReport__c = true; idr.DeleteLostReport_Detail_Reason__c = '自动断念删除'; irdsList.add(idr); if(idr.LostReport__c != null) { reportIds.add(idr.LostReport__c); } } update irdsList; if(reportIds.size() > 0) { List reportList = [SELECT Id, Status__c FROM LostReport__c WHERE Id IN:reportIds AND LostReport_Detail_Count__c = 0]; Set cancelIdSet = new Set(); if(reportList.size() > 0) { Datetime now = System.now(); for(LostReport__c report : reportList) { if(report.Status__c == '申请中'){ cancelIdSet.add(report.Id); } report.Status__c = '取消'; report.Cancel_Time__c = now; } if (cancelIdSet.size() > 0) { List requests = new List (); Map piMap = New Map([Select Id from ProcessInstance where TargetObjectId IN :cancelIdSet]); for(ProcessInstanceWorkItem wi : [Select Id from ProcessInstanceWorkItem where ProcessInstanceId IN :piMap.keySet()]){ Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest(); req2.setAction('Removed'); req2.setWorkitemId(wi.Id); requests.add(req2); } if (requests.size() > 0) { Approval.ProcessResult[] processResults = null; processResults = Approval.process(requests, true); } } update reportList; } } } } public static void setSObjectShare(String sobjectName, String rowCause, String parentId, List userAccess, String ownerId, Set shareSet1, List shareList1) { // オブジェクトの共有権限が公開の場合__Shareオブジェクトが存在しませんので個々で判断します if (Schema.getGlobalDescribe().containsKey(sobjectName)) { for (String ua : userAccess) { String userid = ua.split('_')[0]; String access = ua.split('_')[1]; SObject sObj = Schema.getGlobalDescribe().get(sobjectName).newSObject(); String key = parentId + ':' + userid; if (String.isBlank(userid) == false && userid.substring(0, 15) != ownerId.substring(0, 15) && !shareSet.contains(key)) { sObj.put('RowCause', rowCause); sObj.put('ParentId', parentId); sObj.put('UserOrGroupId', userid); sObj.put('AccessLevel', access); shareList1.add(sObj); shareSet1.add(parentId + ':' + userid); } } } } //2021-12-17 mzy 备品任务 start public void setRentalDetailFlag(){ //如果遗失报告审批,则根据遗失报告明细将借出备品配套一览明细打标识 Set LostReprotSet = new Set(); for (LostReport__c nObj : newList) { LostReport__c oObj = oldMap.get(nObj.Id); if(oObj.Status__c != nObj.Status__c && '已批准'.equals(nObj.Status__c)){ LostReprotSet.add(nObj.Id); } } //根据遗失报告查询遗失报告明细 if(LostReprotSet.size()>0){ List LostReprotDetailList = [SELECT Id,Rental_Apply_Equipment_Set_Detail__c FROM LostReport_Detail__c WHERE Rental_Apply_Equipment_Set_Detail__c != null AND LostReport__c in :LostReprotSet]; Date today = Date.today(); if(LostReprotDetailList.size()>0){ //存放借出备品配套一览明细 List needUpdateRentalDetail = new List(); for(LostReport_Detail__c ld :LostReprotDetailList){ Rental_Apply_Equipment_Set_Detail__c tempDetail = new Rental_Apply_Equipment_Set_Detail__c(); tempDetail.Id = ld.Rental_Apply_Equipment_Set_Detail__c; tempDetail.LoseReportApprovaled__c = true; tempDetail.LostReportApprovalDate__c = today; needUpdateRentalDetail.add(tempDetail); } if(needUpdateRentalDetail.size()>0){ update needUpdateRentalDetail; } } } } //2021-12-17 mzy 备品任务 end public void addFGL(){ Integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } }