Ver código fonte

诊断的过滤,归一和排序

kwzbigdata 5 anos atrás
pai
commit
5d67740ba7

+ 1 - 0
common-push/pom.xml

@@ -23,6 +23,7 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
+
     </dependencies>
 
     <build>

+ 412 - 9
common-push/src/main/java/org/diagbot/common/push/filter/ClassifyDiag.java

@@ -1,21 +1,51 @@
 package org.diagbot.common.push.filter;
 
 import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
 import org.diagbot.common.work.FeatureRate;
 import org.diagbot.common.work.ResponseData;
 import org.diagbot.graph.util.CacheUtil;
 
+import java.text.DecimalFormat;
 import java.util.*;
+import java.util.stream.Stream;
 
 /**
  * Created by kwz on 2019/8/5.
  */
 public class ClassifyDiag {
+    Map<String, String>  diagDepartCache     = CacheUtil.getDiagDepartCache();
+    //get diagClassifyCache
+    Map<String, String>  diagClassifyCache   = CacheUtil.getDiagClassifyCache();
+    //每个诊断所在的级别缓存
+    Map<String, Integer> diagClassifyJiCache = CacheUtil.getDiagClassifyJiCache();
+
     public static void main(String[] args) {
-        Map<String, String> diagClassifyCache = CacheUtil.getDiagClassifyCache();
-        for(Map.Entry<String,String>d:diagClassifyCache.entrySet()){
-            System.out.println(d.getKey()+"\t"+d.getValue());
+
+        List<String> disList = new LinkedList<>();
+        String[] disArray = {"急性胰腺炎","冠心病","急性冠状动脉综合征","急性非ST段抬高型心肌梗死","急性ST段抬高型心肌梗死"
+        ,"三度房室传导阻滞","心力衰竭","急性心力衰竭"};
+         disList = Arrays.asList(disArray);
+        System.out.println("输入的诊断"+disList);
+        List<FeatureRate> inintFeature = new ArrayList<>();
+        Double inintNumber = 0.95;
+        String rate = "";
+        for (String dis:disList) {
+            FeatureRate featureRate = new FeatureRate();
+            featureRate.setFeatureName(dis);
+            inintNumber = inintNumber - 0.1;
+            rate = String.valueOf(inintNumber);
+            featureRate.setRate(rate);
+            inintFeature.add(featureRate);
+        }
+
+        ClassifyDiag classifyDiag = new ClassifyDiag();
+        List<FeatureRate> classify = classifyDiag.diagClassify(inintFeature);
+        System.out.println("hao hai you");
+        for (FeatureRate d:classify) {
+            System.out.println(d.getFeatureName()+"\t"+d.getRate()+"\t"+d.getExtraProperty());
         }
+
     }
 
     /**
@@ -37,9 +67,6 @@ public class ClassifyDiag {
         return updateFeatures;
     }
 
-    //get diagClassifyCache
-    Map<String, String> diagClassifyCache = CacheUtil.getDiagClassifyCache();
-
     /**
      * 诊断归一
      * @param updateFeatures 归一前的诊断
@@ -71,15 +98,391 @@ public class ClassifyDiag {
         //先把警惕的加进去
         if(highDiagList.size()>0){
             for(int j =0;j<updateFeatures.size();j++){
-                if(highDiagList.indexOf(updateFeatures.get(j).getFeatureName()) == 1){
-                    finalDiagList.add(updateFeatures.get(j));
+                FeatureRate featureRate = updateFeatures.get(j);
+                String featureName = featureRate.getFeatureName();
+                int i = highDiagList.indexOf(featureName);
+                if(i >= 0){
+                    finalDiagList.add(featureRate);
+                }
+            }
+        }
+        /**
+         * 这里处理一下可能诊断剔除的功能
+         * 如果图谱推出的诊断和可能诊断有层级关系,就把对应的可能诊断剔除
+         */
+        List<String> newBIgDiagList = this.removeKeng(queDiagList, bigDiagList);
+
+        if(queDiagList != null && queDiagList.size()>0){
+            //图谱归一
+            Set<String> queSet = this.diagProcess(queDiagList);
+            if(queSet != null && queSet.size()>0){
+                for (String queDis:queSet) {
+                    if(queDiagList.indexOf(queDis)>=0){ //可以找到,就取出来,用原来的
+                        FeatureRate feature = this.getFeature(updateFeatures, queDis);
+                        finalDiagList.add(feature);
+                    }else {
+                        FeatureRate featureRate = new FeatureRate();
+                        featureRate.setFeatureName(queDis);
+                        featureRate.setDesc("{\\\"确诊\\\":\\\"\\\"}");
+                        featureRate.setExtraProperty(diagDepartCache.get(queDis));
+                        featureRate.setSource("neo4j");
+                        finalDiagList.add(featureRate);
+                    }
                 }
             }
         }
-        //归一确诊
 
 
+        if(newBIgDiagList!= null && newBIgDiagList.size()>0){
+            //大数据的可能诊断归一和排序
+            List<FeatureRate> featureRates = this.sortFeatureList(newBIgDiagList, updateFeatures);
+            finalDiagList.addAll(featureRates);
+        }
+
         return finalDiagList;
 
     }
+
+    /**
+     * 诊断排序(诊断分为I类和II类,I类在前,II类在后,没有分类的诊断认为是I类)
+     * @param updateFeatureRates  //入参(通过过滤条件过滤后)
+     * @return
+     */
+    public List<FeatureRate> sortDiag(List<FeatureRate> updateFeatureRates){
+        Map<String, String> diagSortCache = CacheUtil.getDiagSortCache();
+        List<String> finalDiagList = new LinkedList<>();
+        List<String> neoDiagList = new LinkedList<>();
+        List<String> bigDataIDiagList = new LinkedList<>();
+        List<String> bigDataIIDiagList = new LinkedList<>();
+        List<FeatureRate> finalDiagFeature = new LinkedList<>();
+        if(updateFeatureRates != null || updateFeatureRates.size()>0){
+            for (FeatureRate feature:updateFeatureRates) {
+                String featureName = feature.getFeatureName();
+                String source = feature.getSource();
+                if("neo4j".equals(source)){
+                    neoDiagList.add(featureName);
+                }else {
+                    String s = diagSortCache.get(featureName);
+                    if(StringUtils.isNotEmpty(s)){
+                        if("Ⅰ".equals(s)){
+                            bigDataIDiagList.add(featureName);
+                        }else if("Ⅱ".equals(s)){
+                            bigDataIIDiagList.add(featureName);
+                        }
+                    }else {
+                        bigDataIDiagList.add(featureName);
+                    }
+                }
+            }
+        }
+        finalDiagList.addAll(neoDiagList);
+        finalDiagList.addAll(bigDataIDiagList);
+        finalDiagList.addAll(bigDataIIDiagList);
+        if(finalDiagList != null && finalDiagList.size()>0){
+            for (String diag:finalDiagList){
+                for (FeatureRate f:updateFeatureRates) {
+                    if(diag.equals(f.getFeatureName())){
+                        finalDiagFeature.add(f);
+                        break;
+                    }
+                }
+            }
+        }
+        return finalDiagFeature;
+    }
+
+    /**
+     * 去除可能诊断和确诊有关系的诊断
+     * @param queDiagList
+     * @param bigDiagList
+     * @return
+     */
+    public List<String> removeKeng(List<String> queDiagList,List<String> bigDiagList){
+        List<String> bigList = new ArrayList<>();
+        Set<String> queAll = new HashSet<>();
+        if(queDiagList.size()>0 && bigDiagList.size()>0){
+            for (String dis:queDiagList) {
+                String s = diagClassifyCache.get(dis);
+                if(s != null){
+                    queAll.add(s);
+                }
+                queAll.add(dis);
+                List<Object> key = this.getKey(diagClassifyCache, dis);
+                if(key != null && key.size()>0){
+                    for (Object o:key) {
+                        queAll.add(o.toString());
+                        List<Object> key1 = this.getKey(diagClassifyCache, o.toString());
+                        if(key1 !=null && key1.size()>0){
+                            for (Object o1:key1
+                                 ) {
+                                queAll.add(o1.toString());
+                            }
+                        }
+                    }
+
+                }
+
+            }
+        }
+        System.out.println(queAll);
+        String[] strings = queAll.stream().toArray(String[]::new);
+        if(bigDiagList != null && bigDiagList.size()>0){
+            for (String dis:bigDiagList) {
+                if(Arrays.asList(strings).indexOf(dis) == -1){
+                    bigList.add(dis);
+                }
+            }
+        }
+        return bigList;
+    }
+
+
+
+
+
+    /**
+     * 诊断归一和排序
+     * @param disList
+     * @return
+     */
+    public Set<String> diagProcess(List<String> disList){
+        Set<String> first = new HashSet<>();
+        Set<String> second= new HashSet<>();
+        Set<String> third= new HashSet<>();
+        Set<String> other= new HashSet<>();
+
+        /**
+         * 分级
+         * 初始化每个病出现的次数为0
+         */
+        Map<String, Integer> children_cnt = new HashMap<>();
+        for (String dis:disList) {
+            Integer ji = diagClassifyJiCache.get(dis);
+            if(ji != null){
+                if(1 == ji){
+                    first.add(dis);
+                    children_cnt.put(dis,0);
+                }else if(2 == ji){
+                    second.add(dis);
+                    children_cnt.put(dis,0);
+                }else if(3 == ji){
+                    third.add(dis);
+                    children_cnt.put(dis,0);
+                }
+            }else {
+                other.add(dis);
+            }
+        }
+        /**
+         * 从孙子找父亲,根据父亲找爷爷
+         */
+        if(third != null && third.size()>0){
+            for (String dis:third) {
+                String s = diagClassifyCache.get(dis);
+                Integer count = children_cnt.get(s);
+                if(s != null){
+                    children_cnt.put(s,(count == null)?1:count+1);
+                    second.add(s);
+                }
+
+            }
+        }
+
+        if(second != null && second.size()>0){
+            for (String dis:second) {
+                String s = diagClassifyCache.get(dis);
+                Integer count = children_cnt.get(s);
+                if(s != null){
+                    children_cnt.put(s,(count == null)?1:count+1);
+                    first.add(s);
+                }
+            }
+        }
+        List<String> pushDiag = new ArrayList<>();
+        //从顶级往下级依次看
+        for (String dis:first) {
+            Integer count = children_cnt.get(dis);
+            if(count == 0){
+                pushDiag.add(dis);
+            }else if(count == 1){
+                List<Object> key = this.getKey(diagClassifyCache, dis);
+                for (String diss:second) {
+                    Integer c2 = children_cnt.get(diss);
+                    if(key.contains(diss)){
+                        if(c2 == 0){
+                            pushDiag.add(diss);
+                        }else if(c2 == 1){
+                            List<Object> key1 = this.getKey(diagClassifyCache, diss);
+                            for (String disss:third) {
+                                if(key1.contains(disss)){
+                                    pushDiag.add(disss);
+                                }
+                            }
+                        }else if(c2 >1){
+                            pushDiag.add(diss);
+                        }
+                    }
+
+                }
+            }else if(count >1){
+                pushDiag.add(dis);
+            }
+
+        }
+        pushDiag.addAll(other); //归一后的
+
+        Set<String> finalList = new LinkedHashSet<>();
+        Map<String,String> disRate = new HashMap<>();//诊断-->百分比
+        for (String dis:disList) {
+            int i = pushDiag.indexOf(dis);
+            if(i >= 0){
+                finalList.add(dis);
+
+            }else {
+                List<Object> testList= new ArrayList<>();
+                String s = diagClassifyCache.get(dis);
+                if(StringUtils.isNotEmpty(s)){
+                    testList.add(s);
+                }
+                List<Object> key = this.getKey(diagClassifyCache, dis);
+                boolean b = testList.addAll(key);
+                for (Object dis1:testList) {
+                    if(pushDiag.indexOf(dis1)>=0){
+                        finalList.add(dis1.toString());
+
+                    }
+                }
+            }
+        }
+        return finalList;
+
+    }
+
+    /**
+     * 根据rate排序
+     * @param diss 大数据可能诊断列表
+     * @param updates 所有推送的诊断
+     * @return 排好序并且归一的可能诊断列表
+     */
+    public List<FeatureRate> sortFeatureList(List<String> diss,List<FeatureRate> updates){
+        DecimalFormat df = new DecimalFormat("0.####");
+       List<FeatureRate> sortFeatures = new LinkedList<>();
+        Set<String> strings = this.diagProcess(diss);
+
+        Map<String,Double> disRate = new HashMap<>();
+        //归一确诊
+        if(diss!= null &&diss.size()>0){
+            //归一后的确诊(图谱出来的)
+
+            if(strings != null && strings.size()>0){
+                for (String queDis:strings) {
+                    List<Object> testCollect = new ArrayList<>();
+//                    FeatureRate feature = classifyDiag.getFeature(inintFeature, queDis);
+                    //如果能找到就把相关联的rate加起来
+                    testCollect.add(queDis);
+
+                    String s = diagClassifyCache.get(queDis);
+                    if(s != null){
+                        testCollect.add(s);
+                    }
+                    List<Object> key = this.getKey(diagClassifyCache, queDis);
+                    testCollect.addAll(key);
+                    Double count = 0.0;
+                    for (String dis:diss) {
+                        if(testCollect.indexOf(dis) >= 0){
+                            FeatureRate feature1 = this.getFeature(updates, dis);
+                            String rate1 = feature1.getRate();
+                            count = count+Double.parseDouble(rate1);
+                        }
+                    }
+                    disRate.put(queDis,count);
+                }
+            }
+
+        }
+        //根据rate排序
+        List<Map.Entry<String,Double>> list = new ArrayList<>(disRate.entrySet());
+        Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
+            @Override
+            public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
+                return o2.getValue().compareTo(o1.getValue());
+            }
+        });
+        for (Map.Entry<String,Double> s:list) {
+            System.out.println(s.getKey()+"\t"+s.getValue());
+            FeatureRate featureRate = new FeatureRate();
+            featureRate.setRate(df.format(s.getValue()));
+            featureRate.setFeatureName(s.getKey());
+            featureRate.setExtraProperty(diagDepartCache.get(s.getKey()));
+            sortFeatures.add(featureRate);
+        }
+
+        return sortFeatures;
+    }
+
+    /**
+     * 根据诊断名找到这个feature
+     * @param updateFeatures
+     * @param disName
+     * @return
+     */
+    public FeatureRate getFeature(List<FeatureRate> updateFeatures,String disName){
+        FeatureRate f = new FeatureRate();
+        for (FeatureRate fe:updateFeatures){
+            if(disName.equals(fe.getFeatureName())){
+                f = fe;
+            }
+        }
+        return f;
+    }
+
+    /**
+     * dis找大类
+     * @param inputs
+     * @return
+     */
+    public List<String> getDisList(List<String> inputs){
+        List<String> newDiagList = new ArrayList<>();
+        if(inputs!= null && inputs.size()>0){
+            for (String dis:inputs) {
+                String s = diagClassifyCache.get(dis);
+                if(StringUtils.isNotEmpty(s)){
+                    newDiagList.add(s);
+                }else {
+                    newDiagList.add(dis);
+                }
+
+            }
+        }
+        return newDiagList;
+    }
+
+    /**
+     * 统计列表中每个字符出现的次数
+     * @param inputs 输入列表
+     * @return
+     */
+    public Map<String,Integer> fildCount(List<String> inputs){
+        Map<String,Integer> map = new HashMap<>();
+        for (String dis:inputs) {
+            Integer count = map.get(dis);
+            map.put(dis,(count == null)?1:count+1);
+        }
+        return map;
+    }
+
+    public List<Object>  getKey(Map map, Object value){
+        Set set = map.entrySet(); //通过entrySet()方法把map中的每个键值对变成对应成Set集合中的一个对象
+        Iterator<Map.Entry<Object, Object>> iterator = set.iterator();
+        List<Object> arrayList = new ArrayList();
+        while(iterator.hasNext()){
+            //Map.Entry是一种类型,指向map中的一个键值对组成的对象
+            Map.Entry<Object, Object> entry = iterator.next();
+            if(entry.getValue().equals(value)){
+                arrayList.add(entry.getKey());
+            }
+        }
+        return arrayList;
+    }
+
 }

