global class UpdateNFM110 implements Database.Batchable , Database.Stateful { public String query; public Date startDate; public Date endDate; public List emailMessages = new List(); public list testIDList = new list(); global UpdateNFM110() { this.query = query; } global UpdateNFM110(list testIDList) { this.testIDList = testIDList; } global UpdateNFM110(Date startDate, Date endDate) { this.startDate = startDate; this.endDate = endDate; } global Database.QueryLocator start(Database.BatchableContext bc) { query = 'SELECT Id, Name, Log__c, ErrorLog__c, Log2__c, ' + ' Log3__c, Log4__c, Log5__c, Log6__c,' + 'Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, ' + 'MessageGroupNumber__c,Type__c,retry_cnt__c ' + 'FROM BatchIF_Log__c where RowDataFlg__c = true ' + ' and Type__c = \'NFM110\' '; if (startDate != null) { this.query += ' and createddate__c >=: startDate'; } if (endDate != null) { this.query += ' and createddate__c <= : endDate'; } if (testIDList.size() > 0) { this.query += ' and id in: testIDList '; } this.query += ' order by createddate '; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list batchList) { BatchIF_Log__c batch = batchList[0]; StaticParameter.ConsumableAssetHanderTrigger = true; StaticParameter.EscapeConsumableOrderDetail2Trigger = true; Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt); String rowDataStr = NFMUtil.getRowDataStr(batch); List generalDataList = (List) JSON.deserialize(rowDataStr, List.class); NFM110Rest.isRunning = true; if (generalDataList == null || generalDataList.size() == 0) { return; } Savepoint sp = Database.setSavepoint(); try { // 更新対応配列とMapなどをセット Set soNoList = new Set(); Set productCodeList = new Set(); Set productSerialNoList = new Set(); Set inquiryNoList = new Set(); // CHAN-BBLAAP 汇总这条数据的DN号 start Set DNNoSet = new Set(); set DNdetailNoSet = new Set(); // CHAN-BBLAAP 汇总这条数据的DN号 start for (GeneralData infoH : generalDataList) { if (String.isBlank(infoH.DeliveryNote)) { continue; } // CHAN-BBLAAP 汇总这条数据的DN号 start DNNoSet.add(infoH.DeliveryNote); // CHAN-BBLAAP 汇总这条数据的DN号 start if (String.isBlank(infoH.SoNo) == false) { soNoList.add(infoH.SoNo); } string tempInquiryNo = ''; // SWAG-BDV589 end if (String.isBlank(infoH.InquiryNo) == false) { String[] Inquiry; if (infoH.InquiryNo.contains(',')) { Inquiry = infoH.InquiryNo.split(','); // SWAG-BDV589 start tempInquiryNo = Inquiry[0]; // SWAG-BDV589 end inquiryNoList.add(Inquiry[0]); } else { //根据数据传的样式决定 } } for (DnInformation dnInfo : infoH.DnInformation) { dnInfo.SerialNoorLotNo = checkSerialNoorLotNo(dnInfo.SerialNoorLotNo); productCodeList.add(dnInfo.OTCode); // HHOA-AGN2EH start productSerialNoList.add(dnInfo.SerialNoorLotNo); productSerialNoList.add(dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')'); string Product_Serial_No = ''; if (dnInfo.SorLMark == 'S') { Product_Serial_No = dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo; } else { Product_Serial_No = dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')'; } DNdetailNoSet.add(infoH.DeliveryNote + ':' + Product_Serial_No); } } // CHAN-BBLAAP start // 检索出DN 并生成DN Map map DNMap = new map (); List DNList = [select id, Name, DeliveryDate_Raw__c, DeliveryNote_Raw__c, DepartmentNo_Raw__c, EndUserNo_Raw__c, InquiryNo_Raw__c, ReturnMark_Raw__c, SoNo_Raw__c, Statu_Achievements__c from Statu_Achievements_DN__c where Name in: DNNoSet]; for (Statu_Achievements_DN__c dn : DNList) { DNMap.put(dn.Name, dn); } List UpsertDNList = new List(); // 检索出DN明细 并生成DN detail Map List DNdetailList = [SELECT Id, Name, Statu_Achievements_DN__c, Barcode_Raw__c, GuaranteePeriod_Raw__c, NetWorth_Raw__c, OTCode_Raw__c, Qty_Raw__c, SerialNoorLotNo_Raw__c, SerialNumber__c, ShippedAmount__c, ShippedAmount_without_tax__c, SorLMark_Raw__c, TracingCode_Raw__c, ValidTo_Raw__c, asset__c, Statu_Achievements__c, Product_Serial_No__c, DNProduct_Serial_No__c FROM Statu_Achievements_DN_details__c where DNProduct_Serial_No__c in: DNdetailNoSet]; map DNdetailMap = new map (); for (Statu_Achievements_DN_details__c DNdetail : DNdetailList) { DNdetailMap.put(DNdetail.DNProduct_Serial_No__c, DNdetail); } // 需要插入的DN明细 List upsertDNdetailList = new List(); // CHAN-BBLAAP end List boList = [select Id, Name from Statu_Achievements__c where Name in :soNoList and OverviewStatus__c <> '无效合同']; Map boMap = new Map(); for (Statu_Achievements__c bo : boList) { boMap.put(bo.Name, bo.Id); } List prdList = [select Id, Name, ProductCode, ProductCode_Ext__c, MDM_Model_No__c from Product2 where ProductCode_Ext__c in :productCodeList]; Map prdsMap = new Map(); for (Product2 prd : prdList) { prdsMap.put(prd.ProductCode_Ext__c, prd); } List prdSearchList = [select Id, Name, Product2__r.ProductCode_Ext__c, Pro2_Dealer_ENG__c, Intra_Trade_List_RMB__c, Asset_Model_No__c, Pro2_Dealer_Object__c from Product2__c where Product2__r.ProductCode_Ext__c in :productCodeList]; Map prdSearchMap = new Map(); for (Product2__c prd2 : prdSearchList) { prdSearchMap.put(prd2.Product2__r.ProductCode_Ext__c, prd2); } List astList = [select Id, Name, Product2.ProductCode, Product2.Dealer_special_Object__c , Product2.Dealer_Object__c, SerialNumber, Product_Serial_No__c, Repair_Count__c, TracingCode__c, Product2Id, AccountId, Account.Management_Code__c, Department_Class__c, Hospital__c, Posting_Date__c, InstallDate, SLMark__c, MDM_Model_No__c, OT_CODE__c, Guarantee_period_for_products__c, Installation_Site__c, Delete_Flag__c, Return_Flag__c, Extend_Gurantee_DateTo__c, guarantee_period__c, Proviston_period__c from Asset where SerialNumber in :productSerialNoList and IsCompetitorProduct = false and Information_From__c <> '失单']; Map astsMap = new Map(); for (Asset ast : astList) { astsMap.put(ast.MDM_Model_No__c + ast.SerialNumber, ast); } List oppList = [Select Id, Purchase_Type__c, Opportunity_No__c, Sales_Root__c, SAP_Province__c, Trade__c, Agency1__c, Opportunity_Category__c From Opportunity Where Opportunity_No__c IN :inquiryNoList]; Map oppMap = new Map(); for (Opportunity opp : oppList) { oppMap.put(opp.Opportunity_No__c, opp); } for (GeneralData infoH : generalDataList) { // CHAN-BBLAAP 检索出DN 并生成DN Map start Statu_Achievements_DN__c tempSADN = DNMap.get(infoH.DeliveryNote); if (infoH.DeliveryNote != null) { if (tempSADN == null) { tempSADN = new Statu_Achievements_DN__c(); tempSADN.Statu_Achievements__c = null; tempSADN = SetSADN(tempSADN, infoH, boMap, oppMap); if (tempSADN.Statu_Achievements__c != null) UpsertDNList.add(tempSADN); } else { if (infoH.SoNo != tempSADN.SoNo_Raw__c || infoH.InquiryNo != tempSADN.InquiryNo_Raw__c || infoH.ReturnMark != tempSADN.ReturnMark_Raw__c || infoH.DeliveryDate != tempSADN.DeliveryDate_Raw__c || infoH.EndUserNo != tempSADN.EndUserNo_Raw__c || infoH.DepartmentNo != tempSADN.DepartmentNo_Raw__c || infoH.DeliveryNote != tempSADN.DeliveryNote_Raw__c ) { tempSADN = SetSADN(tempSADN, infoH, boMap, oppMap); if (tempSADN.Statu_Achievements__c != null) UpsertDNList.add(tempSADN); } } } for (DnInformation dnInfo : infoH.DnInformation) { Product2 prd = prdsMap.get(dnInfo.OTCode); Asset ast = astsMap.get(prd.MDM_Model_No__c + dnInfo.SerialNoorLotNo); if (dnInfo.SorLMark == 'S') { ast = astsMap.get(prd.MDM_Model_No__c + dnInfo.SerialNoorLotNo); } else { ast = astsMap.get(prd.MDM_Model_No__c + dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')'); } // CHAN-BBLAAP 插入保有设备明细时插入对应DN start boolean tempReturnFlg = infoH.ReturnMark == '1' ? true : false; DNdetail tempDNdetail = SetSADNDetails(infoH.DeliveryNote, tempReturnFlg, dnInfo, ast); Statu_Achievements_DN_details__c tempSADNdetail = DNdetailMap.get(tempDNdetail.DNd.DNProduct_Serial_No__c); if (tempSADNdetail != null ) { tempDNdetail.DND.id = tempSADNdetail.id; } UpsertDNdetailList.add(tempDNdetail); // CHAN-BBLAAP 插入保有设备明细时插入对应DN end } } if (UpsertDNList.size() > 0) { upsert UpsertDNList; } // key 为DN号(名字Name),value 为发货DN; Map upsertDNMap = new Map(); for (Statu_Achievements_DN__c tempSADN : UpsertDNList) { upsertDNMap.put(tempSADN.Name, tempSADN); } list upsertSADNdetailList = new list(); for (DNdetail tempDNd : upsertDNdetailList) { if (upsertDNMap.containskey(tempDNd.DeliveryNote)) { tempDNd.DNd.Statu_Achievements_DN__c = upsertDNMap.get(tempDNd.DeliveryNote).id; tempDNd.DNd.Statu_Achievements__c = upsertDNMap.get(tempDNd.DeliveryNote).Statu_Achievements__c; upsertSADNdetailList.add(tempDNd.DNd); } } if (upsertSADNdetailList.size() > 0) { upsert upsertSADNdetailList; } } catch (Exception ex) { Database.rollback(sp); emailMessages.add(batch.id + ': ' + ex.getMessage()); } } global void finish(Database.BatchableContext BC) { BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Is_Error__c = 0; iflog.Log__c = 'UpdateNFM110 start1\n'; for (String str : emailMessages) { iflog.Log__c += str + '\n'; } if (iflog.Log__c.length() > 131060) { iflog.Log__c = iflog.Log__c.substring(0, 131072); iflog.Log__c += ' ...have more lines...'; } iflog.Log__c += '\nend'; insert iflog; } //public transient static List orderoutIdList; public transient static List orderReturnIdList; // Integer batchsize = 200; 考量する必要がないと思います。 global class ProductsDeliveryRest { public ProductsDelivery ProductsDelivery; } global class ProductsDelivery { public NFMUtil.Monitoring Monitoring; public GeneralData[] GeneralData; } global class GeneralData { public String SoNo; public String InquiryNo; public String ReturnMark; public String DeliveryDate; public String EndUserNo; public String DepartmentNo; public String DeliveryNote; public DnInformation[] DnInformation; } global class DnInformation { public String OTCode; public String VALUE; public String SerialNoorLotNo; public String SorLMark; public String GuaranteePeriod; // 期限——》年限 2019 0719 // 多年保修价格 2019 0719 public String GuaranteePrice; // 多年保修 start public string GuaranteeType; public string MaintenancePrice; // no discount public string ServicePrice; public String ProvistonPeriod; // 计提年限 // 多年保修 end public String TracingCode; public String ValidTo; public String Barcode; //CHAN-BC53ZG start public string NetWorth; //CHAN-BC53ZG end //CHAN-BGYE7C LHJ Start public string NetWorthNoProviston; // 净值(不含计提) public string ProduceDate; // 生产日期 //CHAN-BGYE7C LHJ End } private class DNdetail { private string DeliveryNote; private Statu_Achievements_DN_details__c DNd; } // CHAN-AXQBDY: 传过来的机身号最后5位都是字母并且倒数6,7,8位是052, SFDC删除机身号的最后8位 private static String checkSerialNoorLotNo(String sn) { if (sn == null || sn == '' || sn.length() < 8) { return sn; } String regEx = '[a-zA-Z]'; Pattern pattern = Pattern.compile(regEx); boolean strCheck = true; boolean numCheck = true; for (Integer i = 0; i < 8; i++) { String s = sn.substring(sn.length() - i - 1, sn.length() - i); if (i < 5) { Matcher matcher = pattern.matcher(s); if (!matcher.matches()) { strCheck = false; break; } } else { if (i == 5) { if (s != '0') { numCheck = false; break; } } else if (i == 6) { if (s != '5') { numCheck = false; break; } } else if (i == 7) { if (s != '2') { numCheck = false; break; } } } } if (strCheck && numCheck) { return sn.substring(0, sn.length() - 8); } return sn; } // CHAN-BBLAAP 初始化DN start private static Statu_Achievements_DN__c SetSADN( Statu_Achievements_DN__c tempSADN, GeneralData infoH, Map boMap, Map oppMap) { tempSADN.SoNo_Raw__c = infoH.SoNo; tempSADN.InquiryNo_Raw__c = infoH.InquiryNo ; tempSADN.ReturnMark_Raw__c = infoH.ReturnMark ; tempSADN.DeliveryDate_Raw__c = infoH.DeliveryDate ; tempSADN.EndUserNo_Raw__c = infoH.EndUserNo ; tempSADN.DepartmentNo_Raw__c = infoH.DepartmentNo ; tempSADN.DeliveryNote_Raw__c = infoH.DeliveryNote ; tempSADN.name = infoH.DeliveryNote; tempSADN.ReturnMark__c = infoH.ReturnMark == '1' ? true : false; if (tempSADN.Statu_Achievements__c == null) { tempSADN.Statu_Achievements__c = boMap.get(infoH.SoNo); } tempSADN.DeliveryDate__c = NFMUtil.parseStr2Date(infoH.DeliveryDate); String[] Inquiry; if (infoH.InquiryNo != null && infoH.InquiryNo.contains(',')) { Inquiry = infoH.InquiryNo.split(','); if (oppMap.get(Inquiry[0]) != null) { tempSADN.Opportunity__c = oppMap.get(Inquiry[0]).id; } if (Inquiry.size() > 1) { tempSADN.Order_No__c = Inquiry[1]; } } return tempSADN; } private static DNdetail SetSADNDetails(string DNnumber, boolean returnFlg, DnInformation dnInfo, asset ast) { DNdetail tempDNdetail = new DNdetail(); Statu_Achievements_DN_details__c DNd = new Statu_Achievements_DN_details__c(); DNd.ShippedAmount_without_tax__c = String.isBlank(dnInfo.NetWorth) ? 0 : returnFlg == false ? Decimal.valueOf(dnInfo.NetWorth.trim()) : - Decimal.valueOf(dnInfo.NetWorth.trim()); DNd.ShippedAmount__c = String.isBlank(dnInfo.VALUE) ? 0 : returnFlg == false ? Decimal.valueOf(dnInfo.VALUE.trim()) : - Decimal.valueOf(dnInfo.VALUE.trim()); DNd.NetWorthNoProviston__c = String.isBlank(dnInfo.NetWorthNoProviston) ? 0 : returnFlg == false ? Decimal.valueOf(dnInfo.NetWorthNoProviston.trim()) : - Decimal.valueOf(dnInfo.NetWorthNoProviston.trim()); if (dnInfo.SorLMark == 'S') { DNd.SerialNumber__c = dnInfo.SerialNoorLotNo; } else { DNd.SerialNumber__c = dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')'; } DNd.Product_Serial_No__c = dnInfo.OTCode + ':' + DNd.SerialNumber__c; DNd.DNProduct_Serial_No__c = DNnumber + ':' + DNd.Product_Serial_No__c; DNd.Barcode_Raw__c = dnInfo.Barcode; DNd.OTCode_Raw__c = dnInfo.OTCode; DNd.Qty_Raw__c = dnInfo.VALUE; DNd.SerialNoorLotNo_Raw__c = dnInfo.SerialNoorLotNo; DNd.SorLMark_Raw__c = dnInfo.SorLMark; DNd.GuaranteePeriod_Raw__c = dnInfo.GuaranteePeriod; DNd.TracingCode_Raw__c = dnInfo.TracingCode; DNd.ValidTo_Raw__c = dnInfo.ValidTo; DNd.NetWorth_Raw__c = dnInfo.NetWorth; DNd.GuaranteePrice_Raw__c = dnInfo.GuaranteePrice; DNd.GuaranteeType_Raw__c = dnInfo.GuaranteeType; DNd.MaintenancePrice_Raw__c = dnInfo.MaintenancePrice; DNd.NetWorthNoProviston_Raw__c = dnInfo.NetWorthNoProviston; DNd.ProduceDate_Raw__c = dnInfo.ProduceDate; DNd.ProvistonPeriod_Raw__c = dnInfo.ProvistonPeriod; DNd.ServicePrice_Raw__c = dnInfo.ServicePrice; DNd.VALUE_Raw__c = dnInfo.VALUE; DNd.NetWorth_Raw__c = dnInfo.NetWorth; tempDNdetail.DeliveryNote = DNnumber; tempDNdetail.DNd = DNd; if (ast != null && ast.id != null) { tempDNdetail.DNd.asset__c = ast.id; } return tempDNdetail; } // CHAN-BBLAAP 初始化DN end @TestVisible private void testclass() { 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++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } }