自动化立体仓库 - WCS系统
Junjie
2023-03-25 74ad7a9d22bd4f2aba8967437660da5ff5041e6b
A*寻路算法
7个文件已添加
2570 ■■■■■ 已修改文件
src/main/java/com/zy/common/model/NavigateNode.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateMapData.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigatePositionConvert.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateSolution.java 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/NavigateUtils.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapIn.json 2052 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapOut.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/NavigateNode.java
New file
@@ -0,0 +1,47 @@
package com.zy.common.model;
import lombok.Data;
/**
 * A*寻路算法Node节点
 */
@Data
public class NavigateNode implements Comparable<NavigateNode>{
    private int x;//坐标x
    private int y;//坐标y
    private int F;//综合花费的步数
    private int G;//已经花费的步数
    private int H;//将要花费的步数
    private NavigateNode Father;//父节点
    private Boolean isInflectionPoint;//是否为拐点
    private String direction;//拐点方向
    public NavigateNode(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //通过结点的坐标和目标结点的坐标可以计算出F, G, H三个属性
    //需要传入这个节点的上一个节点和最终的结点
    public void init_node(NavigateNode father, NavigateNode end) {
        this.Father = father;
        if (this.Father != null) {
            //走过的步数等于父节点走过的步数加一
            this.G = father.G + 1;
        } else { //父节点为空代表它是第一个结点
            this.G = 0;
        }
        //以下计算方案为算法原始方案,没有去拐点方案。已被Solution计算时自动覆盖。
        //计算通过现在的结点的位置和最终结点的位置计算H值(曼哈顿法:坐标分别取差值相加)
        this.H = Math.abs(this.x - end.x) + Math.abs(this.y - end.y);
        this.F = this.G + this.H;
    }
    @Override
    public int compareTo(NavigateNode o) {
        return Integer.compare(this.F, o.F);
    }
}
src/main/java/com/zy/common/utils/NavigateMapData.java
New file
@@ -0,0 +1,66 @@
package com.zy.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.util.ArrayList;
/**
 * A*算法地图获取类
 */
public class NavigateMapData {
    public int[][] getData() {
        return getData("in");
    }
    public int[][] getData(String mapType) {
        try {
            String mapFilename = "";
            if (mapType.equals("in")) {
                mapFilename = "mapIn.json";
            }else {
                mapFilename = "mapOut.json";
            }
            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//获取文件路径
            File file = new File(fileName);
            StringBuffer stringBuffer = new StringBuffer();
            if (file.isFile() && file.exists()) {
                InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
                BufferedReader br = new BufferedReader(isr);
                String lineTxt = null;
                while ((lineTxt = br.readLine()) != null) {
                    stringBuffer.append(lineTxt);
                }
                br.close();
                //解析json地图数据
                ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
                int[][] map = new int[arrayList.size()][];
                int j = 0;
                for (Object obj : arrayList) {
                    ArrayList list = JSON.parseObject(obj.toString(), ArrayList.class);
                    int[] tmp = new int[list.size()];
                    int i = 0;
                    for (Object o : list) {
                        JSONObject jsonObject = JSON.parseObject(o.toString());
                        //将数据添加进二维数组
                        tmp[i++] = Integer.parseInt(jsonObject.get("value").toString());
                    }
                    //数据添加进一维数组
                    map[j++] = tmp;
                }
                return map;
            } else {
                System.out.println("文件不存在!");
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
        return null;
    }
}
src/main/java/com/zy/common/utils/NavigatePositionConvert.java
New file
@@ -0,0 +1,31 @@
package com.zy.common.utils;
/**
 * 库位编号和A*算法的xy轴转换工具类
 */
public class NavigatePositionConvert {
    //坐标编号转xy轴
    public static int[] positionToXY(String position) {
        int col = Integer.parseInt(position.substring(0, 2));
        int row = Integer.parseInt(position.substring(2, 5));
        int[] newPosition = coverPosition(col,row);
        //返回x和y
//        return new int[]{row, col};
        return newPosition;
    }
    //转换行号,实际中最底层可能是第一行,在数组中最底层是最后一行,因此需要进行转换才可以匹配数据
    public static int covertRow(int row) {
        NavigateMapData mapData = new NavigateMapData();
        int[][] data = mapData.getData();
        //实际行数
        int realRow = data.length - 1;
        return realRow - row;
    }
    public static int[] coverPosition(int col,int row) {
        return new int[]{row, col};
    }
}
src/main/java/com/zy/common/utils/NavigateSolution.java
New file
@@ -0,0 +1,212 @@
package com.zy.common.utils;
import com.zy.common.model.NavigateNode;
import java.util.ArrayList;
import java.util.PriorityQueue;
/**
 * A*算法实现类
 */
public class NavigateSolution {
    // -1 -> 墙壁, 1 -> 起点  2 -> 终点  3-> 母轨  4->站点
    int[][] map = {{}};
    public NavigateSolution() {
        //载入地图
        NavigateMapData mapData = new NavigateMapData();
        int[][] data = mapData.getData();
        this.map = data;
    }
    public NavigateSolution(String mapType) {
        //载入地图
        NavigateMapData mapData = new NavigateMapData();
        int[][] data = mapData.getData(mapType);
        this.map = data;
    }
    public NavigateSolution(int[][] data) {
        this.map = data;
    }
    // Open表用优先队列
    public PriorityQueue<NavigateNode> Open = new PriorityQueue<NavigateNode>();
    //Close表用普通的数组
    public ArrayList<NavigateNode> Close = new ArrayList<NavigateNode>();
    //Exist表用来存放已经出现过的结点。
    public ArrayList<NavigateNode> Exist = new ArrayList<NavigateNode>();
    public NavigateNode astarSearch(NavigateNode start, NavigateNode end) {
        //把第一个开始的结点加入到Open表中
        this.Open.add(start);
        //把出现过的结点加入到Exist表中
        this.Exist.add(start);
        //主循环
        while (Open.size() > 0) {
            //取优先队列顶部元素并且把这个元素从Open表中删除
            NavigateNode current_node = Open.poll();
            //将这个结点加入到Close表中
            Close.add(current_node);
            //对当前结点进行扩展,得到一个四周结点的数组
            ArrayList<NavigateNode> neighbour_node = extend_current_node(current_node);
            //对这个结点遍历,看是否有目标结点出现
            for (NavigateNode node : neighbour_node) {
                // G + H + E (对启发函数增加去拐点方案calcNodeExtraCost)
                int gCost = calcNodeCost(current_node, node) * calcNodeExtraCost(current_node, node, end);
                if (node.getX() == end.getX() && node.getY() == end.getY()) {//找到目标结点就返回
                    //init_node操作把这个邻居结点的父节点设置为当前结点
                    //并且计算出G, F, H等值
                    node.init_node(current_node, end);
                    return node;
                }
                //(对启发函数增加去拐点方案calcNodeExtraCost)
                if (is_exist(node)) {
                    if (gCost < node.getG()) {
                        node.setFather(current_node);
                        node.setG(gCost);
                        node.setF(node.getG() + node.getH());
                    }
                }else {
                    //没出现过的结点加入到Open表中并且设置父节点
                    //进行计算对G, F, H 等值
                    node.init_node(current_node, end);
                    node.setG(gCost);
                    node.setH(calcNodeCost(node, end));
                    node.setF(node.getG() + node.getH());
                    Open.add(node);
                    Exist.add(node);
                }
            }
        }
        //如果遍历完所有出现的结点都没有找到最终的结点,返回null
        return null;
    }
    public ArrayList<NavigateNode> extend_current_node(NavigateNode current_node) {
        //获取当前结点的x, y
        int x = current_node.getX();
        int y = current_node.getY();
        //如果当前结点的邻结点合法,就加入到neighbour_node
        ArrayList<NavigateNode> neighbour_node = new ArrayList<NavigateNode>();
//        if (map[x][y] == 0 || map[x][y] == 3) {
//            //只有子轨和母轨才能进行左右移动
//            if (is_valid(x, y + 1))
//            {
//                Node node = new Node(x, y + 1);
//                neighbour_node.add(node);
//            }
//            if (is_valid(x, y - 1))
//            {
//                Node node = new Node(x, y - 1);
//                neighbour_node.add(node);
//            }
//        }
//
//        if (map[x][y] == 3) {
//            //只有母轨才能进行上下移动
//            if (is_valid(x + 1, y))
//            {
//                Node node = new Node(x + 1, y);
//                neighbour_node.add(node);
//            }
//            if (is_valid(x - 1, y))
//            {
//                Node node = new Node(x -1, y);
//                neighbour_node.add(node);
//            }
//        }
        if (map[x][y] == 3) {
            //母轨才能进行左右移动
            if (is_valid(x, y + 1))
            {
                NavigateNode node = new NavigateNode(x, y + 1);
                neighbour_node.add(node);
            }
            if (is_valid(x, y - 1))
            {
                NavigateNode node = new NavigateNode(x, y - 1);
                neighbour_node.add(node);
            }
        }
        if (map[x][y] == 0 || map[x][y] == 3) {
            //子轨和母轨才能进行上下移动
            if (is_valid(x + 1, y))
            {
                NavigateNode node = new NavigateNode(x + 1, y);
                neighbour_node.add(node);
            }
            if (is_valid(x - 1, y))
            {
                NavigateNode node = new NavigateNode(x -1, y);
                neighbour_node.add(node);
            }
        }
        return neighbour_node;
    }
    public boolean is_valid(int x, int y) {
        // 如果结点的位置小于0,则不合法
        if (map[x][y] < 0) return false;
        for (NavigateNode node : Exist) {
            //如果结点出现过,不合法
            if (node.getX() == x && node.getY() == y) {
                return false;
            }
            if (is_exist(new NavigateNode(x, y))) {
                return false;
            }
        }
        //以上情况都没有则合法
        return true;
    }
    public boolean is_exist(NavigateNode node)
    {
        for (NavigateNode exist_node : Exist) {
            if (node.getX() == exist_node.getX() && node.getY() == exist_node.getY()) {
                return true;
            }
        }
        return false;
    }
    //------------------A*启发函数------------------//
    //计算通过现在的结点的位置和最终结点的位置计算H值(曼哈顿法:坐标分别取差值相加)
    private int calcNodeCost(NavigateNode node1, NavigateNode node2) {
        return Math.abs(node2.getX() - node1.getX()) + Math.abs(node2.getY() - node1.getY());
    }
    //去除拐点算法,给直线增加优先级
    private int calcNodeExtraCost(NavigateNode currNode, NavigateNode nextNode, NavigateNode endNode) {
        // 第一个点或直线点
        if (currNode.getFather() == null || nextNode.getX() == currNode.getFather().getX()
                || nextNode.getY() == currNode.getFather().getY()) {
            return 0;
        }
        // 拐向终点的点
        if (nextNode.getX() == endNode.getX() || nextNode.getY() == endNode.getY()) {
            return 1;
        }
        // 普通拐点
        /*
        拐点判断逻辑
        拿到父节点和下一节点
        通过判断父节点和下一节点的x数据和y数据都不相同时,则表明当前坐标是一个拐点
         */
        return 2;
    }
    //------------------A*启发函数-end------------------//
}
src/main/java/com/zy/common/utils/NavigateUtils.java
New file
@@ -0,0 +1,161 @@
package com.zy.common.utils;
import com.zy.common.model.NavigateNode;
import java.util.*;
/**
 * A*算法使用工具
 */
public class NavigateUtils {
    public static List<NavigateNode> calc(String startPoint, String endPoint, String mapType) {
        //通过开始编号和结束编号获取对应的xy轴坐标
        int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//开始节点
        int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//结束节点
        //初始化开始节点
        NavigateNode start = new NavigateNode(startArr[0], startArr[1]);
        //开始节点无父节点
        start.setFather(null);
        NavigateNode end = new NavigateNode(endArr[0], endArr[1]);
        NavigateSolution solution = new NavigateSolution(mapType);
        NavigateNode res_node = solution.astarSearch(start, end);
        if (res_node == null) {
            System.out.println("未找到路径");
            return null;
        } else {
            ArrayList<NavigateNode> list = new ArrayList<>();
            //渲染
            NavigateNode fatherNode = null;//当前循环上一节点,用于拐点计算
            while (res_node != null) {
                HashMap<String, Object> data = new HashMap<>();
                res_node.setDirection(null);
                res_node.setIsInflectionPoint(false);
                //寻找拐点
                HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//分别传入当前节点、父节点、下一节点
                //判断当前节点是否为拐点
                if (Boolean.parseBoolean(result.get("result").toString())) {
                    //当前为拐点
                    res_node.setIsInflectionPoint(true);
                    //拐点方向
                    res_node.setDirection(result.get("direction").toString());
                }
                list.add(res_node);
                fatherNode = res_node;//把当前节点保存成一个父节点
                res_node = res_node.getFather();//迭代操作
            }
            Collections.reverse(list);
            //将每个节点里面的fatherNode至为null(方便后续计算时父节点过多导致显示的节点太多)
            for (NavigateNode navigateNode : list) {
                //父节点设置为null,不影响计算结果,不影响后续操作。
                //此操作仅为后续排查处理提供视觉方便。
                navigateNode.setFather(null);
            }
            //起始节点计算方向
            String direction = calcDirection(list.get(0), list.get(1));
            NavigateNode startNode = list.get(0);
            startNode.setDirection(direction);
            //更新节点列表
            list.set(0, startNode);
            return list;
        }
    }
    //判断当前节点到下一个节点是否为拐点
    public static HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("result", false);//是否为拐点,true:拐点,false:直线
        // 第一个点或直线点
        if (fatherNode == null || nextNode == null || nextNode.getX() == fatherNode.getX() || nextNode.getY() == fatherNode.getY()) {
            return map;//不是拐点直接返回
        }
        //拐点方向
        String direction = calcDirection(currentNode, fatherNode);
        map.put("result", true);//拐点
        map.put("direction", direction);//拐点方向(从当前节点视角看的方向)
        return map;
    }
    /**
     * 计算方向
     */
    public static String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
        //拐点方向
        String direction = "";
        // 普通拐点
        //计算拐点方向
        if (fatherNode.getX() != currentNode.getX()) {
            //x轴数据有差异,判断x轴方向
            //当前节点X - 父节点X
            if (currentNode.getX() - fatherNode.getX() > 0) {
                //大于0,方向top
                direction = "top";
            }else {
                //小于0,方向bottom
                direction = "bottom";
            }
        }
        if (fatherNode.getY() != currentNode.getY()) {
            //y轴数据有差异,判断y轴方向
            //当前节点Y - 父节点Y
            if (currentNode.getY() - fatherNode.getY() > 0) {
                //大于0,方向left
                direction = "left";
            }else {
                //小于0,方向right
                direction = "right";
            }
        }
        return direction;
    }
    /**
     * 获取分段路径,每当有一个拐点则进行一次分段,最终返回总分段数据
     */
    public static ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) {
        ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>();
        ArrayList<NavigateNode> data = new ArrayList<>();
        for (NavigateNode mapNode : mapList) {
            boolean isInflectionPoint = mapNode.getIsInflectionPoint();
            data.add(mapNode);
            if (isInflectionPoint) {
                //拐点
                //分割数据
                list.add(data);//添加某一段数据
                data = new ArrayList<>();
            }
        }
        //将最后一段数据添加进入
        list.add(data);
        return list;
    }
    public static void main(String[] args) {
        //计算路径
        List<NavigateNode> calc = calc("1000901", "0201801", "out");
        System.out.println(calc);
        System.out.println("------------------------");
//        List<NavigateNode> calc = calc("0501401", "0201801", "out");
        //将路径分割成多段
        ArrayList<ArrayList<NavigateNode>> data = getSectionPath(calc);
        for (ArrayList<NavigateNode> list : data) {
            System.out.println(list);
        }
    }
}
src/main/resources/mapIn.json
New file
@@ -0,0 +1,2052 @@
[
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -23,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -22,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -21,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -20,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -19,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -18,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -17,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -16,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -15,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -14,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": -13,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -12,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -11,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -10,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 4,
    "data": "100"
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -9,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 4,
    "data": "104"
  }, {
    "value": 4,
    "data": "101"
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -8,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 4,
    "data": "103"
  }, {
    "value": 4,
    "data": "102"
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -7,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 4,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -6,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": 3,
    "data": ""
  }, {
    "value": -5,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -4,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -3,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -2,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": 0,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }],
  [{
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }, {
    "value": -1,
    "data": ""
  }]
]
src/main/resources/mapOut.json
New file
@@ -0,0 +1 @@
[[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-23,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-22,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-21,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-20,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-19,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-18,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-17,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-16,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-15,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-14,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":-1,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-12,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-11,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-10,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":4,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-9,"data":""}],[{"value":-1,"data":""},{"value":4,"data":""},{"value":4,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-8,"data":""}],[{"value":-1,"data":""},{"value":4,"data":""},{"value":4,"data":""},{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-7,"data":""}],[{"value":-1,"data":""},{"value":0,"data":""},{"value":4,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-6,"data":""}],[{"value":-1,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":3,"data":""},{"value":-5,"data":""}],[{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-4,"data":""}],[{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-3,"data":""}],[{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-2,"data":""}],[{"value":-1,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":0,"data":""},{"value":-1,"data":""}],[{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""},{"value":-1,"data":""}]]