参考 下面这个网站的效果 这个网站请求的资源是通过url 来获取到不同的数据 d3.json()
https://www.blockchain.com/zh/btc/tree/417539848
转自:
https://www.cnblogs.com/wanyong-wy/p/7603123.html
https://www.cnblogs.com/quyixuanblog/p/5754129.html
https://blog.csdn.net/songqiang2011/article/details/86521194
https://blog.csdn.net/lzhlzz/article/details/38561737
https://www.jianshu.com/p/909a241acfdd
https://www.jianshu.com/p/6ef01845854f
https://blog.csdn.net/loveljy_19901114/article/details/81530222
http://www.cleey.com/blog/single/id/705.html
有 bug
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>3</title>
<script src="https://d3js.org/d3.v3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
body,html{
width: 100%;
height: 100%;
margin:0;
box-sizing: border-box;
overflow: hidden;
}
.node {
cursor: pointer;
}
.node circle {
fill: none;
stroke: #fff;
stroke-width: 1.5px;
}
.node text {
font: 10px sans-serif;
}
.link{
fill:none;
stroke:#ccc;
stroke-width: 1.5px;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 1.5px;
}
.tree{
height: 100%;
margin: 0 auto;
background: #E0E0E0;
box-sizing: border-box;
}
.tree svg{
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div class="tree" id="tree">
</div>
<!--<svg class="chart"></svg>-->
<script>
window.onload = function () {
var width = document.getElementById("tree").offsetWidth;
// var height = document.getElementById("tree").scrollHeight;
var height = 600;
// var height = document.body.offsetHeight;
treeInit( width, height);
}
</script>
<script type="text/javascript">
//位置参数
function treeInit(width,height){
var i = 0,
duration = 750,
root;
var tree = d3.layout.tree()
.size([height, width]);
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
var zoom = d3.behavior.zoom().scaleExtent([0.1, 100]).on("zoom", zoomed);//添加放大缩小事件
var svg = d3.select("body").select("#tree").append("svg")
.call(zoom)//给svg绑定zoom事件
.append("g")
.call(zoom)//给g绑定zoom事件
.append("g")
.attr("transform", "translate(50, 0)");
d3.json("tree.json", function(error, flare) {
// 根节点和位置
root = flare;
root.x0 = height / 2;
root.y0 = 0;
//(1) 折叠函数,递归调用,有子孙的就把children(显示)给_children(不显示)暂存,便于折叠,删掉这段就会展开全部数据
function collapse(d) {
if (d.children) {
// console.log(d);
d._children = d.children;
d._children.forEach(collapse);
d.children = null;
}
}
// 折叠根节点的每个孩子
root.children.forEach(collapse);
// 折叠之后要重绘
update(root);
});
function zoomed() {
svg.attr("transform",
"translate(" + zoom.translate() + ")" +
"scale(" + zoom.scale() + ")"
);
}
// }
// getRoot();
//(2) 更新布局
function update(source) {
// console.log(source)
// console.log(source.children.length);
// $("svg").width(depth*a);
// $("svg").height(300*b);
// (2-1) 计算新树的布局
var nodes = tree.nodes(root).reverse(),
links = tree.links(nodes);
// (2-2) 树的深度这里树d.y。树的宽度最大720,要分四层,所以每层就乘180
nodes.forEach(function(d) {
d.y = d.depth * 180;// 树的x,y倒置了,所以这里Y其实是横向的
});
// (2-3) 数据连接,根据id绑定数据
var node = svg.selectAll("g.node")
.data(nodes, function(d) {
return d.id //最初新点开的节点都没有id
|| (d.id = ++i); //为没有id的节点添加上ID
});
// (2-4) 点击时增加新的子节点
var nodeEnter = node.enter().append("g")
.attr("class", "node")
.attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
.on("click", click);
nodeEnter.append("circle")
.attr("r", 1e-6)
.style("fill", function(d) { return d._children ? "#f00" : "#fff"; });
nodeEnter.append("text")
.attr("x", function(d) { return d.children || d._children ? 50 : 30; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
.text(function(d) { return d.name; })
.style("fill-opacity", 1)
.style("font-size", "12px");
nodeEnter.append("text")
.attr("x",function (d) {return d.children || d._children ? 20 : 0;})
.attr("y",function (d) {return d.children || d._children ? 25 : 20;})
.attr("dy",".35em")
.attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
.text(function(d){return d.name})
.style("fill-opacity", 1)
.style("font-size", "12px");
// (2-5) 原有节点更新到新位置
var nodeUpdate = node.transition()
.duration(duration)
.attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; });
nodeUpdate.select("circle")
.attr("r", 4.5)
.attr("r", function(d) { return d._children ? "10" : "5"; })
.style("fill", function(d) { return d._children ? "#f00" : "#f90"; });
nodeUpdate.select("text")
.style("fill-opacity", 1);
// (2-6) 折叠节点的子节点收缩回来
var nodeExit = node.exit().transition()
.duration(duration)
.attr("transform", function(d) {
return "translate(" + source.y + "," + source.x + ")";
})
.remove();
nodeExit.select("circle")
.attr("r", 1e-6);
nodeExit.select("text")
.style("fill-opacity", 1);
// (2-7) 数据连接,根据目标节点的id绑定数据
var link = svg.selectAll("path.link")
.data(links, function(d) { return d.target.id; });
// (2-8) 增加新连接
link.enter().insert("path", "g")
.attr("class", "link")
.attr("d", function(d) {
var o = {x: source.x0, y: source.y0};
return diagonal({source: o, target: o});
});
// (2-9) 原有连接更新位置
link.transition()
.duration(duration)
.attr("d", diagonal);
// (2-10) 折叠的链接,收缩到源节点处
link.exit().transition()
.duration(duration)
.attr("d", function(d) {
var o = {x: source.x, y: source.y};
return diagonal({source: o, target: o});
})
.remove();
// 把旧位置存下来,用以过渡
nodes.forEach(function(d) {
d.x0 = d.x;
d.y0 = d.y;
});
}
// (3) 切换折叠与否
function click(d) {
if (d.children) {
d._children = d.children;
d.children = null;
} else {
d.children = d._children;
d._children = null;
}
update(d);// 重新渲染
}
}
</script>
</body>
</html>
{
"name":"中国",
"children":
[
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"广西" ,
"children":
[
{
"name":"桂林",
"children":
[
{"name":"秀峰区"},
{"name":"叠彩区"},
{"name":"象山区"},
{"name":"七星区"},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
}
]
},
{"name":"南宁"},
{"name":"柳州"},
{"name":"防城港"},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
}
]
},
{
"name":"黑龙江",
"children":
[
{"name":"哈尔滨"},
{"name":"齐齐哈尔"},
{"name":"牡丹江"},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"大庆"},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
}
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"浙江" ,
"children":
[
{"name":"杭州",
"children":[
{"name":"宁波",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"宁波",
"children":[
{"name":"温州",
"children":[
{"name":"温州",
"children":[
{"name":"温州" },
{"name":"绍兴" }
]},
{"name":"绍兴" }
]},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"绍兴" }
]
},
{"name":"温州" },
{"name":"绍兴" }
]
},
{"name":"温州" }
]
},
{"name":"宁波" },
{"name":"温州" },
{"name":"绍兴" }
]
},
{
"name":"新疆" ,
"children":
[
{"name":"乌鲁木齐"},
{"name":"克拉玛依"},
{"name":"吐鲁番"},
{"name":"哈密"}
]
}
]
}