+ 1 - 0
graph-web/src/main/java/org/diagbot/graphWeb/work/FilterSortDiag.java

@@ -15,6 +15,7 @@ import java.util.*;
  */
 public class FilterSortDiag {
     Logger logger = LoggerFactory.getLogger(FilterSortDiag.class);
+
     /**
      * 过滤诊断
      */

+ 1 - 2
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -65,8 +65,7 @@ public class GraphCalculate {
         logger.info("从分词系统接收到的词 :" + ss);
         System.out.println("Participle takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
 
-        String[] featureTypes = searchData.getFeatureType().split(",");
-        List<String> featureTypeList = Arrays.asList(featureTypes);
+        List<String> featureTypeList = Arrays.asList(searchData.getFeatureTypes());
         logger.info("featureTypeList : " + featureTypeList);
         inputList.addAll(ss);
         if(neo4jAPI == null){

+ 54 - 9
graph/src/main/java/org/diagbot/graph/util/CacheUtil.java

@@ -3,7 +3,6 @@ package org.diagbot.graph.util;
 import org.apache.commons.lang3.StringUtils;
 import org.diagbot.nlp.participle.cfg.Configuration;
 import org.diagbot.nlp.participle.cfg.DefaultConfig;
-import org.neo4j.cypher.internal.frontend.v2_3.ast.Foreach;
 
 import java.util.HashMap;
 import java.util.List;
@@ -15,6 +14,54 @@ public class CacheUtil {
     public static Map<String,String> vitalMap=null;
     public static Map<String,String> disgSortMap=null;
     public static Map<String,String> diagClassifyMap = null;
+    public static Map<String,Integer> diagClassifyJiMap = null;
+    //诊断科室衍射
+    public static Map<String, String> doc_result_mapping_diag_map = null;
+
+    //疾病科室,获取缓存
+    public static Map<String,String> getDiagDepartCache(){
+        String path = "doc_result_mapping_diag.dict";
+        Configuration configuration = new DefaultConfig();
+        if(doc_result_mapping_diag_map == null){
+            doc_result_mapping_diag_map = new HashMap<>();
+            List<String> contentList = configuration.readFileContents(path);
+            for (String s:contentList) {
+                String[] splits = s.split("\\|");
+                doc_result_mapping_diag_map.put(splits[0],splits[1]);
+            }
+        }
+        return doc_result_mapping_diag_map;
+    }
+
+    //疾病分级解析,获取缓存
+    public static Map<String,Integer> getDiagClassifyJiCache(){
+        String path = "diagClassify.dict";
+        Configuration configuration = new DefaultConfig();
+        if(diagClassifyJiMap == null){
+            diagClassifyJiMap = new HashMap<>();
+            List<String> contentList = configuration.readFileContents(path);
+            String diagName =null,bigdiagName=null;
+            String[] diagSort =null;
+            for (String s:contentList) {
+                String[] splits = s.split("\\|");
+                if (splits.length >= 2) {
+                    diagName = splits[0].trim();//疾病本体
+                    bigdiagName = splits[1].trim();//疾病大类
+                    diagClassifyJiMap.put(bigdiagName, 2);
+                    diagClassifyJiMap.put(diagName,1);
+                    if (splits.length == 3) {
+                        diagSort = splits[2].split("\\、");
+                        for (String dis : diagSort) {
+                            if (StringUtils.isNotEmpty(dis.trim())) {
+                                diagClassifyJiMap.put(dis.trim(), 3);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return diagClassifyJiMap;
+    }
     //疾病归一解析,获取缓存
     public static Map<String,String> getDiagClassifyCache(){
         String path = "diagClassify.dict";
@@ -26,20 +73,18 @@ public class CacheUtil {
             String[] diagSort =null;
             for (String s:contentList) {
                 String[] splits = s.split("\\|");
-                if(splits.length >= 2){
+                if (splits.length >= 2) {
                     diagName = splits[0].trim();//疾病本体
                     bigdiagName = splits[1].trim();//疾病大类
-                    if(splits.length == 2){
-                        diagClassifyMap.put(bigdiagName,diagName);
-                    }else if(splits.length == 3){
+                    diagClassifyMap.put(bigdiagName, diagName);
+                    if (splits.length == 3) {
                         diagSort = splits[2].split("\\、");
-                        for (String dis:diagSort) {
-                            if(StringUtils.isNotEmpty(dis.trim())){
-                                diagClassifyMap.put(dis.trim(),bigdiagName);
+                        for (String dis : diagSort) {
+                            if (StringUtils.isNotEmpty(dis.trim())) {
+                                diagClassifyMap.put(dis.trim(), bigdiagName);
                             }
                         }
                     }
-
                 }
             }
         }

+ 61 - 0
graph/src/main/resources/diagClassify.dict

@@ -18,3 +18,64 @@ QY8HRySr7Iwnp75iBJ/Vj+3XaTjV4VFOlsI/pFsgIb0u2WJVxeidQQ==
 8+/D6NypjddUIm92l3iN1Uuc/0bs8CvPrxAz4u4zi3IpsfANTRsS4dsQ+5pETXBQ
 8+/D6NypjddUIm92l3iN1RMRyZFpCIgsrxAz4u4zi3IpsfANTRsS4dsQ+5pETXBQ
 8+/D6NypjddUIm92l3iN1YWxPHbyuaEKIuydduvnnjTfijPDjIJtLyQOE5CeChrCuipopyTOKsSI5/HVtv3JTB6mtWVDEwMM17fWhB9R3z3h5IIo8JsBGQ==
+kRGK26rRVysm9pMK7wBhWY2iGQ2rccVyPBQSiGlnxKE=
+kRGK26rRVyu7GwwTQ0WXNg46yEXvENcfIVOt7Mod6Ps5mxVKRDBSCg==
+kRGK26rRVysbQDyBW1xUyY2iGQ2rccVyPBQSiGlnxKE=
+2jobYaE9hqn8wIoqdezhvDzj8cdKEnQiQD7P1WAVSwE=
+2jobYaE9hqnnX/mA/TOQdzzj8cdKEnQiQD7P1WAVSwE=
+2jobYaE9hqnnO9xH0Ng8qDzj8cdKEnQiQD7P1WAVSwE=
+2jobYaE9hqkdrVgoS621cI2iGQ2rccVyQD7P1WAVSwE=
+R9zWPlPSlOpvMc6gf+vo7Efc1j5T0pTq3wJeT9uIdw05t9ci1V8G6Nw5/wmoKh/O5CMgpfNuLotH3NY+U9KU6oWv11PkPSA5s81M06l2LDO6wJm6v4silcFa8MKldzceUmuF4sVj1cJ/Jdns96y0KQ==
+R9zWPlPSlOop+RSWAxFgMUfc1j5T0pTqKfkUlgMRYDGhFIZjGCZUD7nsKOkjGOTnVS+ckNNMZizw7oZqIGR94V6Xsia9y8izND5C1/8FKOcgYT3Owlb7u7nsKOkjGOTneIBrCjmIqzU=
+IMHDeNUnTX3SlsLfTPun+tNTGLrlDClHlXCORo2NvvVMWLNz9VqNyoF8LbGqawR/o+AtTpkfT0fV2ph/NDZqdx9PJEtEyOk0Pyiqohw0HR5KYBGd+lGX+w==
+IMHDeNUnTX1u8/ancQDeY9NTGLrlDClHp8xbmibDDV4hZB/+Q/mDHohTLf8Zf1l0yGZD8NTwpOWFRcQAa4tQJ3X/rgUvMKpTs0PSXx3SYXQ=
+oRqu1B35G5r1/K/2KIYDNKfNXG7WEEJn702NvF+A5Xg5mxVKRDBSCg==
+oRqu1B35G5ogwCx/aPoyzbss9owqky3e702NvF+A5Xg5mxVKRDBSCg==
+oRqu1B35G5pqKPvVOJ6IDY6ePH8PSWuRjAZ7I7cMHAK73XHYC6Akpw==
+oRqu1B35G5rjlkbWMKMO6yDKFNAVOJBp702NvF+A5Xg5mxVKRDBSCg==
+VC7rkUAh+6IOJyqFdqvYFmjLG7423xrFESItu0JlyWy73XHYC6Akpw==
+VC7rkUAh+6IOJyqFdqvYFmHwQjShON9fhw48h4qdOM5KYBGd+lGX+w==
+VC7rkUAh+6IOJyqFdqvYFi/gyc0psbeQKR0EVmN5m61Rim+G22KkXKzLO3h9qz3/
+VC7rkUAh+6IOJyqFdqvYFmY/MQi6NG5NyZd8+R27AhUvph5mChmg9A==
+VC7rkUAh+6IOJyqFdqvYFhOHROczP9gSXVtBpnZT9jSWsjKN6/+kCA==
+VC7rkUAh+6IOJyqFdqvYFkadxTWJUjJdyAUIJrCEc/BKYBGd+lGX+w==
+VC7rkUAh+6IOJyqFdqvYFn+AbILNUy1H15zd/uzdHgu4+VkLqXY4pHscRNkoXg8TU6UFXXTaYukdes/JyFc0OX+PGO+FqW9GTXFiR5BKDCwCHXX318BY8w==
+8n8zV92Zv6l9KDxIQfEX1nZbyBjxZ5kKV/Hp2+gZRugZ2wSwovQtcSypSfvlaemr
+8n8zV92Zv6l9KDxIQfEX1gYGst0L0VxA+txv0nfiE8G7v2Ten8/zVKzLO3h9qz3/
+8n8zV92Zv6nu8xwJpBGB7iXzbbppK2Zs+txv0nfiE8F1Lzfp/5wLX6zLO3h9qz3/
+8n8zV92Zv6nu8xwJpBGB7qfcarVHiWLlnIJ40LYYnBZhG8ICDAGyzA==
+8n8zV92Zv6nu8xwJpBGB7n3e0abfH1gY+txv0nfiE8F1Lzfp/5wLX6zLO3h9qz3/
+lIV9YVV9QehYSuC/ANfdSTha8zxf3Hy7
+lIV9YVV9Qej64m/3BU/YLywD+mrUh5SymQWPqo/kQAvJ8Mk28bf8YWNK4ficpU19HZrzGFpPxwNTSceGqFwPgFflxwowVkH331fFGRCNymrCQD6zKKakDtiy4sQDGnt4qX1QP1Y2Xg1RFT0vSlnegD3cQA4BkkoHiZ50/t0z8Fnlob2Ye8rbnw==
+LAP6atSHlLIAuzNm8LfUwIa0FqldZgW45bV/y/cbl+A=
+LAP6atSHlLLt63zkPn/paYa0FqldZgW45bV/y/cbl+A=
+aoyMNdWOkHezBcuWAN69djha8zxf3Hy7
+lIV9YVV9QejkIyCl824uizha8zxf3Hy7
+LAP6atSHlLJw2EZUYZ9TOTha8zxf3Hy7
+LAP6atSHlLIqGEwAN87XepyzLvIGtX+Ol1M+9nQLrYQtpHqBV1Ei4WVeX46M4V00m0CcuRvPf+M=
+BklPGQplmWIXRKXy8T3Jw7Ni4V+oGfGr
+BklPGQplmWJrhbPpUhe2EArZxL5wy5xjb0zp3pbRbBgPSkwiuy+mJg==
+BklPGQplmWJ9tcg3DubQ+dNTGLrlDClHW2BQgfS2KKA=
+p9xqtUeJYuV763zk1n7SVFIPcgQwW0ctynkGSrhDIiOM60xJYFx0aQ==
+p9xqtUeJYuV763zk1n7SVPMvMCS4x4x/YiRu1ikKWf8Z2wSwovQtcRqv2V2sZD8x
+RDRqSmn8EECp5vSNnZ4Fp31H6jXXJjK2ht920Hnr08U=
+RDRqSmn8EEDnUswlzsbKMH1H6jXXJjK2ht920Hnr08U=
+RDRqSmn8EEARd2pG51aaHUQ0akpp/BBARZe8TU7WYyk=
+RDRqSmn8EEA0qE5jtnOUjH1H6jXXJjK2ht920Hnr08U=
+98gWtMm+tR625dg6mP2VTBRy4eqkKuM8Gavn/kkrqRE=
+98gWtMm+tR46By2e/5n/HhRy4eqkKuM82XJkOa9sRAG2GAYTx8FRgmG2db34U5XxuszESNIk33Clx351wwlsKK83lcSVJXQ9d1XUEvmLHidKYBGd+lGX+w==
+98gWtMm+tR6I6KaHZWPikBRy4eqkKuM8Gavn/kkrqRE=
+98gWtMm+tR4//yRAg62teBRy4eqkKuM8Gavn/kkrqRE=
+h381cyp+EIIktrquGmmwyM6srNo8HVLf
+Ss1fTwot0QhJWGMMdctgt86srNo8HVLf
+Ss1fTwot0QgPiXOCKP2zFM6srNo8HVLf
+8RfFan0pKMpvMc6gf+vo7PEXxWp9KSjKkAeuGME68RI=
+8RfFan0pKMop+RSWAxFgMfEXxWp9KSjKkAeuGME68RI=
+HoHtYSLcpapg4HdcdQdA3A+XWTgi8fuftWfOFeoJahFpwVFdsPOEkpg+d/HNBOcC8gqP/AVGyqdsq5QnV6lVQt4sQpkPgSzN
+HoHtYSLcpapyT1zqnSuFf1/0FM8ps6hPqcrbsmg5p84dJBcpwoJo/JFg8AHwKyJ0/ICc9j/VEAY=
+x9PLCfVsCr/aY475fTCHFGhMbsgdvFwEdAst9qQci0LWQamxDzw1E7qpIkwJx9YsGlVBbqLl3urSDDpehmH9129vfFiy9pH8kCx6xYUnv5FKYBGd+lGX+w==
+x9PLCfVsCr/aY475fTCHFPXiKHRRn5b1dAst9qQci0IbixSDt+/ibotub2c2nK7+hNNemi/HhvrIKGxpbjCvzM5Kw2EKXOmOZvQ0DrEA+9k=
+WEck0+cxgSIjbkhvE0jRPBw91EHpsWRO
+WEck0+cxgSIjbkhvE0jRPJTYEeFyhgm3JxzpZJtLMQNKYBGd+lGX+w==
+Liq4+z+iHBbQC3hom0PzAIso9V888m13KiDzJFJhabu03GZdWL8lkDx5HY77PTBpcNQEpTpRXla03GZdWL8lkET0g0IOo8TG
+Liq4+z+iHBYKw1llIDNuU5Qw++y19ijkrrOwRuaa87u03GZdWL8lkJbWROriztT4xcrxFBQsXlC03GZdWL8lkET0g0IOo8TG

+ 899 - 0
graph/src/main/resources/doc_result_mapping_diag.dict

@@ -0,0 +1,899 @@
+iWoXV4ISKfEEe8p5BEeGMXcP2fi9nVPgIVOt7Mod6Ptttw/uxcjHEZNGAwm1dTlh
+13BZUxQKtR8khcL82U/gR6xTxv6q3ER1T31+8tdUysA=
+13BZUxQKtR8Ee8p5BEeGMbPfb65AhyohrCW1qrlOrIXnCFVQR0+OhAr8ipqZuWdE
+13BZUxQKtR8Ee8p5BEeGMSgN76O6SVyHRQ5SX/rmfCbnCFVQR0+OhAr8ipqZuWdE
+13BZUxQKtR8Ee8p5BEeGMTGSeaWwHrO28DsYuNRP2xrzo/C7RYPhiQ==
+13BZUxQKtR8Ee8p5BEeGMfy0mrZa9NlMB+04xUYH/mDnCFVQR0+OhAr8ipqZuWdE
+13BZUxQKtR8Ee8p5BEeGMVDAaNQ6vkAnhf6kv3fA54PnCFVQR0+OhAr8ipqZuWdE
+13BZUxQKtR9x+KllafTRWVzBEC3KTBfP57Coq4ynowFKYBGd+lGX+w==
+UBb+CN3DpdXV4GVpSzaFCvOj8LtFg+GJ
+RwfaZMa+tcJkNVRINR3RaHpmvKAVeqCzRPB+qQ9rdKU=
+aExuyB28XAR0Cy32pByLQhO3DcTvO3TKaXBl6wZu5y0=
+Rq6VzCfzICn9+r0EMibpOfOj8LtFg+GJ
+tjTBHQOg4JZWgHE3Y5h4coemfMvU1eABfER6RG1klik=
+LPekO1Vw5kgU8eAB+2lgKlX9mMU2d4g0sKnW7jmERCH1rLaDeGOQwfOj8LtFg+GJ
+LPekO1Vw5khtd8WtUYdrl/znlgPCB6PWstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+iB2sYRaVfwL9+r0EMibpOfOj8LtFg+GJ
+XQT3SHWafIA+AOWtZC88XC+F4lgKG0ZK9Z7CDt8UKI/v3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
+GG71AOESABIJbTP+AlIFufOj8LtFg+GJ
+GOs/j0/PHelIkRc7oSI9szKnOEpdVQkO9RrMjQw02M5PfX7y11TKwA==
+GOs/j0/PHelIkRc7oSI9szlHsXZwP1nWl2UMsW6I5bP1rLaDeGOQwfOj8LtFg+GJ
+GOs/j0/PHelIkRc7oSI9s97P1cGs5sNK6P3MMb1JPeD1rLaDeGOQwfOj8LtFg+GJ
+GOs/j0/PHelIkRc7oSI9s94er8ZM74QIQtrkkMzshHxxqUIOvKQ/dwLm/EKxWl15
+cDwUoESXFL5MSclGunBL8q4kLpO4b0WCN5m+Gay4mDc=
+XTjWGwZLoH1auJLtJZplqtSXQVOsJCee52mHitj3oNVPfX7y11TKwA==
+is24Ye5iddmK0fcjJ8eyd1F5djzFc1mvfywvCjeRl/T0fQTyIpclWA==
+KbKku7ucQ39uoije31Jd6MgDR9Ol2aU1fER6RG1klik=
+XeNsCvsSABj/1Gi6u346QEpgEZ36UZf7
+u9VShjNiQLaEh57YJ81oCvOj8LtFg+GJ
+8eEwHEIyR3CEqKNFUcAAUEpgEZ36UZf7
+oRqu1B35G5r4prflBcOI/gfkmii5BuyZu7hkhPiE07E=
+oRqu1B35G5oQ+WWu+Cc9mPRovAvBdywmstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+0jJMm1O24VdIuBTSfWq8fz8zYxNh6qQehkzsWr2fJvRpwcfsxZv+X0iU8imBtrfgy4x6AQXguls=
+NhbO6gkLwqjse810KERveORV0q3Q8qjoy4x6AQXguls=
+NhbO6gkLwqh9giU0ougSyIemfMvU1eABfER6RG1klik=
+IOQii0cLb7Ss+U6SBrCCGp+9Oh29Slfk52mHitj3oNVPfX7y11TKwA==
+enu6avlk5YpYqoBsat2Ybx/ps2807HA2y4x6AQXguls=
+0sR5tvt5nTkiJp0gJWIG2B/ps2807HA2y4x6AQXguls=
+ike6hX0KY4854R3RmIhG3R/ps2807HA2y4x6AQXguls=
+DOXrtCrKcXSzbDHIoU2htR/ps2807HA2y4x6AQXguls=
+DOXrtCrKcXQc6kU7pH5cVR/ps2807HA2y4x6AQXguls=
+MzrnRYF60fg1zeORSYfFpEoPmHAI4936
+yWaySNFE8XgC0uinfuVoYjBrQoRmQwfSteq+RIooEghPfX7y11TKwA==
+MdIN8DMpaEBWgHE3Y5h4cvjGqlRxOSxuKSotK/v0yek=
+Oed05VhE/J8vZEYJ+Qgwo0oPmHAI4936
+95YPV7nX9j+yPJEuX5FlVfOj8LtFg+GJ
+BGL6SBJINCSqv45Aj5fuOh/ps2807HA2y4x6AQXguls=
+ZNQWeAaprLh+Mdl3Bm+eOB/ps2807HA2y4x6AQXguls=
+Ys4HY1VWiNz9qI/NdGuLvvjGqlRxOSxuKSotK/v0yek=
+E4hT7N3ytDu1bH4gSInujULj3Su8S5w3fywvCjeRl/S0FrgmK9pWPA==
+7mHfSs2ahWgivWPiUX9ug78AMGVXssqQKJZKOfgg6nHJOvnYyXNsXpC4iPbph9qG
+ltfmaY06UmH2YvmikroYRkv4Vh0daqQJrFPG/qrcRHVPfX7y11TKwA==
+xbg5pYjlVtXGgDHUkbi1wK7QEgPGBpLdgymuBa+h7SiRwhQGBKdSp/Oj8LtFg+GJ
+Zlo5WYcgZKpNiiBTZZbq1WJoTAS/DAZEoEfwk8+pyRbnsKirjKejAUpgEZ36UZf7
+vPPRWcr4YTeEfvwh8gqO7i9GjCJsfm4xPCHvXzw0mit1CazNTv2aYfOj8LtFg+GJ
+fHK6mvJmg/7/1Gi6u346QEpgEZ36UZf7
+qptm92sSB/VYvUmCs9IY3d7SGlS0JFuG
+qtlkwnn27ACw8mEQdSz4E/Oj8LtFg+GJ
+Vrbj4RFVsOeGcy6xPYEwTveK6RLf4xMTy4x6AQXguls=
+laj6iFmYc2DeUidRm/poynAul+X1XFtHy4x6AQXguls=
+uQzgoFGJdFjdnbhWjFDvHwT1tZsHfiBBy4x6AQXguls=
+fMSADmyw8MVv8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
+Sg9tt2ZNeu5v8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
+1MVvkAG3zx1v8ZabwFNKANsp4Ism9gRNy4x6AQXguls=
+tFWoa+Fa+E0KvpYijT+IHq4kLpO4b0WCN5m+Gay4mDc=
+HlBPgXjTWrPCE5zi/CJYd0pgEZ36UZf7
+qJyJhtR9wYUzXDr7TYw7uQLm/EKxWl15
+5HgQz9bhZBZ5fyp8g0MqBZBwNuVVH6sq
+W+uRpV2VRGfOEs8faPFbVJBwNuVVH6sq
++1VsVSgMX3q9FppGobofTZBwNuVVH6sq
+fd7Rpt8fWBifF7pIg0uQua1TqwiA1pre
+fd7Rpt8fWBhUIm92l3iN1WDAN33wOHW6wQ7cCkCUWxZPfX7y11TKwA==
+ZtiRChQSkznxJj5V9utwy0iU8imBtrfgy4x6AQXguls=
+1+jfA83l+iKF3SayFI67uACfONS6MbsgaXBl6wZu5y0=
+/VqIfk4vfde3JvJ2Xjm9/UpgEZ36UZf7
+3OUUj3H9vbXrfZHpEMHYgUpgEZ36UZf7
+3OUUj3H9vbXwozCIpR0nf0pgEZ36UZf7
+JWBCcm2oC0hlDmn3A9bDMCZCeN6biUcBg1jh8Ox1rhV6m9y9N5DCvA==
+5whVUEdPjoQERGJhJJb/jB5IdN0yf6TrxJjmGu3AgzrnsKirjKejAUpgEZ36UZf7
+pJZkFr1uMau5/0FNXste6fOj8LtFg+GJ
+jnQH++UTPaibBHhE3G65A5OH5JCq/vF1WhqDUIQPQGM=
+de3O9146cmULVgLDGsMmxnAul+X1XFtHy4x6AQXguls=
+9UQdU1VIB/Ztd8WtUYdrl/znlgPCB6PWstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+zybTgccYrmvNZmfBQxP52cK0z0/1KIV28K8JgXllPjTLjHoBBeC6Ww==
+9U2iKDgg7A8Fwc85LPgI0O/1mwKFPYtV1K7XQRHlBMM=
+kdU8UcCILZA2zqe2dEz9kO/1mwKFPYtV1K7XQRHlBMM=
+x9ZTV7gEMRCi91Qg24vlA75amaIn5rxJIrRdP5MeE9j1rLaDeGOQwfOj8LtFg+GJ
+FQUi8oWeKA22mkhDBQ8Od0ffVX1Kx6/gaXBl6wZu5y0=
+FQUi8oWeKA009nSxFi4IHE7wB8aAVMVRF2Mdrjp/QpU=
+FQUi8oWeKA0t2SdYDpcKM4jI8KpajKVSpg10U7yntVtPfX7y11TKwA==
+FQUi8oWeKA2km2jSURfVd0ffVX1Kx6/gaXBl6wZu5y0=
+FQUi8oWeKA1DOzz3YWNJ69+VJP2lrbmu
+FQUi8oWeKA16K4HqriD8jUffVX1Kx6/gaXBl6wZu5y0=
+FQUi8oWeKA2ZveeDa7x7vQ26QOL8owUaqUTgJrEohqbQx1T34QTwhkpgEZ36UZf7
+PN71jlSk34UCxwQXdsGm4ZQZTiZNO+I5N5m+Gay4mDc=
+2aDJllB28JLJXbPtseCSr61TqwiA1pre
+24AwIW/ZQevhfJ7nO4hl9jqmLc90JllH+QN+W6do9IvLzkZfPTHbZw==
+e8PUaMqGKBjbjtQVzMQGtVO8SBODgX57y4x6AQXguls=
+g6f6B3EKC0mq/hI3Siy1ns1Rj9szbZqu9RrMjQw02M5PfX7y11TKwA==
+cn9SelEe5HtR55atK842DPOj8LtFg+GJ
+kN7D+ZqtUAf40aKLMAZlPfBjDc6YVozA/Moy/+Vge7xPfX7y11TKwA==
+kN7D+ZqtUAcsXyKn8XbgBbbrO1fPMBV70pCfO/z5g6Y=
+kN7D+ZqtUAfgxTPOJka4x+1sIpk3UltPRPB+qQ9rdKU=
+kN7D+ZqtUAdEPzDylc672CH/h1pywZ5c0pCfO/z5g6Y=
+kN7D+ZqtUAe6K5+69vyqZ9/Pdt1H5L9h0pCfO/z5g6Y=
+2uRZ3LWgKU3RH5Nj+q+LtlPq3vaS3WGD
+rt8lOfUgZoK3CTjvFzoCRlQlsPKn/6q1hFq5sh8RQyE=
+rt8lOfUgZoJlQTf2O+iulomK/3Xny8ms9hT2lIaacqU=
+IHXErJfSSFCNuoiIa651tyyfxx3KDwLB
+785EOhh4F5sj7CuznFHzhJBwNuVVH6sq
+I1DBVtavRK2E1PvLgQn/VJBwNuVVH6sq
+liY3+k43l7+Q4FSyzAKv7/wyznKZVl2qYcKCqJ6M1pTMhUL6uE0NXEpgEZ36UZf7
+UrVzAjnIcuBxOkPtc5YzshjdGWQl0x5hy4x6AQXguls=
+cZht5tTkz8OyPJEuX5FlVfOj8LtFg+GJ
+DGdum4rbXqc5TekogOYmZ5BwNuVVH6sq
+kMsfiffRfraGOny5ykosGoUXNaoO/BVxA4H4FjoDGQbLzkZfPTHbZw==
+k63/U+Ort/t1sXunLF29ToZjzlmb0DiP9hT2lIaacqU=
+w0f3DSSJVtT4n7ZrF0P2pJBwNuVVH6sq
+anqc376RwxH2YvmikroYRr8AMGVXssqQKJZKOfgg6nHJOvnYyXNsXpC4iPbph9qG
+anqc376RwxEclteAVjASagjVcYt6XiKfROcxxZkPB1r0fQTyIpclWA==
+anqc376RwxFrnfoP+wEgV+RV0q3Q8qjoy4x6AQXguls=
+anqc376RwxGunL6RPUuCpx1hqIGQ97twstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+anqc376RwxEl2d7cPemZpxAJGqasuIcYJfZSBCKF4gHm9GlJmRbg+OcIVVBHT46ECvyKmpm5Z0Q=
+rsOHmN/4ufkL8rKaud4vfO/1mwKFPYtV1K7XQRHlBMM=
+0z7NEIWwDp3MhUL6uE0NXEpgEZ36UZf7
+6CdJfik1TY5WtttuC4yb65BwNuVVH6sq
+kigrNEhv/MvSNFr9wNKob/Oj8LtFg+GJ
+G4j5jFyDtCkSCQzGhDDQ3yH/h1pywZ5c0pCfO/z5g6Y=
+qna3IZTy69SQLBb9TLgT0vOj8LtFg+GJ
+Qnj2SoYUQEDwOxi41E/bGvOj8LtFg+GJ
+mpaFzePG/5qUfFjfGL0+BmL6uHlLqsog
+u2y2FVfBqZ7HXWLfSvfpsvOj8LtFg+GJ
+md7FgUY16RRpHAHM1WsmQ8/EDJLz2N3ohFq5sh8RQyE=
+WeRGepVqdPi7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
+oVJkClU0Bvh5NR6CtIcYXyJQS0qubhjOCpU7P23QhntPfX7y11TKwA==
+LX1/RTaigThHUNbECAUpcAfkmii5BuyZ+wmNWke18BM=
+Iwq5Ivop+7oJTP+5mC6pPL13FBy0uL+iRPB+qQ9rdKU=
+f/NLwF/5qBnwshyLxCfprPOj8LtFg+GJ
+XEK48ftZVQvwshyLxCfprPOj8LtFg+GJ
+xm0YhMMvUrTv6eQ9seoGjEUzv8FEiuOYROcxxZkPB1r0fQTyIpclWA==
+KA3vo7pJXIdFDlJf+uZ8JnpmvKAVeqCzRPB+qQ9rdKU=
+BIsR7PAOZaBXpjffLvuUW0wWBzUGIE3Fy4x6AQXguls=
+l0FzfX6DT5kc2AsKYh9Av0wWBzUGIE3Fy4x6AQXguls=
+OgGc28R9XYqrdXvWFsyZiN7SGlS0JFuG
+LxBJSTkhXn+dGLiDN2Hnj97SGlS0JFuG
+zp7DEq21BTwlFymD5/1N/rBzljBEfN2xy4x6AQXguls=
+tlK7bfXVIBXcuzi3+wsImh/ps2807HA2y4x6AQXguls=
+UhUtlWoQP1DCE5zi/CJYd0pgEZ36UZf7
+SaUpgNmsHasnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
+0FmNHjoeZ7YD+iwJRdWW+/Oj8LtFg+GJ
+KBLbMm9Rg00q123TAhgbee/1mwKFPYtV1K7XQRHlBMM=
+nC3Olv+9F3VfoGFpKmLQzCBZw/ZMqkrAepvcvTeQwrw=
+ZnpTQ/05IxPiTIsP7LhxYtHEM4o6ZCR6y4x6AQXguls=
+BWf2VPSq/CBX70UMh3l1zfOj8LtFg+GJ
+rHGVkOky9lRkNVRINR3RaFPq3vaS3WGD
+wkneReaVJMEUYWv2tTiLuBL2525Y8Jlzy4x6AQXguls=
+vecfpO5xbBycNLWbhMusxFQlsPKn/6q1hFq5sh8RQyE=
+9pI83TCsPVXWUpDt6Xr+nkpgEZ36UZf7
+9ATztfXQ4YI5ywm7JAmEzt7SGlS0JFuG
+1gUH5d9S+SQP+0LchfW6bt7SGlS0JFuG
+Sa+uZygGJsFTEX0WzzhmTd7SGlS0JFuG
+0xF9G4KuCCSdGLiDN2Hnj97SGlS0JFuG
+DefAwZ4n13SXuNGxONPgs+RV0q3Q8qjoy4x6AQXguls=
+nAVIQhmgLsUqzclmSTZy7O/1mwKFPYtV1K7XQRHlBMM=
+VQyanJdAJxr8KlV1ph0Yje1sIpk3UltPRPB+qQ9rdKU=
+54MHTIPxFWm5/0FNXste6fOj8LtFg+GJ
+AC5wqOrDg0OEh57YJ81oCvOj8LtFg+GJ
+xEUfjPFZ/xYq17w2ajSKHLBzljBEfN2xy4x6AQXguls=
+qDJCWQ+e+n61f4daHIwZR9HEM4o6ZCR6y4x6AQXguls=
+mAvmI45vfiVtV7mJSxdBKJBwNuVVH6sq
+aMsbvjbfGsUxQ2HeHu18jlufv0N47kkKaAYhz49iPPQ=
+m+hvPY3d9tI9PnHdu7yUaSBZw/ZMqkrAepvcvTeQwrw=
+CDrQ2ea5LGDJOvnYyXNsXpC4iPbph9qG
+GeOoxHykR0NIkRc7oSI9szKnOEpdVQkOwQ7cCkCUWxZPfX7y11TKwA==
+9X6X38YdgQciqg4ZKtRMEaFjfApLwKh/PtbZND328nI=
+sdjtfGRtUulfuLJtpOjzH/Oj8LtFg+GJ
+gywMijxUj6c+OyyB6z9n5POj8LtFg+GJ
+R2eAdMyK6zSU7JD4YB6JqfOj8LtFg+GJ
+gkB282ET6CHZnuNxhT4mNoDCsJ8T2pbfepvcvTeQwrw=
+rmw3y68nbTxtR8wDUlebCerUo2OLEJuOCpU7P23QhntPfX7y11TKwA==
++bJ/vQZNZX5a94t2FvAzVBjdGWQl0x5hy4x6AQXguls=
+Ijs5NwarmpdGNWh/ueDr//oslnIPxwMNqY/rONiW9dfLzkZfPTHbZw==
+Fa4m96t0Af/TV3ww/e2cDZBwNuVVH6sq
+GLZe/17QCbzt0Lwb79na4yq1UHZ+9sTmCpU7P23QhntPfX7y11TKwA==
+GLZe/17QCbxmXvUvjgbr4kY8THOUtOF7856CtLA2mBI=
+GLZe/17QCbw2Hyl0WmLydTOZLUhfMDr5Z36YRUA/eqPMhUL6uE0NXEpgEZ36UZf7
+zy+BWp25HIY8YGgnfhG/CpBwNuVVH6sq
+YmFbY+KQ4Y7q4CxvGXZpehjdGWQl0x5hy4x6AQXguls=
+YmFbY+KQ4Y62jZ0HIHtNhCKNGmIIhDZD856CtLA2mBI=
+YmFbY+KQ4Y5QHYDAU4bOhUr9oz8W6N26epvcvTeQwrw=
+YmFbY+KQ4Y4dNToG2d9B8wPMYZdUQfnX856CtLA2mBI=
+YmFbY+KQ4Y4dNToG2d9B8/x4wZJZoVmQ8GwBcK2jcmzLzkZfPTHbZw==
+YmFbY+KQ4Y4bHBvW0gRQFxjdGWQl0x5hy4x6AQXguls=
+YmFbY+KQ4Y4JJVgL5g3rBuRV0q3Q8qjoy4x6AQXguls=
+SEf6luKEZaNhu51s4ddTcxak9y4lRig4856CtLA2mBI=
+YdusYOZMMEEHkzvFoiBCspGRrBPOUOsvCd7cH2MFQVPLzkZfPTHbZw==
+WAXiD8YngH/NviT5sRQoM5BwNuVVH6sq
+Qud0EeTCG2GQfWiEdArhspBwNuVVH6sq
+Jl+v2iIQ3PRl6qtXuMmmfRjdGWQl0x5hy4x6AQXguls=
+EpkhMubA/KU2uRhwSJ6d+Y6XI0/uKdr28GwBcK2jcmzLzkZfPTHbZw==
+lk8o5519Kxjg6njkDcx/a4LXI+MfHNbWfywvCjeRl/T0fQTyIpclWA==
+DIt4Xp3Xbla1QXPpBNd8kQncLU6QuExl9RrMjQw02M5PfX7y11TKwA==
+2ldeYKVA5RpUYRP2vPq8D9ll6SkFs1l/9RrMjQw02M5PfX7y11TKwA==
+ZHexhB9C/Zz4F0w18YK/UcJTRkl7CKPoepvcvTeQwrw=
+0aA0U9ckmH2SPaLA/eokGpBwNuVVH6sq
+0aA0U9ckmH1WgHE3Y5h4chak9y4lRig4856CtLA2mBI=
+udHQ1AK6s0BHbbfugUQuewG5f+vLIXgw856CtLA2mBI=
+udHQ1AK6s0BHbbfugUQuezWfKD51et5xAQXL9AdSuF7MhUL6uE0NXEpgEZ36UZf7
+qBVDKbnPe4DL9/eiOW3PNvOj8LtFg+GJ
+ammVyKzxh8yyPJEuX5FlVfOj8LtFg+GJ
+6fCswTdb7gp4T5EqkTXoH5BwNuVVH6sq
+jmczOIjm5GmjJuX2eeHASfOj8LtFg+GJ
+hck8BB9RXPfRv+VvHMI2mBL2525Y8Jlzy4x6AQXguls=
+xGJWNwmRrvjSNFr9wNKob/Oj8LtFg+GJ
+Dme0iKBg4ltC5hNG7CjHwfOj8LtFg+GJ
+Dme0iKBg4lsKVHWF4Myk4AIg5cy+cuSy8Qk70COrU7VPfX7y11TKwA==
+C4Bngy5bB8t1b91EHw30B0oPmHAI4936
+5yuQig9LutUtwK0yz09R30oPmHAI4936
+dyMnqxlKzdN/JSshJxQ3iqf2wJuFXvN5y4x6AQXguls=
+BKa9L3k9bnJkzZHOvFXHIKf2wJuFXvN5y4x6AQXguls=
+BKa9L3k9bnKHDjyHip04zkffVX1Kx6/gaXBl6wZu5y0=
+GCjAqXPF1Dof+sd2M1vkT/Oj8LtFg+GJ
+tN2/kArLFem7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
+PhvRblnFgRvdce7uzab8M4ydqAmNreE85+3hueUDKGFPfX7y11TKwA==
+asaad8Q4C6Ctv3/3+UBOAUpgEZ36UZf7
+mW7W5BgaP+MjHOA2mhvm0OrUo2OLEJuOROcxxZkPB1r0fQTyIpclWA==
+mW7W5BgaP+MlWHMII4NFM1/cKgeh02Cpy4x6AQXguls=
+mW7W5BgaP+MvmaXSzDwxNK4kLpO4b0WCN5m+Gay4mDc=
+4fpWUFa+lACNuoiIa651tyyfxx3KDwLB
+Iv1mcWBS5FKHDjyHip04zjO11wrX//LPpDa+H9/X6UI=
+qvpIupBm2WX/AxGfixJ3IUpgEZ36UZf7
+8FSnJAv4mC/Mc5Bnc8mDRe54uYxEV7tyotGKnIGJ8i70fQTyIpclWA==
+eAGFq9Be2c60E0hhBYOohO/1mwKFPYtV1K7XQRHlBMM=
+7KSbuV1nCERWtttuC4yb65BwNuVVH6sq
+PbluYqiSMUInlR5KMGbbXKxfcB7OUo5Mk0YDCbV1OWE=
+SvUyT0up+YUaegOSGrYRJl4BNx8oMOoc856CtLA2mBI=
+8y8wJLjHjH8TNfXi0hp2zzxKSn9brCFL0J2lNnMxKpaYzJ6oJv+qKw==
+6EiWonjOwKYAZgmfbgyEWuHSb9kEZhbZAfBGcSNe17xPfX7y11TKwA==
+iXWjcPj0niUZmdQ/MALAmPL6oKDxDkyLHWnCZH6t2//hH/tXNeBfPQ==
+E0zofMTBmei7Pl0reaplqbOsDNsReNLeRPB+qQ9rdKU=
+zC/bIffd/q9utdpwhrdIlAfkmii5BuyZ+wmNWke18BM=
+oVV0uxz5T6z1aHc/UGh87LOsDNsReNLeRPB+qQ9rdKU=
+4yKVkHCQKXYwTqu9Wh9027OsDNsReNLeRPB+qQ9rdKU=
+RjlHunEZKP0T7ne662LsTrOsDNsReNLeRPB+qQ9rdKU=
+iwZpY5oYT+RXSiqVjN5JhLOsDNsReNLeRPB+qQ9rdKU=
+Cks1i1RgvXeuzpfidcLfubOsDNsReNLeRPB+qQ9rdKU=
+xQ8n2p9QTXp30QT7blyM3Qfkmii5BuyZ+wmNWke18BM=
+vGTRMHlT7dXj43Itc7bH7nAul+X1XFtHy4x6AQXguls=
+kRGK26rRVyvv3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
+2jobYaE9hqkLVgLDGsMmxnAul+X1XFtHy4x6AQXguls=
+P7cKB1x3/7hGsAqNnhnTULOsDNsReNLeRPB+qQ9rdKU=
+QY8HRySr7Iwnp75iBJ/Vjwfkmii5BuyZ+wmNWke18BM=
+IAucFrl7qqxLIGJootoeXhDHi1ipAZxkepvcvTeQwrw=
++812jhbb/MJhfXGLID+DlwxRxeTVAFkvibzFuc+pkRD0fQTyIpclWA==
+Gc+2o0fCUZzBRTe6oIudrbBzljBEfN2xy4x6AQXguls=
+g30soSzYKlYqYKw79TNc7ZU9yEFVkW8kfywvCjeRl/T0fQTyIpclWA==
+5Y1mwjb8gujXQ5dFwFvnLzH8At29S2vWUUnOob68iS9PfX7y11TKwA==
+By5Q/SU5xir2hPuSHwJFxG4yDp8xPBuoawyE6TLbCTavkJTSWMnxMA==
+cJPzYw+8qO2U1kX+sOaXa7BzljBEfN2xy4x6AQXguls=
+cJPzYw+8qO2oTyQOFtqiPd7SGlS0JFuG
+IfQDH7CTkzKwq57YkquoA97SGlS0JFuG
+1AooRnXbEgiveRA5ybYZwBjdGWQl0x5hy4x6AQXguls=
++8iGrGjQRQXLJRvWtAt1iX4eJb4c8+yiwQ7cCkCUWxZPfX7y11TKwA==
+vKMadaRxCnt9yZ92+zfrDUX1wgDB6SwAlcfDWHvheBM=
+nVdA10JEgrH58tUSo2w3wV8pxEoXZNj5aeu8Uvl+alM=
++/2OC1vcA4B763zk1n7SVL13FBy0uL+iRPB+qQ9rdKU=
+Gcnsiwomf6vBdIdG8bPRHll2tDC4Deily4x6AQXguls=
+h6H8S6JOlFZIg9VPXIEScier9kpF888AbpgFshbO4WxPfX7y11TKwA==
+ScnIyRoXkewIde0NTCKaofeK6RLf4xMTy4x6AQXguls=
+xUYZz/Y1ys3dPmsNsdD0UjilXWM8iFGV5+3hueUDKGFPfX7y11TKwA==
+rwSi9v0Y5/n868dzID7JMkiU8imBtrfgy4x6AQXguls=
+rwSi9v0Y5/k3lCRoHQSzQaNUfX3uZ7rARPB+qQ9rdKU=
+L4guYbOD3ybEiQqgpijBkO1sIpk3UltPRPB+qQ9rdKU=
+L4guYbOD3ybiWybz9IQNYu1sIpk3UltPRPB+qQ9rdKU=
+L4guYbOD3yaYjQ+nZpk4a/rLJk4dYoKYaXBl6wZu5y0=
+L4guYbOD3yb/9bq0lnqP8u1sIpk3UltPRPB+qQ9rdKU=
+ZpI2ZmzFQJ3d+AsDA8cg40X1wgDB6SwAlcfDWHvheBM=
+xG5CG1VWnMcYMNtTOEq0iiJCwkfSBhWqy4x6AQXguls=
+xG5CG1VWnMemkG9esmQL6vmkGF5eJuLT5YX/dOX/57O0FrgmK9pWPA==
+xG5CG1VWnMfdjUukdGSSoRjdGWQl0x5hy4x6AQXguls=
+XkypoFugO9L4osiym+Qx7rBzljBEfN2xy4x6AQXguls=
+yUBIpiXiGhsjuTEjt/+DHza5a1CR31xtKBLbMm9Rg01qyZUMAi3tqTcKfUh6nySUeU9Behr53wnItVyfMJtsjQ==
+leErXN0I8raC/1FVali0VVqOf3u62uxi
+uNYj01ma7BBp6IUveDLb/kSqVvpudkC5stNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+h/GuGMcf1KaKSb8pX7R3+VqOf3u62uxi
+HzTSi3irigCvmjkAhtg9xlV2rXAZxRtdwIyvNNx82Fm3si0+gPyQ+SSpKIYunmKc
+iUchhe2/rwlC7NNIijAHcl/cKgeh02Cpy4x6AQXguls=
+G6wb24Mf5+T6zB3Lcx4OpWIjE56GxM2wy4x6AQXguls=
+G6wb24Mf5+Q2bj7D5mvDy2IjE56GxM2wy4x6AQXguls=
+G6wb24Mf5+SuA6VKJ2wwgcrVGJOptXRVls1GZC9Rtus=
+G6wb24Mf5+QAEQQg1tP+b+1sIpk3UltPRPB+qQ9rdKU=
+P2k5Ue4Lv8y64ZIHXxB1ELMtDXvYITGLl5Oa2cfGZzRXXWJcXpDSx0pgEZ36UZf7
+P2k5Ue4Lv8wDd7+GstpwnGI2rUC8DjuD1kZ6inS5X/8qp3pee9AtDUpgEZ36UZf7
+v4ihoCtNRVm64ZIHXxB1ELMtDXvYITGLl5Oa2cfGZzRXXWJcXpDSx0pgEZ36UZf7
+VCHr/EMKXxzO0EtYHLOvpgMNBhUCi+wQ9hT2lIaacqU=
+GDDHjFNx9y3/htQJCfkj0jH8At29S2vWUUnOob68iS9PfX7y11TKwA==
+GDDHjFNx9y3/htQJCfkj0jH8At29S2vW2tJwUxoKu3abbUwv5Q8S+d7SGlS0JFuG
+MetFyWuxralvb3xYsvaR/MMR6cuqYjY1KHgdbgnkKc7wshyLxCfprPOj8LtFg+GJ
+xt3ch79mTxiU1kX+sOaXa7BzljBEfN2xy4x6AQXguls=
+xt3ch79mTxioTyQOFtqiPd7SGlS0JFuG
+JZwfCTqSDJWwq57YkquoA97SGlS0JFuG
+V36oXX8CJ64Yoo5YVl4ymjt1kYZzlOQoepvcvTeQwrw=
+duEQlK0W9zCQ4FSyzAKv77AtFeQR31keepvcvTeQwrw=
+NBBXNZCaNE99yZ92+zfrDUX1wgDB6SwAlcfDWHvheBM=
+tsogkendiar58tUSo2w3wV8pxEoXZNj5aeu8Uvl+alM=
+tsogkendiar58tUSo2w3wU8KuEfhpPX9nvxJfBqZsKF1CazNTv2aYfOj8LtFg+GJ
+/nSM2iK24qLBTtMburLns1QlsPKn/6q1hFq5sh8RQyE=
+s6xvxms4FKy3Z3wCjfQBfKEFpmD/7rphVYc272jQVlw9isRJWDpCZQBzJ7mfsQkty4x6AQXguls=
+0XdboMChu2E5gHpaD2pPoiWj50Qs67mB52mHitj3oNVPfX7y11TKwA==
+ms3NmDDAWXnBdIdG8bPRHll2tDC4Deily4x6AQXguls=
+ms3NmDDAWXmcg+a+FanOcFl2tDC4Deily4x6AQXguls=
+/i480IQgLMepMlZ7KX1uK7L8zAiM/vumYB+cHAiOl8tPfX7y11TKwA==
+VynNxYGlkQCQYi/wKhpaD0iU8imBtrfgy4x6AQXguls=
+VynNxYGlkQD3+GLPpxcTj1tgWhqdfi+qibzFuc+pkRD0fQTyIpclWA==
+VynNxYGlkQDbOP3RQ7tZ/vQnZieAvsPmzWNhsrxTgYM=
+VynNxYGlkQCj2Ow89poxDRL8JTHsvtpK9H0E8iKXJVg=
+VynNxYGlkQDiAh217GaWBX6iA24juz/gy4x6AQXguls=
+hUAdePKw8FbP7S63W+brpEiU8imBtrfgy4x6AQXguls=
+i8Syi+i2egOEUBf+PUKtAiWj50Qs67mB52mHitj3oNVPfX7y11TKwA==
+nly0EGexHS8W40YEz3OcshThMltj0h+y52mHitj3oNVPfX7y11TKwA==
+Z6ORYEVTHAYYMNtTOEq0iiJCwkfSBhWqy4x6AQXguls=
+Z6ORYEVTHAbdjUukdGSSoRjdGWQl0x5hy4x6AQXguls=
+Z6ORYEVTHAZcKrbMkfbHlC2cRMPa25eHibzFuc+pkRD0fQTyIpclWA==
+Z6ORYEVTHAZcKrbMkfbHlPSzXA5wk6riG7gWkmicr4aqKNVkN8emPEwWBzUGIE3Fy4x6AQXguls=
+Yrj7/CliiawTfm2BwPdp0LBzljBEfN2xy4x6AQXguls=
+Yrj7/Cliiax2vHf+pDgnBN7SGlS0JFuG
+Yrj7/Cliiaz4osiym+Qx7rBzljBEfN2xy4x6AQXguls=
+f8aF/kdme/IKyS+7h+VKSWL6uHlLqsog
+bK8Zpab/PptNYls6bckCK/nQ97t6cMEn9RrMjQw02M5PfX7y11TKwA==
+h+WfKYcw8/5UYRP2vPq8D9ll6SkFs1l/9RrMjQw02M5PfX7y11TKwA==
+dQt5mgUKF7RGbvA+FxO6AQfkmii5BuyZu7hkhPiE07E=
+9K+PZ38Hd/3Lq4u7hNFVk7BzljBEfN2xy4x6AQXguls=
+9K+PZ38Hd/0q17w2ajSKHLBzljBEfN2xy4x6AQXguls=
+sPbuqnenXG9VSWDLbldzl1Pq3vaS3WGD
+WVz6k53vYlvCE5zi/CJYd0pgEZ36UZf7
+wMnWetYvwcB22baEwHSHdWDAN33wOHW6wQ7cCkCUWxZPfX7y11TKwA==
+FQ7Z0CPc4AlqXJH1d/vXxlqOf3u62uxi
+6uJVi7VzfR9fuLJtpOjzH/Oj8LtFg+GJ
+LbpsRClvKt7SNFr9wNKob/Oj8LtFg+GJ
+zOB+Gixkrqq0PZ7rDpYw+g==
+ShmFYWl9kbLSNFr9wNKob/Oj8LtFg+GJ
+BPywirVs7BwjgMng2FanCRjdGWQl0x5hy4x6AQXguls=
+ttuFIQiBSmBL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+miKP0CYl3W5Ym2pzcr/F6L13FBy0uL+iRPB+qQ9rdKU=
+8n8zV92Zv6l9KDxIQfEX1r13FBy0uL+iRPB+qQ9rdKU=
+8n8zV92Zv6nu8xwJpBGB7r13FBy0uL+iRPB+qQ9rdKU=
+8n8zV92Zv6krX2BZrGZD8VpIinwp+ERxibzFuc+pkRD0fQTyIpclWA==
+8n8zV92Zv6krX2BZrGZD8VPHTAexdz+zibzFuc+pkRD0fQTyIpclWA==
+8n8zV92Zv6k1kZKII+JesEwWBzUGIE3Fy4x6AQXguls=
+/SbDH4creAHCE5zi/CJYd0pgEZ36UZf7
+9zUaxn05IBwS7PNKz81G4R36d9MG7xUn6uzv0j5wVxhPfX7y11TKwA==
+9zUaxn05IBxgnwnOZ+hQK4kq0N9SOLm5
+FRuKyrtJj/RL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
++Coj8KXFfRxp2idI23BKPPOj8LtFg+GJ
+iF6Bt9zVCn7ItVyfMJtsjQ==
+PfdaDBocFQixm2LbXcoIDXpmvKAVeqCzRPB+qQ9rdKU=
+k7aDH3uuoqARhkIHqx1H7tsp4Ism9gRNy4x6AQXguls=
+d60eywEVz6xBSvshOJLAoJBwNuVVH6sq
+obe5iClk984NDakaoCCLCJBwNuVVH6sq
+1TVDxDeahUN5RG1vEUP2O5BwNuVVH6sq
+B6XhfErTTJgfRf0i/Vkb/bOsDNsReNLeRPB+qQ9rdKU=
++wYtQHJp691kNVRINR3RaHpmvKAVeqCzRPB+qQ9rdKU=
+Y3uHEyYQDdrSNFr9wNKob/Oj8LtFg+GJ
+WV4Ty/OMJBjA2E20A93dy1/cKgeh02Cpy4x6AQXguls=
+m0lX8CRPaqiw8mEQdSz4E/Oj8LtFg+GJ
+Do2wiH59igUFYo+n99SzmPrLJk4dYoKYaXBl6wZu5y0=
+UQx8DfENDTsDlTTw1nBAWlPq3vaS3WGD
+hT2R6oNQDGiD+EtUMNSV0fOj8LtFg+GJ
+xGjxEbbo/twhJLbnEbgPLFPq3vaS3WGD
+xGjxEbbo/txre6ZjJY/aDNSX1ILygfSsdTD26Z5KQnpal+TXCztiQ/yCn2NHqVIHy4x6AQXguls=
+Xeg5n8JTu9Gw5i8Z7YSfZkpgEZ36UZf7
+VQVgaWVz5xKx92ImtPG7wALm/EKxWl15
+lQFziLYwAFR/Rx3+b7qP0/Oj8LtFg+GJ
+v9yCwhqLXXRy0a0P9VppW0oPmHAI4936
+Ss1fTwot0Qh1CazNTv2aYfOj8LtFg+GJ
+mbpi6adHTerCE5zi/CJYd0pgEZ36UZf7
+1aJE0MOrznGQLBb9TLgT0vOj8LtFg+GJ
+2O5atTA83YryUEMJR9kTcPOj8LtFg+GJ
+b30Bnk44ReFqPP6LYZnzpu1sIpk3UltPRPB+qQ9rdKU=
+aak3L9Lnp6k4jrPr+Vc2QkffVX1Kx6/gaXBl6wZu5y0=
+SPMC0Or3Wq5Ym2pzcr/F6EffVX1Kx6/gaXBl6wZu5y0=
+Od0k7somw0+ognNgz49kBq1TqwiA1pre
+neSRPR/Dc1r+5avra8D+/N7SGlS0JFuG
+NPyf8uRLdZAxgppd7vKR30iU8imBtrfgy4x6AQXguls=
+EMu7srLgFkT8KlV1ph0Yje1sIpk3UltPRPB+qQ9rdKU=
+x9PLCfVsCr/aY475fTCHFCJCwkfSBhWqy4x6AQXguls=
+x9PLCfVsCr+l3V44t9O2VSJCwkfSBhWqy4x6AQXguls=
+x9PLCfVsCr+UayicXLX+aCJCwkfSBhWqy4x6AQXguls=
+gre6Tf1xXnA8kiJVq+hjxkoPmHAI4936
+LAphuzvX0+3XoplDMw5YiCJCwkfSBhWqy4x6AQXguls=
+LAphuzvX0+1cKg99X5f5WEoPmHAI4936
+RT8uwG1AoLRL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+tKMGaq5ZqS8faicHeoCF8GnzW8KqwV7b9RrMjQw02M5PfX7y11TKwA==
+tKMGaq5ZqS/cxQIQipmO5ytKOLKlA1ksMvC5rExawa6V8xmS/Gv42azwXryjYWOyFt/BclTC+KpZOr/GQaeSWEpgEZ36UZf7
+MEV2TdfjfmxsgNJHgfD0IHy5ViVd9uvlrFPG/qrcRHVPfX7y11TKwA==
+SZ7z14JzRxz8N5fA/Bb0QEoPmHAI4936
+bhXPjU5Ou0zCE5zi/CJYd0pgEZ36UZf7
+ZTORLADhCW2V5Bc5DWG/rll2tDC4Deily4x6AQXguls=
+ZTORLADhCW0//Lt/QRmfpyH/h1pywZ5c0pCfO/z5g6Y=
+L9fVUSRavgJxLBNTp+QtPfeK6RLf4xMTy4x6AQXguls=
+dNe0XAa3Jm+3JvJ2Xjm9/UpgEZ36UZf7
+GJGUhATERBm3JvJ2Xjm9/UpgEZ36UZf7
+/9URtgHOtUUmgH9IsYidFKiSzovJkrG6856CtLA2mBI=
+lxyRA/zOuaXhlvYRJmLKFghNNHLHKan7QE1oNjRzv0A=
+k/AWU8J38exqXJH1d/vXxlqOf3u62uxi
+0Xh3Jo3x1fcVN9/lDCFFSFqOf3u62uxi
+sXhYv4ghjQ393cgW1OhgWPOj8LtFg+GJ
+ddsicK1RKkr8LfyJUw8Qg3ynnASRkZlj
+Wj5HYIWDLWGw78a972g1EkpgEZ36UZf7
+su0V2rk2gah2w8q8JxH30WL6uHlLqsog
+7YT/1gWrFMOsITkil5j+MAxHjZXQ2XqDuF3NIeLI7v0kqSiGLp5inA==
+GPdd2yIwWWesOniOA5cBq41ncbSjshCEmQCWLXtYoTFPfX7y11TKwA==
+mtIyd1Hqz2UxOjWwaO+5DiH/h1pywZ5c0pCfO/z5g6Y=
+1MHev69zrjZj004btOAkes94cw1mrZqiQE1oNjRzv0A=
+EjAf+Fk40oLXv2qPN2R841D8sLBRuvnPVj3R0+P6Ke796uutIWsx7JC4iPbph9qG
+it7CAuuV7SAxR6MAda5351Pq3vaS3WGD
+IS3trY+w1C5ped3RWFjnRS7e/oaau9gAXpBSJ5uhUAo=
+7ttNQ1aOZmErxH/5ZZarV4EwIA0kxtT3y4x6AQXguls=
+fDYkXHftmz8W40YEz3OcsuYEtK9W2WqUmQCWLXtYoTFPfX7y11TKwA==
+XXxX/NgmOKOlw/JG9WEaL36iA24juz/gy4x6AQXguls=
+Lwk9eym56F2hG0E0QBbiBCyfxx3KDwLB
+UCgJlS/HXezaY475fTCHFK1TqwiA1pre
+UCgJlS/HXexHXYr3weuURK1TqwiA1pre
+mqvMdLunKrO04LVLknUe10UNUQ2QoJYZBtmtkvJYaYzLzkZfPTHbZw==
+JuMgbbZn7fp/Rx3+b7qP0/Oj8LtFg+GJ
+Be1T87t+ge5XlrymvmHctvsjOZIlqq3hrFPG/qrcRHVPfX7y11TKwA==
+Be1T87t+ge5XqKHPIBx1decIVVBHT46ECvyKmpm5Z0Q=
+Be1T87t+ge409nSxFi4IHE7wB8aAVMVRF2Mdrjp/QpU=
+Be1T87t+ge6oc3vYT7LsOXLLIfzR98fTHWnCZH6t2//hH/tXNeBfPQ==
+Be1T87t+ge6yBrpNLcSpoZjZkopBAnj4HWnCZH6t2//hH/tXNeBfPQ==
+Be1T87t+ge5YEOaSf136eQT1tZsHfiBBy4x6AQXguls=
+Be1T87t+ge6km2jSURfVd+cIVVBHT46ECvyKmpm5Z0Q=
+Be1T87t+ge5gONVh6hyj4FjBxRP/noEkHWnCZH6t2//hH/tXNeBfPQ==
+Be1T87t+ge6BEzUegK+LzecIVVBHT46ECvyKmpm5Z0Q=
+Be1T87t+ge52p/GUBvJlKgT1tZsHfiBBy4x6AQXguls=
+Be1T87t+ge48js9ij9+tfOcIVVBHT46ECvyKmpm5Z0Q=
+Be1T87t+ge56K4HqriD8jeRV0q3Q8qjoy4x6AQXguls=
++89J6TR32voQgbOipa/YegfPpApbMOkMhFq5sh8RQyE=
+LlMqJlMfp5XCE5zi/CJYd0pgEZ36UZf7
+q3wgm/88Ra/5FA/QNzKqWKEmC0tHnFgTKSotK/v0yek=
+JRjgwC9Nl8D07Pr83yxuuoZiRLknPIhby4x6AQXguls=
+23R1BuGALKkPTIc+xqy84g==
+MejiOyuUSYXCE5zi/CJYd0pgEZ36UZf7
+DdOs5Dtw0QwfYrJTd7u97V8pxEoXZNj5aeu8Uvl+alM=
+4HI+0PfJaYN8YPH6c539+jzmU+FOUsy4fER6RG1klik=
+lx6eh+YkHBXGQf4A1Ut9bKuL51BaHbjJstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+9Mqch0gZ4bPxBEF6YmaZtkcdj80TCvSKqzKLxcx+tSc=
+9Mqch0gZ4bPz0v8j23MbjNPaFoMUutn7RPB+qQ9rdKU=
+9Mqch0gZ4bMvCICzkLDDGehZn9/adx3vy4GGkE0bbpyw8mEQdSz4E/Oj8LtFg+GJ
+9Mqch0gZ4bO3ZIY+lmc/+RnMjLDUY5xny4x6AQXguls=
+LZyp1gIf6wiOl3qik2jwk6RDFmbmXXil
+oUHoi3J+yiDI1bw1UsJaVEpgEZ36UZf7
+E03BI5P/0r/MhUL6uE0NXEpgEZ36UZf7
+ZYCQozJW2qvwOxi41E/bGvOj8LtFg+GJ
+Wx+TYikA2urCE5zi/CJYd0pgEZ36UZf7
+qW7Uf+cuUKUCAZnq4oBF/POj8LtFg+GJ
+JsWoe4vRDt+jI1emh9XUFPOj8LtFg+GJ
+qMdsxFnf7SjCE5zi/CJYd0pgEZ36UZf7
+7nUs+pzMGNQU2voVSXubFpBwNuVVH6sq
+rh16PU/bLznKwSWbD40NLyyfxx3KDwLB
+Mpws87qKqdUCAZnq4oBF/POj8LtFg+GJ
+wAG7h4jgsHz1hFgQXur/mkpgEZ36UZf7
+cyrUnsE+xTt/Rx3+b7qP0/Oj8LtFg+GJ
+FeneHV0jniXhjOGBjP0tkSoVbfyrL10EWhqDUIQPQGM=
+FeneHV0jniUYclRR5n6EOPeK6RLf4xMTy4x6AQXguls=
+B2EBAR60IppisJUSU6syO0oPmHAI4936
+2auQrCxhHIuioNaJ2OEJLEoPmHAI4936
+Vfay8OeyRBHCE5zi/CJYd0pgEZ36UZf7
+3BvyzjY734aioNaJ2OEJLEoPmHAI4936
+cFYwLcx8lBi40Fj+KszbNkoPmHAI4936
++BWPPfYlvW1XqKHPIBx1ddHEM4o6ZCR6y4x6AQXguls=
+tqfw6NEVIE2E1PvLgQn/VJBwNuVVH6sq
+D/nWCdnKl6ptV7mJSxdBKJBwNuVVH6sq
+wesEbkcq3G2JlqzsLpoontS+kgXZKgOPy4x6AQXguls=
+YUhOmXNESHB2ZZeRKlYPOEoPmHAI4936
+w0pNO/G/ztmyPJEuX5FlVfOj8LtFg+GJ
+aALCXOoFPx92VgIo4mv4FtS+kgXZKgOPy4x6AQXguls=
+aALCXOoFPx8Ey0tJ0nESHdS+kgXZKgOPy4x6AQXguls=
+E/5wOVIsF6a+DupvRV9k9N7SGlS0JFuG
++js67kDQcFh9h8vjUcC6wfOj8LtFg+GJ
+JOWuxy1tcO63K9xlTBbaJvOj8LtFg+GJ
+vw9DQsUCodtXqKHPIBx1da1TqwiA1pre
+q8SO41xH4H+tv3/3+UBOAUpgEZ36UZf7
+X+2h3edByPRXrrLCZAbA0IBwebx29WjwN5m+Gay4mDc=
+zCVSXXb5NXkVN9/lDCFFSFqOf3u62uxi
+DtuuJAfVwT3VGlpd50u+NkpgEZ36UZf7
+EiJtPPoy5YOqBDtVMagTbba/H5IGWzTO9hT2lIaacqU=
+JawkevnCrNdts8zcqwR2eKHvMDErP7gJstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+lPChL110T8qH6H8fqQsEDQYd3czwK5kuaXBl6wZu5y0=
+rCMp7rtnhxrHQdqfJSKMLAYd3czwK5kuaXBl6wZu5y0=
+TG2nF5NcrshL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+4wo8hNCdEQEmaNNvL8sx3NdP8cG+AoEp9hT2lIaacqU=
+/7ct4BMAXCUzXDr7TYw7uQLm/EKxWl15
+t6I+Wba8BRC9FppGobofTZBwNuVVH6sq
+FuqufNWLbz7WJtI2H4aUC7BzljBEfN2xy4x6AQXguls=
+Nt6VZaeWqZzN5z6vOYv1dKlsit/TVI3D9RrMjQw02M5PfX7y11TKwA==
+Nt6VZaeWqZy1QXPpBNd8kQncLU6QuExl9RrMjQw02M5PfX7y11TKwA==
+rKBk01Fx9j23JvJ2Xjm9/UpgEZ36UZf7
+ySmvEQkp+QnDVB+FOWxfQpMk2YgHTvJIlG2KEQazVUfqIZZcdg+1Fg==
+ONKJPxQ05EuDeZQi7n+ymPeK6RLf4xMTy4x6AQXguls=
+/ZBZNOiYzE+2EkinjidSXecIVVBHT46ECvyKmpm5Z0Q=
+PmXiFkkqLljCK04zVVZrqh9chXIUgi4lFw5IxUfsdvk=
+VgjQjLlxJgbVGlpd50u+NkpgEZ36UZf7
+oCdVZ3TjXszsI02ZCbErN/CvCYF5ZT40y4x6AQXguls=
+06VstCfw9TsVN9/lDCFFSFqOf3u62uxi
+yIwYB0D5ANpIkRc7oSI9s7K8YzH4gDQgy4x6AQXguls=
+kQHtQ28+jmSs22EWcIktH5C4iPbph9qG
+l88DeydS7Mr/5w6rMKFsfecIVVBHT46ECvyKmpm5Z0Q=
+cchXAGqWaFReJ21yxIT3be1sIpk3UltPRPB+qQ9rdKU=
+RNUTN8me5q1ReH0oBHbJGNqY7RGsCVoPAfBGcSNe17xPfX7y11TKwA==
+RNUTN8me5q1or2m5+SKQMMSKe9vVY/8AlG2KEQazVUfqIZZcdg+1Fg==
+hU2JsvCVd8iVbaq0hPsRvnpmvKAVeqCzRPB+qQ9rdKU=
+CQJvmF3yt1F6BlAdBV+jGC9myxH6CkHeEFyO6huNc6Q=
+3w3xExz5BYjfEMKoqqshoIaR13R3nUd3teq+RIooEghPfX7y11TKwA==
+xjGHNt3JuT9IOeeheINUM0oPmHAI4936
+HQ4O/5TsBQbpSgcoVE4LbXHIgbvw9UUMxNhXTmnBUo8=
+jDc+I5DLhjcdldob8yjvsEoPmHAI4936
+jDc+I5DLhjdaVQ4Lv2EkrkoPmHAI4936
+ERG/my0wCEMmgH9IsYidFKiSzovJkrG6856CtLA2mBI=
+8GR+KuRP/IrZpafk8rhqLjO11wrX//LPpDa+H9/X6UI=
++SvHIm2Mlu9B+y4G1LWUjUoPmHAI4936
++SvHIm2Mlu9WgHE3Y5h4clmDacM1Qce94KJlnTPYf0iYzJ6oJv+qKw==
+HLbF1HKtXYGIo7PKykxrN0iU8imBtrfgy4x6AQXguls=
+UnEQf/j0jK6x92ImtPG7wALm/EKxWl15
+FkH+3MJcYBmyPJEuX5FlVfOj8LtFg+GJ
+bq4owRXG1PiioNaJ2OEJLEoPmHAI4936
+bq4owRXG1PiMRJQtxc8R6koPmHAI4936
+osXaeNVdi5Bh4GvBMx4eJ/Oj8LtFg+GJ
+uCAuXCRbEjOtv3/3+UBOAUpgEZ36UZf7
+YTFr6yTNbAO9SSnHHBVGA/Oj8LtFg+GJ
+GhRXduWr8cb2YvmikroYRiHFVYFksbf2rFPG/qrcRHVPfX7y11TKwA==
+GhRXduWr8cb3R9KvkRZsVtHEM4o6ZCR6y4x6AQXguls=
+z0NB6EgQrYuej9syichlRRjdGWQl0x5hy4x6AQXguls=
+7dwIUGq+pHAjgMng2FanCRjdGWQl0x5hy4x6AQXguls=
+7dwIUGq+pHDVNpX+SJIcBl2BBsIawet1u+2srYn+TwXMhUL6uE0NXEpgEZ36UZf7
+8F5Rffa3tXf4n7ZrF0P2pJBwNuVVH6sq
+DH2VViKrbzkp6/lKXi3UMOrUo2OLEJuOxJkxuUM2UM3TUyqisEKkO0pgEZ36UZf7
+jryElcwKEMNxLBNTp+QtPfeK6RLf4xMTy4x6AQXguls=
+J2nslBNjSd9lRnm22WMLCZBwNuVVH6sq
+CrymWgzKBwmowyaOlIWPkfOj8LtFg+GJ
+W6++NOLhnGKW64PK7OzRci1TUpamJyWhy4x6AQXguls=
+W6++NOLhnGImgH9IsYidFKiSzovJkrG6856CtLA2mBI=
+pU876B1hGC6+86Rb1W1pEQ==
+ymBA422YpT60tTwm0ePTu/Oj8LtFg+GJ
+B64Md1JCAwjWUpDt6Xr+nkpgEZ36UZf7
+0GpXlkW1y6vWUpDt6Xr+nkpgEZ36UZf7
+iOqRqy56ghCDwJ8yRW4QTd7SGlS0JFuG
+sxgS7X/mz0eeQpPRvTm3LFPq3vaS3WGD
+jhM9JTBsgxfSNFr9wNKob/Oj8LtFg+GJ
+wyDvFk8TTUS0PZ7rDpYw+g==
+X9EC5zk/BzLTp7h58XZ5OfOj8LtFg+GJ
+YbFLLWDTZX6jebsJIc8YlfOj8LtFg+GJ
+6gWj62/jMx79+r0EMibpOfOj8LtFg+GJ
+mc0v41Pmxbu3JvJ2Xjm9/UpgEZ36UZf7
+93ZjDiJwkDG8RbktMnXXHfOj8LtFg+GJ
+Xn4HnNubANHFZ5D2h4QJfYZhCmXNWZmGaXBl6wZu5y0=
+/VfPpD7+6ViEcDEYG6zc49S+kgXZKgOPy4x6AQXguls=
+048X8sVpSrC5/0FNXste6fOj8LtFg+GJ
+odwlcbPCv1V2ZZeRKlYPOEoPmHAI4936
+s9fvPkvw+eO5/0FNXste6fOj8LtFg+GJ
+mVQ8Q8ewqYWXVpljuLaKukxdyVOf7XNtZ5wrfkhkzAA=
+ffIYZ1PjuXBx4u2IJrBm00oPmHAI4936
+0oaWW6Ft5KK1f4daHIwZR9HEM4o6ZCR6y4x6AQXguls=
+L2rEB7a+UV80RdSYnDioG4yT35O/ZMlXjuyKZVVSxxc=
+/nZa4JHvh5RutdpwhrdIlO1sIpk3UltPRPB+qQ9rdKU=
+/nZa4JHvh5S+AVOQd4583+1sIpk3UltPRPB+qQ9rdKU=
+0j/OcOgq4vblQZ/5Ca6DjU5xRxlEwuuujuyKZVVSxxc=
+yAZvjf/Npq3Jcbvke1EgJ0oPmHAI4936
+wg6D0EnuXuQnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
+zONWHZaMDFDdMM/Jx/UGaCQln6pOmJcZ0pCfO/z5g6Y=
+b+p7oPuIEcXgfJazTxRSvALm/EKxWl15
+b+p7oPuIEcWpakXUpZ6hBrfQ1g178t/sR4q+tB+teD3wshyLxCfprPOj8LtFg+GJ
+T8EFg6F1LsJnJtwh+biWBnUGLM4fr3KEy4x6AQXguls=
+9ln3OtBAZ4xYHWoVS6+3aE7wB8aAVMVRF2Mdrjp/QpU=
+2w7I+GMn9H92bBstIl8fQUoPmHAI4936
+zmnYQWRJshw8pS//ypC4EfrLJk4dYoKYaXBl6wZu5y0=
+zmnYQWRJshxfVjmT72+IU/rLJk4dYoKYaXBl6wZu5y0=
+pP/EazI2ohTJcbvke1EgJ0oPmHAI4936
+HSlkVdSEOqxDB6mfhWFtF/rLJk4dYoKYaXBl6wZu5y0=
+iaqd4ac59tkwmxiV/uttpe1sIpk3UltPRPB+qQ9rdKU=
+6950kamGyz1jn8atkAa4WRWb7Iq+ue9U0pCfO/z5g6Y=
+ZBlMqkWFMgGHlQYO/29XsPOj8LtFg+GJ
+etqHd962VKXwshyLxCfprPOj8LtFg+GJ
+1rOjBHyFj+eHnIZJN6/3sBATcNYyjC0W0pCfO/z5g6Y=
+yjsVsC9nyaHCE5zi/CJYd0pgEZ36UZf7
+RL9wd7sqH8nJ/XFJLG1noC3MK637qtLAFw5IxUfsdvk=
+FfjvvdggP/1GEF1igpqnMjoZ9Con4QX6A2+HaLUZbe0=
+tVBVCkW2P2vvP1LP4h1GfVPq3vaS3WGD
+c8fipJzZpKHSNFr9wNKob/Oj8LtFg+GJ
+bAvcVi4Iw6s88My+QyBF4iOSA1tar8TQ0Rzn8E7ul0JLV1Hq0b8BpPOj8LtFg+GJ
+PARbOnEYlB3rgwUip8TSvrBzljBEfN2xy4x6AQXguls=
+go/dWWwGU8bJOvnYyXNsXpC4iPbph9qG
+TkKCqeWSukeV4wuSWx4U26GFuSH/HQxAy4x6AQXguls=
+TkKCqeWSuke8RbktMnXXHfOj8LtFg+GJ
+TkKCqeWSukd0P3wPBDQ7QFPq3vaS3WGD
+hO72ygyNsdS3JvJ2Xjm9/UpgEZ36UZf7
+LoM+jDhQqFDwozCIpR0nf0pgEZ36UZf7
+mySxSoQQ5hH9+r0EMibpOfOj8LtFg+GJ
+3jzcnOifPTGUtstGJWfN1Hrz3wa3t9i6y4x6AQXguls=
+4kdkKXQ7T0R1hHUpo6tg/ajv8HiCer8Ay4x6AQXguls=
+4Wm1uiOER9zSNFr9wNKob/Oj8LtFg+GJ
+7ddpONXhUU5L7w5GPenWeql77FvoyOUCfywvCjeRl/T0fQTyIpclWA==
+d1sVTi4llK7lQZ/5Ca6DjTtDCKtSyZ8Eaeu8Uvl+alM=
+Fmkib4/xoTMCeemNLJHnJgLm/EKxWl15
+PaGbbzoWurQnHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
+9Si22Bpxf/QBFq6hXHFOTkwWBzUGIE3Fy4x6AQXguls=
+5z/FaS08FC2I51kihoSlswLm/EKxWl15
+unXa+WSPJaRSSitwj7vrXQLm/EKxWl15
+aoyMNdWOkHd1CazNTv2aYfOj8LtFg+GJ
+4+Hqev/UbHPPxYlpacEdI0pgEZ36UZf7
+TQRngJH1Ek1qPP6LYZnzpr13FBy0uL+iRPB+qQ9rdKU=
+CcAtnE63g1xa033tXDwlqSgM1VPOu4sN
+2n75FC3uwfC2lddTY1y4I0wWBzUGIE3Fy4x6AQXguls=
+erLQ3JyUfISiMFttLBCaNgLm/EKxWl15
+psmYD1yV0+1SSitwj7vrXQLm/EKxWl15
+T0tpWQa0WBy9wwymMgTHHEwWBzUGIE3Fy4x6AQXguls=
+GU9rv7S9HDKCGC55KuzT8UwWBzUGIE3Fy4x6AQXguls=
+eYAwQTFdThU3xjZ6HMSwQb13FBy0uL+iRPB+qQ9rdKU=
+ZcATeY3SOmU8js9ij9+tfH6iA24juz/gy4x6AQXguls=
+ZcATeY3SOmV6K4HqriD8jX6iA24juz/gy4x6AQXguls=
+WpMnbnNRcj++AVOQd458336iA24juz/gy4x6AQXguls=
+LT2QzTDBMvBSn/fQrSogfSanigrTdC7fzWNhsrxTgYM=
+3S0zBzzcG28nHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
+rH75MlwLe4iHDjyHip04zn6iA24juz/gy4x6AQXguls=
+ORtAqQQY1sfPxYlpacEdI0pgEZ36UZf7
+BtmsuCW8kSpA4pTRFdS/KQLm/EKxWl15
+hgKSS6WIoWEdo9FMoGbGk0oPmHAI4936
+hgKSS6WIoWEBDkcxYXRMQhToYGFen0lpzWNhsrxTgYM=
+hgKSS6WIoWHSQcDia9XkMUZDtywxNaqwqebDJ2D3GrP0fQTyIpclWA==
+ObtZggguHVH75+AsqJdaK/Oj8LtFg+GJ
+5ElRLBbico5HfaFd/KsR0koPmHAI4936
+gBhYk85FRG6M6X8re3fQg/Oj8LtFg+GJ
+IIbeVb1Zp2Vw6L/p6JSpG/Oj8LtFg+GJ
+z71z+qSu7Ey0IhLdN9AyUEoPmHAI4936
+cGT7aZk2gf7PxYlpacEdI0pgEZ36UZf7
+79ikOahtbziMeW7poAUy4dDGrvtwVnWwfER6RG1klik=
+oDX9OktCqQS5+Ag8CVGtZAEles108WxdRfifV1nUUrFKYBGd+lGX+w==
+4WFREg6StsXlQZ/5Ca6DjXXPc5Ki/J8mZ5wrfkhkzAA=
++/5WFE6HdRIVk1QoQHbV70oPmHAI4936
+/rrEnWld478nHOlkm0sxA+RV0q3Q8qjoy4x6AQXguls=
+LBjLIuMcxdXj9lLGelo0UO1sIpk3UltPRPB+qQ9rdKU=
+h1XeOIBMRZ14iFg1egzOlALm/EKxWl15
+Liq4+z+iHBbwshyLxCfprPOj8LtFg+GJ
+hMPHG8zWfevwshyLxCfprPOj8LtFg+GJ
++pXXyHkf87vPxYlpacEdI0pgEZ36UZf7
+O8xLRFQpwrDdxEXzi6UoSsyW8297TnFZ0pCfO/z5g6Y=
+59OFXSNrO2ax92ImtPG7wALm/EKxWl15
+MyZ2EamTQ95rfLPYpSRg6UoPmHAI4936
+1suDit3Eq7XNgWyWzjfkBTVnubG+Sf58Qxxo88aAg3c=
+p+oXZGb9felB+y4G1LWUjUoPmHAI4936
+T8qiUcOxWGex92ImtPG7wALm/EKxWl15
+megPgZgZatmyPJEuX5FlVfOj8LtFg+GJ
+hIcKxvB0qrStKsK1NKEnjnUGLM4fr3KEy4x6AQXguls=
+hIcKxvB0qrQ1/obow+hNxNS3UCP+Xxke56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
+hIcKxvB0qrQ1/obow+hNxM87KOEe5EKO56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
+hIcKxvB0qrRmdPhpVvErmmU8YnidNLyF56zwMY8I/+GEqKNFUcAAUEpgEZ36UZf7
+hIcKxvB0qrTRUDfrIg6YeeOaiJxfN2NojuyKZVVSxxc=
+IgfkS/yzfiNl6qtXuMmmfSJCwkfSBhWqy4x6AQXguls=
+vdDujKxsGqTu8xwJpBGB7vrLJk4dYoKYaXBl6wZu5y0=
+vdDujKxsGqRfVjmT72+IUyJCwkfSBhWqy4x6AQXguls=
+vdDujKxsGqSuYTcjFB8CYIW56gVH63DBT8qiUcOxWGe/98RHxldG1vOj8LtFg+GJ
+vdDujKxsGqSuYTcjFB8CYL6qBg32lrLQT8qiUcOxWGe/98RHxldG1vOj8LtFg+GJ
+NUY6EzUNBcupT2zvt/urCUoPmHAI4936
+O8LPxcSZWgCyPJEuX5FlVfOj8LtFg+GJ
+MsAiyvZZGvKtKsK1NKEnjnUGLM4fr3KEy4x6AQXguls=
+Lz3xBm67RkV4emxgFA0tiJBwNuVVH6sq
+2UBsnltmJt+RNpK5CN0kEoEwIA0kxtT3y4x6AQXguls=
+53+yvEZVribSNFr9wNKob/Oj8LtFg+GJ
+s/Uo311nB4nNgWyWzjfkBTVnubG+Sf58Qxxo88aAg3c=
+hIwdjylHLGpzJ4M0r7zib0iU8imBtrfgy4x6AQXguls=
+cq6XXjMR3YCyPJEuX5FlVfOj8LtFg+GJ
+URZTYYOprr+ioNaJ2OEJLEoPmHAI4936
+URZTYYOprr+MRJQtxc8R6koPmHAI4936
+8a/odfEE6zzSNFr9wNKob/Oj8LtFg+GJ
+pou90Ds2zWZCzwZsznq8ZEwWBzUGIE3Fy4x6AQXguls=
+pkeEKh1jPSBWgHE3Y5h4coemfMvU1eABfER6RG1klik=
+OwPmdJgfleD9qI/NdGuLvopY37QaCE2vaXBl6wZu5y0=
+98gWtMm+tR46B4D4P9VTIQLm/EKxWl15
+Jv1hD0HAYBs9M2n0C2t1jkoPmHAI4936
+ghSbmaLOO99L/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+ghSbmaLOO9+2eQd7E/7L89HEM4o6ZCR6y4x6AQXguls=
+ghSbmaLOO99tji7RQU6MglXygIrc0WtXfER6RG1klik=
+Ls5FWwWEd6pSR0e9F1/EYPOj8LtFg+GJ
+at1Bn/0PBKEPvuklRRGDBgLm/EKxWl15
+wDXNPMfkdyNsE0uOQeg/4POj8LtFg+GJ
+dHtBk0+GYeJ8wv8Kzlk4jBL2525Y8Jlzy4x6AQXguls=
+bd68Ff0/MOdHmITcZ8OvTALm/EKxWl15
+RlqtTc1ddfqEqKNFUcAAUEpgEZ36UZf7
+5EBWJUcB7QrWN4gnV7c93koPmHAI4936
+5EBWJUcB7QpKxBbFVac+1wtqBXZ4E+c/PtbZND328nI=
+162SX0X5QG3chbqz0R3o2V3BzxGJLcsP8sfKPfIpMQNPfX7y11TKwA==
+C+CTZb0f4RMrkmpQpbhvUoY/p688/scQYB+cHAiOl8tPfX7y11TKwA==
+XT3mt0mRlBrY32VsZPX+0EoPmHAI4936
+LJS42ZwcpdFDHOAJ30mSrEoPmHAI4936
+LJS42ZwcpdEKOGJCRlOCGEMsG0RZhXWmN5m+Gay4mDc=
+LJS42ZwcpdE7jee3IyQ7GQtqBXZ4E+c/N5m+Gay4mDc=
+7NGKKJN34ogCAZnq4oBF/POj8LtFg+GJ
+Az4+5t1fUEIHBZ5Mnx6yw0oPmHAI4936
+fJTXcZwpB8kt87PJTa1JoRL2525Y8Jlzy4x6AQXguls=
+ndv/6Tbir2Al9SPHO/q0fgLm/EKxWl15
+1/6y3xqeTKfY32VsZPX+0EoPmHAI4936
+wK1sZrL3pJAXtVFp7veb3xL2525Y8Jlzy4x6AQXguls=
+CqFH5cAKYw6qhKm7+HXh+aRDFmbmXXil
+LQrltoM1cpvCE5zi/CJYd0pgEZ36UZf7
+Ol11wPce++vCE5zi/CJYd0pgEZ36UZf7
+w9678/OUZYnSNFr9wNKob/Oj8LtFg+GJ
+RtC8zrx8egrP0mfP1bj7qKFjfApLwKh/N5m+Gay4mDc=
+ERwzEHJFSaSkXYAzJbi62ajv8HiCer8Ay4x6AQXguls=
+ERwzEHJFSaS8RbktMnXXHfOj8LtFg+GJ
+Kr9NpwKWfsKHDjyHip04zlPq3vaS3WGD
+6Oqf3E+UYp2A2FeyW2xavPOj8LtFg+GJ
+/aUJ40q0OGE8js9ij9+tfFl2tDC4Deily4x6AQXguls=
+fkGZhX/El4RpsvPgzA9aB2L6uHlLqsog
+RZ+v/54TrXap58z+jjbwkUpds7npaylHy4x6AQXguls=
+iHNF0shQTZ0i5uPoBbmGy2ksmHFhrajUy4x6AQXguls=
+IzqZUh1jNoW7fEDIh3MPj/Oj8LtFg+GJ
+xjBOWYwtJQIcjhU/Xv96eKyD0xvYLTOLy4x6AQXguls=
+xjBOWYwtJQInz2o+xwX02Whf20/Sfg2Oy4x6AQXguls=
+xjBOWYwtJQInz2o+xwX02cQ6uk/WHcyf6MIva6/KGSO0PZ7rDpYw+g==
+xjBOWYwtJQLNj3osZXWK/wNqyAperh+Gceie1Maa4Hdfzaof9cbYCvOj8LtFg+GJ
+xjBOWYwtJQJRKpnwl88SZLCpTXnOszLxAuqg1HJi1UpPfX7y11TKwA==
+fG3H/eYATNjSNFr9wNKob/Oj8LtFg+GJ
+fG3H/eYATNhSRQKZWsra5zmXZqcwXuLSy4x6AQXguls=
+9WcEVwVcacS0PZ7rDpYw+g==
+5Od2zL01rcmjebsJIc8YlfOj8LtFg+GJ
+NIMkrNyEXQQTkBuMqRoBcqjv8HiCer8Ay4x6AQXguls=
+bL0xvp6bKsyA2FeyW2xavPOj8LtFg+GJ
+OlIufldps163JvJ2Xjm9/UpgEZ36UZf7
+H250ngXCLbRa74IbmJiVRPOj8LtFg+GJ
+v0o/NZ2Flyh0rznFov+n2+fhcFcsFNKYQxxo88aAg3c=
+ILtHucU7b9vwshyLxCfprPOj8LtFg+GJ
+B5DO9dw1D2a7yXAHVflBY0oPmHAI4936
+entKqGlyDvuN/55cHq0j7EiU8imBtrfgy4x6AQXguls=
+REmCvUYOcA6Cg6aQfJfPZkoPmHAI4936
+IRF3FIzGK/WMRJQtxc8R6koPmHAI4936
+Kc1jyiJVnGWx92ImtPG7wALm/EKxWl15
+2gjhNrDt+eeioNaJ2OEJLEoPmHAI4936
+0D2aGEdKA2ZKGV/+gaFbkKf2wJuFXvN5y4x6AQXguls=
+0D2aGEdKA2ZWgHE3Y5h4coemfMvU1eABfER6RG1klik=
+KxlRPOIG9ZstwK0yz09R30oPmHAI4936
+ysFI1Rx/lmayPJEuX5FlVfOj8LtFg+GJ
+BT/fHxNzenBkzZHOvFXHIKf2wJuFXvN5y4x6AQXguls=
+AHJVRVXWVMjbiQGOjO5mmqf2wJuFXvN5y4x6AQXguls=
+AHJVRVXWVMiK6lgP/9Y2oqf2wJuFXvN5y4x6AQXguls=
+LwTctfycqwn1eDN17P0yBwk1seY0eQtCpg10U7yntVtPfX7y11TKwA==
+oJ7KGIaocyBSndz+M2zpG0ffVX1Kx6/gaXBl6wZu5y0=
+46rP4jXWI5nbMhjb7ruRAgLm/EKxWl15
+XXIUiO8imQcnTs9sqqXWpRS4C2VAq+q+Fw5IxUfsdvk=
+XXIUiO8imQfCgbjpU0Ib6VPq3vaS3WGD
+XXIUiO8imQdip1CQWTvLTfOj8LtFg+GJ
+3oeh0L+U9UBZp8LAxcbkMZBwNuVVH6sq
+bpBWCSOn5muOpn2IcS2BfMlK0pFWqtW2CrACxSMFVJ1PfX7y11TKwA==
+ljwmOqHUx3m9FppGobofTZBwNuVVH6sq
+ntKwejfnuA0YgouZt2pykBRGX6dD+yb9qWi9XkUN3uznsKirjKejAUpgEZ36UZf7
++yp7LhPh6/o2wwd3InzQFy4v4ck8itax5kzFRBUU5DACAZnq4oBF/POj8LtFg+GJ
+twznt9msCJOjJuX2eeHASfOj8LtFg+GJ
+oVwjgLWM2luHDjyHip04zrBzljBEfN2xy4x6AQXguls=
+ZMr6bs8Pd9byUEMJR9kTcPOj8LtFg+GJ
+ZMr6bs8Pd9bQ6oLuzbuHdMAyuvLUrV6nwEoaBEGc9RE=
+MWXFwS+gXECVbaq0hPsRvnpmvKAVeqCzRPB+qQ9rdKU=
+MWXFwS+gXEBL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+eYrwlVYgQAsNLBVQVO59LecIVVBHT46ECvyKmpm5Z0Q=
+zm66Ok5YvbJgW+fN9gkOExnMjLDUY5xny4x6AQXguls=
+ocjyg6d/YZbYuiqsh91JVPOj8LtFg+GJ
+C6eysrtIgcAgcxiJCY3Ya7JwOivdSNCn8sfKPfIpMQNPfX7y11TKwA==
+aM6jPf4QFiflc3LHoaCHKTiUnYxvdTs4aAYhz49iPPQ=
+orFEvaQa0+AHI68W/MPHCYZhCmXNWZmGaXBl6wZu5y0=
+orFEvaQa0+DIKZk4XelWJ9S+kgXZKgOPy4x6AQXguls=
+S7N5m+yTVdiTXs+YU4gZf3pmvKAVeqCzRPB+qQ9rdKU=
+39rO+Kxnmjjv3eyoY7qwoXAul+X1XFtHy4x6AQXguls=
+6N8OYQckkzXbjtQVzMQGtVO8SBODgX57y4x6AQXguls=
+/WeDlc4QzvHCE5zi/CJYd0pgEZ36UZf7
+Q+t2NuZi/bYYBYr4xsa99POj8LtFg+GJ
+m7NwXX44/6UMorRxG+mAPKl6skmHW//Gy4x6AQXguls=
+5sZDUmzYHMSQadl/kdNn9Gp3SEzZLUEIXpBSJ5uhUAo=
+4Qvrbb1JTp8Qc5QWoX2eifOj8LtFg+GJ
+m/tIDzJi3OZXUDBIWUrqSK1TqwiA1pre
+S9B++UiCXWUkpVTVLAAIUPOj8LtFg+GJ
+O3P6K+AfRNzF44QHb2ipd8svCgK9hR1bXpBSJ5uhUAo=
+wtKpMto5s6ytv3/3+UBOAUpgEZ36UZf7
+0OYj7bJYGaCbsiqDLJxCRhnMjLDUY5xny4x6AQXguls=
+TEJT79gBm7PDY4PKs+sJ4F/cKgeh02Cpy4x6AQXguls=
+6sLf9oF5/2cFSyaIvrb/N/Oj8LtFg+GJ
+cRBYkFVyJUwqp3pee9AtDUpgEZ36UZf7
+GYBI2zJwMBNey2dyHe3hZWCQBVIqdo0V0pCfO/z5g6Y=
+ynINb2Eqx7SloP32ysnd4UpgEZ36UZf7
+pgzRnG9D+zC0PZ7rDpYw+g==
+Kpq53a0+iGDSNFr9wNKob/Oj8LtFg+GJ
+ky+iLMs6QhG3JvJ2Xjm9/UpgEZ36UZf7
+2Om0H6dKuzbSNFr9wNKob/Oj8LtFg+GJ
+g0zbV1jZvRGV4wuSWx4U26GFuSH/HQxAy4x6AQXguls=
+g0zbV1jZvRG+FqF3alT2MFPq3vaS3WGD
+g0zbV1jZvRG8RbktMnXXHfOj8LtFg+GJ
+XZm6QFzDmJh5QHl4Rg/BHfCvCYF5ZT40y4x6AQXguls=
+/gVNZGSuGULWbJef4vcbmDpK56AtCq0bQE1oNjRzv0A=
+7AFfCdxoVJaez/DwjHv7eCH/h1pywZ5c0pCfO/z5g6Y=
+ycU0RK38xbDLdJNqyw1kxCJCwkfSBhWqy4x6AQXguls=
+pd1F9WAw6p6GsXOp2DRhHxjdGWQl0x5hy4x6AQXguls=
+b8ErQvNUZgeHmDmTzSfyUE7wB8aAVMVRF2Mdrjp/QpU=
+b8ErQvNUZgc8pS//ypC4EUffVX1Kx6/gaXBl6wZu5y0=
+b8ErQvNUZgdfVjmT72+IU0ffVX1Kx6/gaXBl6wZu5y0=
+bKuUJ1epVUJL/UW/zBqattHEM4o6ZCR6y4x6AQXguls=
+bKuUJ1epVULWXIcogNVO9PeK6RLf4xMTy4x6AQXguls=
+bKuUJ1epVUKAB2gzKtqpWrBzljBEfN2xy4x6AQXguls=
+bKuUJ1epVUL/BocxQ/VkHF6uLIHrocIjibzFuc+pkRD0fQTyIpclWA==
+ZVyEsgcvvqkCxwQXdsGm4T/R8tJQvU4AN5m+Gay4mDc=
+a50cHx99OyS+86Rb1W1pEQ==
+WgaH2IFpABYVN9/lDCFFSFqOf3u62uxi
+YC4R/Hqz5OjVS9iZLCqmXZOdTChiEQ4H
+CA9qvj9VlfX4aBmcnHTh+e1sIpk3UltPRPB+qQ9rdKU=
+5thMB8eHe2f/1Gi6u346QEpgEZ36UZf7
+B9uuO07HaYDhefW3q+MscXpmvKAVeqCzRPB+qQ9rdKU=
+jTuQkMDtjykttMlk2S6x6POj8LtFg+GJ
+j5r7gucVUZPSNFr9wNKob/Oj8LtFg+GJ
+pF+/2e5PCdiYv/g0PaK/jL13FBy0uL+iRPB+qQ9rdKU=
+entv5lp5ztG/98RHxldG1vOj8LtFg+GJ
+fHieFygyEvy40Fj+KszbNkoPmHAI4936
+uensoKoCEG0i5wfAwIsXFiyfxx3KDwLB
+xEHYC5PyimNE0MxH/kbINQm+ik3u28cBbhNbzfKkM+JxqUIOvKQ/dwLm/EKxWl15
+xEHYC5PyimPg6njkDcx/a4LXI+MfHNbWfywvCjeRl/T0fQTyIpclWA==
+xEHYC5PyimOQuCgWDzuDNJzjfvzgtybvfywvCjeRl/T0fQTyIpclWA==
+xEHYC5PyimOlLpDXPIWwurSL2LbT/xPdKGYaGfDHL2mUDVAInWSevrOsDNsReNLeRPB+qQ9rdKU=
+MmnONpzqj5b7W3Ekux8q5C73DbanPF9TRccUPCPq9v2crq/MRwHEjUwWBzUGIE3Fy4x6AQXguls=
+VcWnl3ReS/WiJEG5WqIaFPOj8LtFg+GJ
+BcX7V3pTwpetFaNdnKehnD/R8tJQvU4AN5m+Gay4mDc=
+BcX7V3pTwpetFaNdnKehnGbGMFTW030UPIp5tKIseY5ZOr/GQaeSWEpgEZ36UZf7
+bRU8Xd4lWq/dTZAg/dA2ZFgGDQzefWVhjuyKZVVSxxc=
+767F12U7TA7L9/eiOW3PNvOj8LtFg+GJ
+x8Xhf0IsI6jVGlpd50u+NkpgEZ36UZf7
+sPozkzJeO5QUA88Ffjsp4r73AC6YF/AdfywvCjeRl/T0fQTyIpclWA==
+hS36/7wW1bLYQHkH4ek/mxjdGWQl0x5hy4x6AQXguls=
+cgYrEOZbHFKw8mEQdSz4E/Oj8LtFg+GJ
+n4KofNyd2vY4R2AxmSq+I0pgEZ36UZf7
+b8nVx09fy5I4ol1WGH/UYwc35O/wfJWEWhqDUIQPQGM=
+GxXLVwg10cxZKfrHsoPLMnpmvKAVeqCzRPB+qQ9rdKU=
+4CgPGy6SSwl9UjjrSV1dAF/cKgeh02Cpy4x6AQXguls=
+pFdZPuCKzsz5i3FRvU5uBhL2525Y8Jlzy4x6AQXguls=
+sfDdVW5fHlb1trjY76bzOvOj8LtFg+GJ
+NiV9MVLKhXKHDjyHip04zgfkmii5BuyZ+wmNWke18BM=
+pjQ6oNqUNpDNgWyWzjfkBUkSLXgOkKuLYB+cHAiOl8tPfX7y11TKwA==
+2nSar6BjfcOCJKgpiEaOwl/cKgeh02Cpy4x6AQXguls=
+4dmt9tLfxArcemGYPMM4W3M6cjhRvLxgy4x6AQXguls=
+CK6wOt90IerSNFr9wNKob/Oj8LtFg+GJ
+j9TJ0zgrtW3XWx32zET11Xc9lFxBaLeD9RrMjQw02M5PfX7y11TKwA==
+j9TJ0zgrtW0CemFOIJjudWYAKjuUUIzqstNvNKfkPxHtfbwrS7yCE0pgEZ36UZf7
+XsRueZvhAyrZenX/hyHS+gfkmii5BuyZu7hkhPiE07E=
+XsRueZvhAyoY2HrRmU8pmnfPzG5Uk11rstNvNKfkPxHoX8GccRaWYkpgEZ36UZf7
+Y0UYF4M6ChLrfZHpEMHYgUpgEZ36UZf7
+MWehmVZf6C3SNFr9wNKob/Oj8LtFg+GJ
+MWehmVZf6C1SRQKZWsra5zmXZqcwXuLSy4x6AQXguls=
+rWYaShuEwPU8js9ij9+tfFl2tDC4Deily4x6AQXguls=
+6SsNbr0oX/ax7oF3dV8rMlPq3vaS3WGD
+HCEq+yB3xiRUIm92l3iN1WDAN33wOHW69RrMjQw02M5PfX7y11TKwA==
+X6lEFzNDmIp9OfyBOiPDBSJCwkfSBhWqy4x6AQXguls=
+skgWSl8Po0/OnczYMVtnUkiU8imBtrfgy4x6AQXguls=
+QqZvghyTZW3Etpl/UCrmDnNnfPcTejy4aXBl6wZu5y0=
+AEyn6ksEetlWgHE3Y5h4coemfMvU1eABfER6RG1klik=
+R2Qp0UuOuBmx92ImtPG7wALm/EKxWl15
+WEck0+cxgSKioNaJ2OEJLEoPmHAI4936
+06uexQw4y8b+wP1ZSJe0FSJCwkfSBhWqy4x6AQXguls=
+r83+pje9TfVip1CQWTvLTfOj8LtFg+GJ
+IstZUls4S9C0PZ7rDpYw+g==
+Be6thebZitW0PZ7rDpYw+g==
+P6wUpZ7cEfLSNFr9wNKob/Oj8LtFg+GJ
+24DcSkM24SyWrgmkghmdO1Ko6ZZdPmtcIstZUls4S9C0PZ7rDpYw+g==
+24DcSkM24SyfWNoX9a3Od+cIVVBHT46ECvyKmpm5Z0Q=
+vnwU+0qImZgMfYHTbdiqgzafjRHdOXF7kZHZKTLqi55oSc+ICvgEcA==
+Wv0p/PwJHRdip1CQWTvLTfOj8LtFg+GJ
+Wv0p/PwJHRe8RbktMnXXHfOj8LtFg+GJ
+ZWQHTSD6hCvSNFr9wNKob/Oj8LtFg+GJ
+EB1+TmwsWHFLSooFBSheEecIVVBHT46ECvyKmpm5Z0Q=
+fSwdf2OLVVybhnAszwc98POj8LtFg+GJ
+xADmzjZLg26rDnbY10uRMhdFowAX23QPk0YDCbV1OWE=
+Ul8U37ddLmtgUpBCSW/6PxdFowAX23QPk0YDCbV1OWE=
+bIi9Gd5dx4UOvr8fRUm9HQT1tZsHfiBBy4x6AQXguls=
+tQqyk3JtpQRKvIGmSUkp3n8sLwo3kZf09H0E8iKXJVg=
+tQqyk3JtpQQRTjBq75VbAgfkmii5BuyZ+wmNWke18BM=
+tQqyk3JtpQROxwZ9C7+94Qfkmii5BuyZ+wmNWke18BM=
+tQqyk3JtpQTFSvfKUaOFUKvYn9sFOwi1fywvCjeRl/T0fQTyIpclWA==
+tQqyk3JtpQRkcAErkj/nUrOsDNsReNLeRPB+qQ9rdKU=
+tEm/PKNO8d3xYWtd1M6BhPOj8LtFg+GJ
+NyAak/c85ik4bE/6KHjA/hmH3vQ7kTSoXpBSJ5uhUAo=
+rT95lZHuLzm/RoLGcCoeUvOj8LtFg+GJ
+246DAPSPSX+UWPSfdoP5UPOj8LtFg+GJ
+TRi1oeyNUdOyMfjkGshymtHEM4o6ZCR6y4x6AQXguls=
+W0u07doTgmmAgbdnywkvhNHEM4o6ZCR6y4x6AQXguls=
+ubdFc9Fjb2NAHJSgJ0mhqt7SGlS0JFuG
+Thq2mIfRTdi8HjJqAapif7BzljBEfN2xy4x6AQXguls=
+8iRAY6UGp0Zb0ng1o0nHZ/Oj8LtFg+GJ
+ccapIA2Os+Sw7MyLlkc8AN7SGlS0JFuG
+hlmCVY6Y2sCyPJEuX5FlVfOj8LtFg+GJ
+gh+pwxxYTntwBAZHGE82h/Oj8LtFg+GJ
+f9vKvkRJdeDWUpDt6Xr+nkpgEZ36UZf7
+rlgWhYLTdSWdGLiDN2Hnj97SGlS0JFuG
+NxXJMZyQWz+dGLiDN2Hnj97SGlS0JFuG
+HSkrEwRQj92+DupvRV9k9N7SGlS0JFuG
+v0cw1FPyd87WUpDt6Xr+nkpgEZ36UZf7
+asbQtasot/N/NfWlTO+M8g==
+hYF2byblOfrmON+KcZNNZ9oEi1pr5Y8k
+FOjb6eu8wujVGlpd50u+NkpgEZ36UZf7

+ 57 - 4
graph/src/test/java/org/diagbot/graph/CacheFile.java

@@ -6,18 +6,47 @@ import org.diagbot.pub.utils.security.EncrypDES;
 import java.io.FileWriter;
 import java.sql.Connection;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.*;
 
 public class CacheFile {
     public static void main(String[] args) {
         CacheFile cacheFile = new CacheFile();
-        cacheFile.diagClassifyMaping();
+        cacheFile.diagSort();
 
     }
-
+    //疾病 -- 科室
+    public void diagDepartMaping(){
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            EncrypDES encrypDES = new EncrypDES();//加密对象
+            String path = this.getClass().getClassLoader().getResource("").getPath();
+            path = path.substring(0, path.indexOf("target"));
+            String sql = "SELECT k1.lib_name diag_name, k2.lib_name dept_name FROM kl_concept_common kcc, kl_concept k1, kl_concept k2 " +
+                    "where kcc.concept_id = k1.id and kcc.dept_id = k2.id " +
+                    "and k1.lib_type = 18 and kcc.dept_id  is not null";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            List<Map.Entry<String, String>> libaryList = rsToMap(rs, true);
+            FileWriter fw = new FileWriter(path + "src/main/resources/doc_result_mapping_diag.dict");
+            for (Map.Entry<String, String> entry : libaryList) {
+                fw.write(encrypDES.encrytor(entry.getKey() + "|" + entry.getValue()));
+                fw.write("\n");
+            }
+            fw.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
     //疾病分类归一
     public void diagClassifyMaping(){
-        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8");
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
         Connection conn = nlpJdbc.connect();
         Statement st = null;
         ResultSet rs = null;
@@ -46,7 +75,7 @@ public class CacheFile {
     }
     //诊断大小类对应
     public void diagSort(){
-        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/bigdata-web?useUnicode=true&characterEncoding=UTF-8");
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
         Connection conn = nlpJdbc.connect();
         Statement st = null;
         ResultSet rs = null;
@@ -169,4 +198,28 @@ public class CacheFile {
             nlpJdbc.close(rs, st, conn);
         }
     }
+
+    private List<Map.Entry<String, String>> rsToMap(ResultSet rs, boolean isJoin) throws SQLException {
+        String r1 = "";
+        String r2 = "";
+        Map<String, String> libraryMap = new HashMap<>(10);
+        while (rs.next()) {
+            r1 = rs.getString(1);
+            r2 = rs.getString(2);
+            if (libraryMap.get(r1) == null) {
+                libraryMap.put(r1, r2);
+            } else if (isJoin && libraryMap.get(r1) != null) {
+                libraryMap.put(r1, libraryMap.get(r1) + "," + r2);
+            }
+        }
+
+        List<Map.Entry<String, String>> libraryList = new ArrayList<Map.Entry<String, String>>(libraryMap.entrySet());
+        Collections.sort(libraryList, new Comparator<Map.Entry<String, String>>() {
+            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
+                return o1.getKey().compareTo(o2.getKey());
+            }
+        });
+
+        return libraryList;
+    }
 }

+ 7 - 5
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -147,11 +147,13 @@ public class AlgorithmController extends BaseController {
             //把所有的诊断拿出来经过过滤层过滤
             ClassifyDiag classifyDiag = new ClassifyDiag();
             List<FeatureRate> upfes = classifyDiag.filterDiag(graphResponseData, graphFeatureRates);
-            List<FeatureRate> classifyFeature = classifyDiag.diagClassify(upfes);
-            FilterSortDiag filterSortDiag = new FilterSortDiag();
-            List<FeatureRate> filterDiagList = filterSortDiag.filterDiag(graphResponseData, graphFeatureRates);
-            List<FeatureRate> filterSortDiagList = filterSortDiag.sortDiag(filterDiagList);
-            bigDataResponseData.setDis(filterSortDiagList);
+            List<FeatureRate> classify = classifyDiag.diagClassify(upfes);
+            List<FeatureRate> featureRates = classifyDiag.sortDiag(classify);
+//            List<FeatureRate> classifyFeature = classifyDiag.diagClassify(upfes);
+//            FilterSortDiag filterSortDiag = new FilterSortDiag();
+//            List<FeatureRate> filterDiagList = filterSortDiag.filterDiag(graphResponseData, graphFeatureRates);
+//            List<FeatureRate> filterSortDiagList = filterSortDiag.sortDiag(filterDiagList);
+            bigDataResponseData.setDis(featureRates);
         }
         //推送出的诊断信息作为参数传入知识图谱
         List<FeatureRate> pushDiags = new ArrayList<>();