public with sharing class ProductLimitController {
    public static String contractId { get; set; }
    public static String plrId { get; set; }
    public static Boolean isEdit { get ; set;}
    public static Boolean canEdit { get; set;}
    public static List<Product2Info> productInfoListview { get; set; }
    public static Account contract { get; set; }
    public static Integer productRecoedsCount { get; set; }
    public static String alertMessage {set;get;}
    //page
    public static Integer pagesize{get; set;} 
    public static Integer totalcount{get; set;} 
    public static Integer pagecount{get; set;} 
    public static Integer currentpage{get; set;} 
    public static Boolean hasPrevious{get; set;}
    public static Boolean hasNext{get; set;}
    //1-5分类选项
    public static String keyword { get; set; }
    public static String category1 { get; set; }
    public static String category2 { get; set; }
    public static String category3 { get; set; }
    public static String category4 { get; set; }
    public static List<CusOption> category1OptionList{get;set;}
    public static List<CusOption> category2OptionList{get;set;}
    public static List<CusOption> category3OptionList{get;set;}
    public static List<CusOption> category4OptionList{get;set;}

    public static List<ProductCategory> productCategoryList{get;set;}

    //页面初始化
    @AuraEnabled
    public static Result init(String contractIdPara, String plrIdPara){
        Result result = new Result();
        isEdit = false;
        contractId = contractIdPara;
        plrId = plrIdPara;
        canEdit = true;
        String recordTypeName = '';
        if(plrId != null && plrId != ''){
            isEdit = true;
        }
        try{
            //获取经销商信息
            if(!isEdit){
                contract = [SELECT Id,Name,ParentId,Parent.Management_Code__c,Parent.Name,ET_SP_Dealer__c,ENG_Dealer__c FROM Account WHERE Id = :contractId];
            }
            //初始化第一分类
            initCategory();
            //展示的产品
            List<Product2Info> productInfoList = new List<Product2Info>();
            //新建页面或者编辑页面进入时，初始化内容也不同
            if (isEdit) {
                //根据状态判断是否可编辑
                ProductLimitRelation__c plr = [SELECT Id,Status__c,Agency_Contract__c,RecordType.DeveloperName FROM ProductLimitRelation__c WHERE Id = :plrId];
                recordTypeName = plr.RecordType.DeveloperName;
                contract = [SELECT Id,Name,ParentId,Parent.Management_Code__c,Parent.Name,ET_SP_Dealer__c,ENG_Dealer__c FROM Account WHERE Id = :plr.Agency_Contract__c];
                if(plr.Status__c == '申请中' ||  plr.Status__c == '批准'){
                    canEdit = false;
                }
                //编辑
                List<ProductLimitRelationDetail__c> plrDetailList = [SELECT Product__c,ProductLimitRelation__c,Category1__c,Category2__c,Category3__c,Category4__c FROM ProductLimitRelationDetail__c WHERE ProductLimitRelation__c = :plrId];
                if(plr.RecordType.DeveloperName == 'ProductDetail'){
                    List<String> proIdList = new List<String>();
                    for(ProductLimitRelationDetail__c plrDetail : plrDetailList){
                        proIdList.add(plrDetail.Product__c);
                    }
                    List<Product2__c> productList = [SELECT Id,OT_CODE__c,Name,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,Category5__c,SFDA_Status__c,Packing_list_manual__c FROM Product2__c WHERE Id IN :proIdList];
                    for(Product2__c pro : productList){
                        Product2Info proInfo = new Product2Info(pro);
                        proInfo.check = true;
                        productInfoList.add(proInfo);
                    }
                }else{
                    productCategoryList = new List<ProductCategory>();
                    for(ProductLimitRelationDetail__c plrDetail : plrDetailList){
                        ProductCategory pc = new ProductCategory();
                        pc.categoryOne = plrDetail.Category1__c;
                        pc.categoryTwo = plrDetail.Category2__c;
                        pc.categoryThree = plrDetail.Category3__c;
                        pc.categoryFour = plrDetail.Category4__c;
                        pc.recordKey = plrDetail.Category1__c+plrDetail.Category2__c+plrDetail.Category3__c+plrDetail.Category4__c;
                        productCategoryList.add(pc);
                    }
                    String soql = makeSoql();
                    System.debug('soql:'+soql);
                    List<Product2__c> product2Selected = Database.query(soql);
                    for (Integer i = 0; i < product2Selected.size(); i++) {
                        productInfoList.add(new Product2Info(product2Selected[i]));
                    }
                }
            }else{
                //新建
                productInfoList = searchAllProduct();
            }
            result.result = 'Success';
            result.canEdit = canEdit;
            result.isEdit = isEdit;
            result.category1OptionList = category1OptionList;
            result.category2OptionList = category2OptionList;
            result.category3OptionList = category3OptionList;
            result.category4OptionList = category4OptionList;
            result.contract = contract;
            result.proInfoList = productInfoList;
            result.productCategoryList = productCategoryList;
            result.recordTypeName = recordTypeName;
            return result;
        }catch (Exception e) {
            result.result = 'Fail';
            result.errorMsg = e.getStackTraceString();
            return result;
        }
    }

    //获取第1分类信息
    @AuraEnabled
    public static void initCategory(){
        AggregateResult[] categoryList = [SELECT Count(Id), Category1_text__c c1c FROM Product2__c GROUP BY Category1_text__c];
        category1OptionList = new List<CusOption>();
        category1OptionList.add(new CusOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c1c'));
            if(String.isNotBlank(deliverycnt)){
                category1OptionList.add(new CusOption(deliverycnt,deliverycnt));
            }
        }
        category2OptionList = new List<CusOption>();
        category2OptionList.add(new CusOption('', '--无--'));
        category3OptionList = new List<CusOption>();
        category3OptionList.add(new CusOption('', '--无--'));
        category4OptionList = new List<CusOption>();
        category4OptionList.add(new CusOption('', '--无--'));
    }

    //获取第2分类信息  
    @AuraEnabled
    public static Result category1Change(String category1Para) {
        Result result = new Result();
        category1 = category1Para;
        AggregateResult[] categoryList = [SELECT Count(id), Category2_text__c c2c FROM Product2__c WHERE Category1_text__c = :category1  GROUP BY Category2_text__c];
        category2OptionList = new List<CusOption>();
        category2OptionList.add(new CusOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c2c'));
            if(String.isNotBlank(deliverycnt)){
                category2OptionList.add(new CusOption(deliverycnt,deliverycnt));
            }
        }
        category3OptionList = new List<CusOption>();
        category3OptionList.add(new CusOption('', '--无--'));
        category4OptionList = new List<CusOption>();
        category4OptionList.add(new CusOption('', '--无--'));
        result.result = 'Success';
        result.category2OptionList = category2OptionList;
        result.category3OptionList = category3OptionList;
        result.category4OptionList = category4OptionList;
        return result;
    }

    //获取第3分类信息
    @AuraEnabled
    public static Result category2Change(String category1Para, String category2Para) {
        Result result = new Result();
        category1 = category1Para;
        category2 = category2Para;
        AggregateResult[] categoryList = [SELECT Count(id), Category3_text__c c3c FROM Product2__c WHERE Category1_text__c = :category1 AND Category2_text__c = :category2  GROUP BY Category3_text__c];
        category3OptionList = new List<CusOption>();
        category3OptionList.add(new CusOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c3c'));
            if(String.isNotBlank(deliverycnt)){
                category3OptionList.add(new CusOption(deliverycnt,deliverycnt));
            }
        }
        category4OptionList = new List<CusOption>();
        category4OptionList.add(new CusOption('', '--无--'));
        result.result = 'Success';
        result.category3OptionList = category3OptionList;
        result.category4OptionList = category4OptionList;
        return result;
    }

    //获取第4分类信息
    @AuraEnabled
    public static Result category3Change(String category1Para, String category2Para, String category3Para) {
        Result result = new Result();
        category1 = category1Para;
        category2 = category2Para;
        category3 = category3Para;
        AggregateResult[] categoryList = [SELECT Count(id), Category4_text__c c4c FROM Product2__c WHERE Category1_text__c = :category1 AND Category2_text__c = :category2 AND Category3_text__c = :category3  GROUP BY Category4_text__c];
        category4OptionList = new List<CusOption>();
        category4OptionList.add(new CusOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c4c'));
            if(String.isNotBlank(deliverycnt)){
                category4OptionList.add(new CusOption(deliverycnt,deliverycnt));
            }
        }
        result.result = 'Success';
        result.category4OptionList = category4OptionList;
        return result;
    }

    //保存
    @AuraEnabled
    public static Result save(String selectedRowsStr,Boolean isEditPara, String plrIdPara, String contractIdPara, String agencyIdPara, String categoryListJson, String applyTypePara) {
        Result result = new Result();
        isEdit = isEditPara;
        plrId = plrIdPara;
        contractId = contractIdPara;
        isEdit = isEditPara;
        List<String> checkedProdIdList;
        if(applyTypePara == 'ProductDetail'){
            checkedProdIdList = (List<String>)JSON.deserialize(selectedRowsStr, List<String>.class);
        }else{
            productCategoryList = (List<ProductCategory>)JSON.deserialize(categoryListJson, List<ProductCategory>.class);
        }
        //get recordtype id
        String recordTypeId = '';
        if(applyTypePara == 'ProductDetail'){
            recordTypeId = Schema.SObjectType.ProductLimitRelation__c.getRecordTypeInfosByDeveloperName().get('ProductDetail').getRecordTypeId();
        }else{
            recordTypeId = Schema.SObjectType.ProductLimitRelation__c.getRecordTypeInfosByDeveloperName().get('ProductSort').getRecordTypeId();
        }
        //保存
        ProductLimitRelation__c plr = new ProductLimitRelation__c();
        List<ProductLimitRelationDetail__c> plrDetailList = new List<ProductLimitRelationDetail__c>();
        Savepoint sp = Database.setSavepoint();
        try{
            //新增或修改产品限制申请
            if(isEdit){
                //修改时,删除该申请下的所有明细
                plr.Id = plrId;
                plr.Status__c = '草案中';
                update plr;
                List<ProductLimitRelationDetail__c> deletePlrDetailList = [SELECT Id FROM ProductLimitRelationDetail__c WHERE ProductLimitRelation__c = :plrId];
                delete deletePlrDetailList;
            }else {
                //新增时
                plr.recordTypeId = recordTypeId;
                plr.Agency_Contract__c = contractId;
                plr.Agency__c = agencyIdPara;
                plr.Status__c = '草案中';
                insert plr;
            }
            //新增产品限制申请明细
            if(applyTypePara == 'ProductDetail'){
                for(String proId : checkedProdIdList){
                    ProductLimitRelationDetail__c plrDetail = new ProductLimitRelationDetail__c();
                    plrDetail.ProductLimitRelation__c = plr.Id;
                    plrDetail.Product__c = proId;
                    plrDetailList.add(plrDetail);
                }
            }else{
                for(ProductCategory productCategory : productCategoryList){
                    ProductLimitRelationDetail__c plrDetail = new ProductLimitRelationDetail__c();
                    plrDetail.ProductLimitRelation__c = plr.Id;
                    plrDetail.Category1__c = productCategory.categoryOne;
                    plrDetail.Category2__c = productCategory.categoryTwo;
                    plrDetail.Category3__c = productCategory.categoryThree;
                    plrDetail.Category4__c = productCategory.categoryFour;
                    plrDetailList.add(plrDetail);
                }
            }
            insert plrDetailList;
        }catch(Exception e){
            Database.rollback(sp);
            result.result = 'Fail';
            result.errorMsg = e.getStackTraceString();
            return result;
        }
        result.result = 'Success';
        result.url = '/'+plr.Id;
        return result;
    }

    //获取所有产品
    public static List<Product2Info> searchAllProduct(){
        //所有的产品
        String soql = makeSoql();
        List<Product2__c> allProduct2 = Database.query(soql);
        List<Product2Info> allProductList = new List<Product2Info>();
        for (Integer i = 0; i < allProduct2.size(); i++) {
            allProductList.add(new Product2Info(allProduct2[i]));
        }
        return allProductList;
    }
    
    //检索产品
    @AuraEnabled
    public static Result searchProduct(String category1Para,String category2Para,String category3Para,String category4Para,String keywordPara,String selectedRowsStr,String contractPara) {
        Result result = new Result();
        category1 = category1Para;
        category2 = category2Para;
        category3 = category3Para;
        category4 = category4Para;
        keyword = keywordPara;
        List<String> checkedProdIdList = (List<String>)JSON.deserialize(selectedRowsStr, List<String>.class);
        contract = (Account)JSON.deserialize(contractPara, Account.class);
        List<Product2Info> productInfoList = new List<Product2Info>();
        //检索产品
        String soql = makeSoql();
        List<Product2__c> product2Selected = Database.query(soql);
        for (Integer i = 0; i < product2Selected.size(); i++) {
            productInfoList.add(new Product2Info(product2Selected[i]));
        }
        //获取选中的产品
        List<Product2__c> checkedProList = new List<Product2__c>();
        List<Product2Info> tempInfoList = new List<Product2Info>();
        Map<Id,Product2Info> infoMap = new Map<Id,Product2Info>();
        if(checkedProdIdList != null && checkedProdIdList.size() > 0){
            checkedProList = [SELECT Id,Name,OT_CODE__c,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,Category5__c,SFDA_Status__c,Packing_list_manual__c FROM Product2__c
                WHERE Id IN :checkedProdIdList];
            for(Product2__c pro2 : checkedProList){
                Product2Info pro2Info = new Product2Info(pro2);
                pro2Info.check = true;
                tempInfoList.add(pro2Info);
                infoMap.put(pro2Info.pro.Id, pro2Info);  
            }
        }
        for(Product2Info prd : productInfoList){
            if (!infoMap.containsKey(prd.pro.Id)) {
                tempInfoList.add(prd);
            }
        }
        result.result = 'Success';
        result.proInfoList = tempInfoList;
        return result;
    }

    //根据当前选取的分类进行产品检索
    @AuraEnabled
    public static Result searchProductByCategoryList(String categoryListJson, String contractPara) {
        Result result = new Result();
        productCategoryList = (List<ProductCategory>)JSON.deserialize(categoryListJson, List<ProductCategory>.class);
        contract = (Account)JSON.deserialize(contractPara, Account.class);
        List<Product2Info> productInfoList = new List<Product2Info>();
        String soql = makeSoql();
        List<Product2__c> product2Selected = Database.query(soql);
        for (Integer i = 0; i < product2Selected.size(); i++) {
            productInfoList.add(new Product2Info(product2Selected[i]));
        }
        result.result = 'Success';
        result.proInfoList = productInfoList;
        return result;
    }

    //拼接产品查询sql
    public static String makeSoql(){
        String soql = 'SELECT Id,OT_CODE__c,Name,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,';
        soql += ' SFDA_Status__c,Packing_list_manual__c FROM Product2__c WHERE Estimation_Entry_Possibility__c = \'○\'';
        if(String.isNotBlank(category1)){
            soql += ' AND Category1__c = \'' +  category1 + '\'';
        }
        if(String.isNotBlank(category2)){
            soql += ' AND Category2__c = \'' +  category2 + '\'';
        }
        if(String.isNotBlank(category3)){
            soql += ' AND Category3__c = \'' +  category3 + '\'';
        }
        if(String.isNotBlank(category4)){
            soql += ' AND Category4__c = \'' +  category4 + '\'';
        }
        if(String.isNotBlank(keyword)){
            soql += ' AND ( Name__c like \'%' + String.escapeSingleQuotes(keyword.replaceAll('%', '\\%')) + '%\'';
            soql += ' OR OT_CODE__c like \'%' + String.escapeSingleQuotes(keyword.replaceAll('%', '\\%')) + '%\' )';
        }
        if(productCategoryList != null && productCategoryList.size() > 0){
            soql += ' AND (';
            for(Integer i = 0; i < productCategoryList.size(); i++){
                ProductCategory productCategory = productCategoryList[i];
                if(i == 0){
                    soql += ' ( ';
                }else{
                    soql += ' OR ( ';
                }
                if(String.isNotBlank(productCategory.categoryOne)){
                    soql += ' Category1__c =  \'' + productCategory.categoryOne + '\'';
                }
                if(String.isNotBlank(productCategory.categoryTwo)){
                    soql += ' AND Category2__c =  \'' + productCategory.categoryTwo + '\'';
                }
                if(String.isNotBlank(productCategory.categoryThree)){
                    soql += ' AND Category3__c =  \'' + productCategory.categoryThree + '\'';
                }
                if(String.isNotBlank(productCategory.categoryFour)){
                    soql += ' AND Category4__c =  \'' + productCategory.categoryFour + '\'';
                }
                soql += ' ) ';
            }
            soql += ' ) ';
        }
        if (contract.ET_SP_Dealer__c) {
            soql += ' AND Pro2_Dealer_Object__c = true ';
        }
        if (contract.ENG_Dealer__c) {
            soql += ' AND Pro2_Dealer_ENG__c = true ';
        }
        soql += ' ORDER BY Name__c ';
        return soql;
    }

    //读取CSV文件
    @AuraEnabled
    public static Result readCsvFile(String base64Data) {
        Result result = new Result();
        base64Data = EncodingUtil.urlDecode(base64Data, 'UTF-8');
        Blob csvFileBody = EncodingUtil.base64Decode(base64Data);
        String csvAsString = csvFileBody.toString();
        List<ContrctAndProRelation> carrList = new List<ContrctAndProRelation>();
        List<String> warningMsgList = new List<String>();
        String note = '';
        try{
            String[] csvFileLines = csvAsString.split('\n');
            Map<String,Set<String>> csvContentMap = new Map<String,Set<String>>();
            Set<String> contractSet = new Set<String>();
            Set<String> productSet = new Set<String>();
            Set<String> keySet = new Set<String>();
            for(Integer i = 1; i < csvFileLines.size(); i++){
                String[] crrentLine = csvFileLines[i].split(',');
                contractSet.add(crrentLine[0]);
                productSet.add(crrentLine[1]);
                keySet.add(crrentLine[0]+','+crrentLine[1]);
            }
            //查询合同和产品
            List<Account> contractList = [SELECT Id,Name,ParentId,Parent.Management_Code__c,Parent.Name,ET_SP_Dealer__c,ENG_Dealer__c,Term_Contract_No__c FROM Account WHERE Term_Contract_No__c IN :contractSet];
            List<Product2__c> productList = [SELECT Id,Name,OT_CODE__c,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,Category5__c,SFDA_Status__c,Packing_list_manual__c,Pro2_Dealer_Object__c,Pro2_Dealer_ENG__c FROM Product2__c WHERE OT_CODE__c IN :productSet];
            //判断数量是否匹配
            if(contractSet.size() != contractList.size()){
                for(String conNo : contractSet){
                    Integer count = 0;
                    for(Account contract : contractList){
                        if(conNo == contract.Term_Contract_No__c){
                            count++;
                        }
                    }
                    if(count == 0){
                        warningMsgList.add('根据本期协议号为：'+conNo+',无法找到对应的契约。');
                    }
                }
            }
            if(productSet.size() != productList.size()){
                for(String otCode : productSet){
                    Integer count = 0;
                    for(Product2__c pro : productList){
                        if(otCode == pro.OT_CODE__c){
                            count++;
                        }
                    }
                    if(count == 0){
                        warningMsgList.add('根据OT Code为：'+otCode+',无法找到对应的产品。');
                    }
                }
            }
            for(Account acc : contractList){
                for(Product2__c pro : productList){
                    String key = acc.Term_Contract_No__c + ',' + pro.OT_CODE__c;
                    if(keySet.contains(key)){
                        //判断经销商和产品的ET和ENG类型是否匹配
                        String accType = '';
                        String proType = '';
                        if(acc.ET_SP_Dealer__c){
                            accType = 'ET';
                        }
                        if(acc.ENG_Dealer__c){
                            accType = 'ENG';
                        }
                        if(pro.Pro2_Dealer_Object__c){
                            proType = 'ET';
                        }
                        if(pro.Pro2_Dealer_ENG__c){
                            proType = 'ENG';
                        }
                        if(accType == proType){
                            ContrctAndProRelation carr = new ContrctAndProRelation();
                            carr.contract = acc;
                            carr.product = pro;
                            carrList.add(carr);
                        }else{
                            warningMsgList.add('OT Code为'+pro.OT_CODE__c+'对应的产品和本期协议号为'+acc.Term_Contract_No__c+'对应的契约不匹配。');
                        }
                    }
                }
            }
            Integer totalNum = csvFileLines.size() - 1;
            Integer successNum = carrList.size();
            note = '读取成功'+successNum+'条数据，读取失败'+(totalNum-successNum)+'条数据';
            result.warningMsgList = warningMsgList;
            result.note = note;
            result.result = 'Success';
            result.carrList = carrList;
        }catch(Exception e){
            result.result = 'Fail';
            result.errorMsg = e.getStackTraceString();
            return result;
        }
        return result;
    }

    //批量导入保存
    @AuraEnabled
    public static Result importSave(String carrListPara){
        Result result = new Result();
        List<ContrctAndProRelation> carrList = (List<ContrctAndProRelation>)JSON.deserialize(carrListPara, List<ContrctAndProRelation>.class);
        Map<String,List<String>> carrMap = new Map<String,List<String>>();
        Map<String,String> conMap = new Map<String,String>();
        for(ContrctAndProRelation carr : carrList){
            conMap.put(carr.contract.Id,carr.contract.ParentId);
            if(carrMap.containsKey(carr.contract.Id)){
                carrMap.get(carr.contract.Id).add(carr.product.Id);
            }else{
                List<String> proIdList = new List<String>();
                proIdList.add(carr.product.Id);
                carrMap.put(carr.contract.Id,proIdList);
            }
        }
        List<String> plrIdList = new List<String>();
        List<ProductLimitRelation__c> plrList = new List<ProductLimitRelation__c>();
        List<ProductLimitRelationDetail__c> plrDetailList = new List<ProductLimitRelationDetail__c>();
        Savepoint sp = Database.setSavepoint();
        try{
            String recordTypeId = Schema.SObjectType.ProductLimitRelation__c.getRecordTypeInfosByDeveloperName().get('ProductDetail').getRecordTypeId();
            for(String conId : carrMap.keySet()){
                ProductLimitRelation__c plr = new ProductLimitRelation__c();
                plr.Agency_Contract__c = conId;
                plr.Agency__c = conMap.get(conId);
                plr.Status__c = '草案中';
                plr.recordTypeId = recordTypeId;
                insert plr;
                plrIdList.add(plr.Id);
                for(String proId : carrMap.get(conId)){
                    ProductLimitRelationDetail__c plrDetail = new ProductLimitRelationDetail__c();
                    plrDetail.ProductLimitRelation__c = plr.Id;
                    plrDetail.Product__c = proId;
                    plrDetailList.add(plrDetail);
                }
            }
            insert plrDetailList;
            plrList = [SELECT Id,Name,Agency_Contract__r.Name,Status__c FROM ProductLimitRelation__c WHERE Id IN :plrIdList];
        }catch(Exception e){
            Database.rollback(sp);
            result.result = 'Fail';
            result.errorMsg = e.getStackTraceString();
            return result;
        }
        result.result = 'Success';
        result.plrList = plrList;
        return result;
    }

    class Product2Info implements Comparable {
        @AuraEnabled
        public Boolean check { get; set; }
        @AuraEnabled
        public Boolean orderby { get; set; }
        @AuraEnabled
        public Product2__c pro { get; set; }

        public Product2Info(Product2__c e) {
            check = false;
            pro = e;
            orderby = false;
        }

        public Integer compareTo(Object compareTo) {
            Product2Info compareToesd =(Product2Info)compareTo;
            Integer returnValue = 0;
            if(check == true){
                returnValue = -1;
            }else{
                if (orderby == true){
                    returnValue = -1;
                }else{
                    returnValue = 1;
                }
            }
            return returnValue;
        }
    }

    public class Result {
        @AuraEnabled
        public String result;
        @AuraEnabled
        public String errorMsg;
        @AuraEnabled
        public List<Product2Info> proInfoList;
        @AuraEnabled
        public List<CusOption> category1OptionList;
        @AuraEnabled
        public List<CusOption> category2OptionList;
        @AuraEnabled
        public List<CusOption> category3OptionList;
        @AuraEnabled
        public List<CusOption> category4OptionList;
        @AuraEnabled
        public Account contract;                          
        @AuraEnabled
        public Boolean isEdit;
        @AuraEnabled
        public Boolean canEdit;
        @AuraEnabled
        public String url;
        @AuraEnabled
        public List<ContrctAndProRelation> carrList;
        @AuraEnabled
        public List<ProductLimitRelation__c> plrList;
        @AuraEnabled
        public String note;
        @AuraEnabled
        public List<String> warningMsgList;
        @AuraEnabled
        public List<ProductCategory> productCategoryList;
        @AuraEnabled
        public String recordTypeName;
    }

    public class CusOption {
        CusOption(String value, String label) {
            this.label = label;
            this.value = value;
        }

        @AuraEnabled
        public String label;
        @AuraEnabled
        public String value;
    }

    public class ContrctAndProRelation {
        @AuraEnabled
        public Account contract;
        @AuraEnabled
        public Product2__c product;
    }

    public class ProductCategory {
        @AuraEnabled
        public String categoryOne;
        @AuraEnabled
        public String categoryTwo;
        @AuraEnabled
        public String categoryThree;
        @AuraEnabled
        public String categoryFour;
        @AuraEnabled
        public String recordKey;
    }

    public static void test(){
        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++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}