
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
                /* background-image: url(old_mathematics.png); */
                /* background-repeat: repeat; */
            }
        </style>
        <div id="main"></div>
        <script>
            var chart;
            require([
                'echarts'
            ], function (echarts) {

                chart = echarts.init(document.getElementById('main'), null, {
                    // renderer: 'svg'
                });

                var item1 = {
                    color: '#F54F4A'
                };
                var item2 = {
                    color: '#FF8C75'
                };
                var item3 = {
                    color: '#FFB499'
                };

                var data = [{
                    children: [{
                        value: 5,
                        children: [{
                            value: 1,
                            itemStyle: item1
                        }, {
                            value: 2,
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }, {
                            children: [{
                                value: 1
                            }]
                        }],
                        itemStyle: item1
                    }, {
                        value: 10,
                        children: [{
                            value: 6,
                            children: [{
                                value: 1,
                                itemStyle: item1
                            }, {
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item2
                            }, {
                                value: 1
                            }],
                            itemStyle: item3
                        }, {
                            value: 2,
                            children: [{
                                value: 1
                            }],
                            itemStyle: item3
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }],
                        itemStyle: item1
                    }],
                    itemStyle: item1
                }, {
                    value: 9,
                    children: [{
                        value: 4,
                        children: [{
                            value: 2,
                            itemStyle: item2
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item1
                            }]
                        }],
                        itemStyle: item1
                    }, {
                        children: [{
                            value: 3,
                            children: [{
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item2
                            }]
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item2
                }, {
                    value: 7,
                    children: [{
                        children: [{
                            value: 1,
                            itemStyle: item3
                        }, {
                            value: 3,
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }, {
                                value: 1
                            }],
                            itemStyle: item2
                        }, {
                            value: 2,
                            children: [{
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item1
                            }],
                            itemStyle: item1
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item1
                }, {
                    children: [{
                        value: 6,
                        children: [{
                            value: 1,
                            itemStyle: item2
                        }, {
                            value: 2,
                            children: [{
                                value: 2,
                                itemStyle: item2
                            }],
                            itemStyle: item1
                        }, {
                            value: 1,
                            itemStyle: item3
                        }],
                        itemStyle: item3
                    }, {
                        value: 3,
                        children: [{
                            value: 1,
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }, {
                            value: 1
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item1
                }];

                chart.setOption({
                    series: {
                        radius: ['15%', '80%'],
                        type: 'sunburst',
                        sort: null,
                        highlightPolicy: 'ancestor',
                        data: data,
                        label: {
                            normal: {
                                rotate: 'radial'
                            }
                        },
                        levels: [],
                        itemStyle: {
                            normal: {
                                color: '#ddd',
                                borderWidth: 2
                            }
                        }
                    }
                });
            });

        </script>
    </body>
</html>
